のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,646,125人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.122 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
501 : Name_Not - 2015/01/30(金) 09:17:08.38 ID:???.net (+57,+29,-1)
キチンと理由があります、調べましょう。
502 : Name_Not - 2015/01/30(金) 10:37:58.75 ID:???.net (+9,-30,-72)
ブラウザで対応してないapiを使う時どっちの書き方がいいですか
if ("a" in window) {alert("未対応");}

if (!"a" in window) {alert("未対応"):}

もしくはこれこれ以外で良い方法を教えてください
503 : Name_Not - 2015/01/30(金) 11:21:14.56 ID:???.net (+14,-29,-3)
>>500
うん。かわった。
今は </body>の直前に入れるのが多い。
504 : Name_Not - 2015/01/30(金) 11:31:54.99 ID:???.net (+11,-11,-4)
実行タイミングの問題だよなw
505 : Name_Not - 2015/01/30(金) 11:39:42.98 ID:???.net (-6,-29,-4)
<head>
</head>

<body>
</body>

<foot>
</foot>

↑これを作るべきだった
506 : Name_Not - 2015/01/30(金) 16:03:45.51 ID:???.net (+4,-30,-79)
>>502
状況に応じて typeof 演算子と Object.prototype.hasOwnProperty を使い分けてください。

> if (!"a" in window) {alert("未対応"):}
これは false in window と同義であり、期待通りに動作しません。
507 : 503 - 2015/01/30(金) 16:08:04.83 ID:???.net (+3,-30,-66)
追記。
それがオブジェクトであるならば、Object.prototype.toString.call で [[Class]] 判定する事も検討して下さい。
それが配列であるならば、Array.isArray を使用して下さい。
それが関数であるならば、それ自身を call する事によって関数以外で TypeError の例外を返すことを検討して下さい。
508 : Name_Not - 2015/01/30(金) 16:27:55.40 ID:???.net (+43,-30,-143)
>>500
script要素の読み込み中はDOM構築が停止する為、DOM構築速度を上げる為にscript要素をbody直前に持って行く事があります。
勿論、head要素までの読み込みで実行可能なタイミングであればhead要素内で完結すべきですが。
http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0006

例外として script[defer], script[async] を使用すれば、head要素内にscript要素を置いてもDOM構築を妨げません。
これらは対応ブラウザの制限がある為、対象ブラウザを踏まえて使用を検討する必要があります。
http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0008
http://caniuse.com/#feat=script-defer
http://caniuse.com/#feat=script-async
509 : 497 - 2015/01/30(金) 21:06:31.95 ID:???.net (+7,-29,-40)
ありがとうございました
headに書いたものはbodyより前に読み込まれるので
bodyを表示してから実行したいものはbodyの後ろに書け、ということのようですね
するとheadに書けでもbodyに書けでもなく、必要に応じて分けて書けが正解でしょうか?
510 : Name_Not - 2015/01/30(金) 21:07:54.79 ID:???.net (+62,+29,-12)
>>508
見逃していました
詳しくありがとうございます
511 : Name_Not - 2015/01/30(金) 21:09:36.52 ID:???.net (-1,-30,-20)
>>509

<bod>の前でも後ろでもなくて、
</body>の直前な。

<body> ~ながい本文~ <script></script></body> こうな。

</body>の後ろにはscript書けねーから
512 : Name_Not - 2015/01/30(金) 21:10:17.10 ID:???.net (+57,+29,-31)
タグの話のどこがJavaScript?
関係ない話をするなら別スレに行けよ
513 : Name_Not - 2015/01/30(金) 21:21:27.31 ID:???.net (+55,+28,-2)
ネタで言ってるんだよな?
514 : Name_Not - 2015/01/30(金) 21:55:09.15 ID:???.net (+43,-29,-37)
>>513
ECMAScriptの仕様書のどこに
タグのことが書いてある?

このスレで質問していいのは
ECMAScriptの仕様書の範囲内だけだ
515 : Name_Not - 2015/01/30(金) 21:58:45.11 ID:???.net (+51,+28,-2)
ネタで言ってるんだよな?
516 : Name_Not - 2015/01/30(金) 21:59:10.21 ID:???.net (+47,+29,-1)
勝手に決めるな
517 : Name_Not - 2015/01/30(金) 22:07:33.43 ID:???.net (-8,-29,-6)
>>514
ここはJavaScriptスレ
ESの話題に限定したいなら>>2のECMAScriptスレに行ったら?
518 : Name_Not - 2015/01/30(金) 22:08:03.68 ID:???.net (+83,+29,-2)
>>514
さすがにうざすぎる
お前が失せろ
519 : Name_Not - 2015/01/30(金) 22:08:07.29 ID:???.net (+54,+26,-1)
Web制作板で何を言ってるんだって感じだな。
521 : Name_Not - 2015/01/31(土) 00:33:24.04 ID:???.net (+31,-29,-17)
ES6 の Map って便利だね
Iterator の仕様が難読だけど、どこかに日本語資料ってないのかな
522 : Name_Not - 2015/01/31(土) 12:22:13.92 ID:???.net (+96,+29,-18)
>>521
自分で実装すればいいだけなんだから
そんなのいらんだろ。
523 : Name_Not - 2015/01/31(土) 13:44:20.55 ID:???.net (-16,-12,-16)
lodashを使えばいいだけじゃね?
524 : Name_Not - 2015/01/31(土) 13:56:17.61 ID:???.net (-1,-29,-22)
lodashってes6のMapもあったのか
優秀だな
525 : Name_Not - 2015/01/31(土) 14:50:57.57 ID:???.net (+70,+29,-28)
>>522
実装するためにはES6の仕様書を読む必要がある
今、読んでいるけど英語が不得手で解読に時間がかかってる
526 : Name_Not - 2015/01/31(土) 15:05:49.46 ID:???.net (-29,-30,-23)
ECMAScript6に対応してないブラウザ向けに
Mapを提供するライブラリっていくつか有るみたいだけど
どれが一番優秀?
http://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#ecmascript-6-harmony
528 : Name_Not - 2015/01/31(土) 15:36:59.07 ID:???.net (-29,-30,-200)
<iframe id="fm"></iframe>

<script type="text/javascript">
var str = '<html><head><style type="text/css">*{color:red;}</style></head><body>あばば</body></html>';
var doc = DOMパーサ(str);
var fm = document.querySelector("#fm").contentDocument;
// ?
</script>

こんな感じの疑似コードがあったとして、このあとdocの内容をiframe#fmに入れるにはどうしたらいいだろうか
fm.body = doc.body; fm.head = doc.head; なんかやってみたのだがheadが入らない
パーサ使わずにfm.write(str)するというのはナシで、どなたかご教示いただきたく・・・
531 : Name_Not - 2015/01/31(土) 18:27:32.75 ID:???.net (+66,+29,-78)
>>530
いやぁ別サイトをhttpRequestで取ってきてDOMでイジってiframeに書くようなことを考えてて
文字列やなんやらにまた書き出すなんて二度手間だなぁと思ってたんだが
readonlyならどうしようもないな、トンクス
532 : Name_Not - 2015/01/31(土) 18:41:27.11 ID:???.net (-1,-29,-22)
文字列に書き出すのはdoc.documentElement.innerHTMLで一発じゃない?
534 : Name_Not - 2015/01/31(土) 23:42:55.11 ID:???.net (+52,-30,-108)
IE7 で getter-property を定義する方法はないものでしょうか

var obj = {};
Object.defineProperty(obj, 'length', {get: function () { return Object.keys(this).length; });
535 : Name_Not - 2015/01/31(土) 23:55:47.95 ID:???.net (+5,-29,-5)
>>534
残念ながらIE7でgetterは実現できません
536 : 531 - 2015/02/01(日) 00:10:52.34 ID:???.net (+4,-29,-61)
>>535
ありがとうございます
後出しで申し訳ないのですが、その後、IE8 の Object.defineProperty も DOM にしか適用できない制限付きであることを知りました
IE8 で>>534を実現する方法もやはり、ないものでしょうか…
537 : Name_Not - 2015/02/01(日) 06:49:15.54 ID:???.net (+93,+29,-56)
javascriptってflashみたいに
「今見てるか、そのウィンドウが有効化されてるかどうか」
っての判別できますか?
最小化されてたりタブにあるだけだったら停止みたいなの造りたいんですが
538 : Name_Not - 2015/02/01(日) 07:06:46.60 ID:???.net (+98,+29,+0)
>>537
これでどうじゃろ http://hakuhin.jp/js/page_visibility.html
539 : Name_Not - 2015/02/01(日) 08:20:41.69 ID:???.net (+48,-30,-31)
>>537
addEventListener('blur', listener, false);
540 : Name_Not - 2015/02/01(日) 12:20:07.21 ID:???.net (-11,-29,-47)
>>533
そのHTMLタグに、onMouseClick とかのイベントを設定して、
その関数を直接よぶのではなく、

イベントキューにそのタグの座標を指定して、
クリックイベントをポストすれば?
541 : Name_Not - 2015/02/01(日) 12:52:58.52 ID:???.net (-11,-30,-289)
【JavaScript】メモリの浪費を避けるコーディング
http://utage.headwaters.co.jp/blog/?p=1116
こちらの後半に

> elemはfuga内のelem(3行目)からスコープチェーンで参照され、fugaはaddEventListener(6行目)によってelemから参照されているため、
> fuga -> elem -> fugaという循環参照が発生しています。これを回避するためには、単純にfugaをグローバルスコープにしてあげればOKです。
> グローバルスコープにすることで、スコープチェーンによる参照が無くなるため、循環参照は発生しなくなります。

との記述があるのですが、自分にはどちらも循環参照に見えます。
どうか一方は循環参照ではない事の解説をお願いします。
542 : Name_Not - 2015/02/01(日) 13:42:37.69 ID:???.net (+94,+27,-34)
>>541
確かにどっちも循環参照するコードだねw
しかも最近のブラウザでは問題にならないというのに、記事作成が2013年…
その記事書いたやつはnoob認定でいいよ
543 : Name_Not - 2015/02/01(日) 13:47:12.22 ID:???.net (+37,-29,-38)
>>541
循環参照なんかどうでもいいよ
elemが消滅してもremoveEventListener叩いても結局全部開放されるんだから
544 : Name_Not - 2015/02/01(日) 14:19:22.46 ID:???.net (+40,-30,+0)
>>541
> グローバルスコープにすることで、スコープチェーンによる参照が無くなるため、循環参照は発生しなくなります。
循環参照してる上に説明文も誤りですね
グローバルスコープにする必要があるのは elem ですし、グローバルスコープにしても循環参照はします
グローバルスコープにする理由は、DOMオブジェクトをグローバル変数にしておけば循環参照してもGCが期待通りにメモリを解放してくれるからです

var elem = document.getElementById('Sample');
elem.addEventListener('click', function (event) {
console.log(elem);
}, false);

また、この場合は event.currentTarget で対象の要素ノードを取得出来るので変数束縛する必要もありません
そもそも、このメモリリーグ問題は attachEvent を使う古い実装で発生したはずなので実証コードも良くないですね
IE8- の attachEvent なら event.currentTarget は存在しないので elem の変数束縛も納得できます
最も、event.target から該当ノードを検索すれば循環参照そのものを回避出来ますが
循環参照させないコード例とか、detachEvent で unload 時に明示的に参照を切る方法とか、その記事で触れられていない対策があるのも気になります
545 : Name_Not - 2015/02/01(日) 15:23:54.44 ID:???.net (+104,+29,-29)
>>542, >>543, >>544
ありがとうございます。 やはり循環してましたか。
ところでみなさん、この辺の知識はどうやって仕入れてます?
見るべきサイトや本があれば教えてください。
546 : Name_Not - 2015/02/01(日) 18:11:00.17 ID:???.net (+69,+29,-1)
>>538>>539
あざっす!
まさにこれです!
547 : Name_Not - 2015/02/01(日) 18:44:54.60 ID:???.net (+76,+29,-94)
>>545
循環参照とメモリリークパターンは下記を参考に
http://msdn.microsoft.com/ja-jp/library/bb250448.aspx
http://d.hatena.ne.jp/babu_babu_baboo/touch/20100417/1271465430

「この辺の知識」とは具体的には?
基本的に情報は公式サイト以外は信用しない
リークパターンでいうならMSDNを検索して検索して検索する
一次情報に勝る信頼性はないからそうしてる
リークパターンは情報が少なくて信用出来る意見を個人サイトから取り入れたのもあるけど、それでも公式サイトとの正誤比較は必須と思ってる
548 : Name_Not - 2015/02/01(日) 20:56:15.47 ID:???.net (+70,-1,-22)
jQueryを使うと循環参照していても
メモリリークしないのはどういう理屈でしょうか?
549 : Name_Not - 2015/02/01(日) 20:58:48.62 ID:???.net (+65,+30,+0)
550 : Name_Not - 2015/02/01(日) 21:03:02.70 ID:???.net (+54,-29,-181)
>>548

1. JavaScriptだけの世界においては循環参照していてもメモリリークは起きない
2. DOMはブラウザが持っているAPIで、JavaScriptで実装されたAPIではない。(今は多少状況が違っていたりする)
3. JavaScriptとDOM(JavaScriptの外)で循環参照しているのがメモリリークになる
4. 循環参照が起きやすいのが、DOMのイベントハンドラ
5. jQueryではDOMに直接イベントハンドラを設定せずに内部で独自に管理している
6. その為、イベントハンドラのJavaScriptとDOMが直接循環参照しない
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について