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

私的良スレ書庫

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

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

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
601 : Name_Not - 2014/07/21(月) 18:35:12.08 ID:???.net (+109,+30,-35)
>>597
じゃあ、おまえが何の話してるか言えよ。
わかってるんだろ?

それを言わないから、問題が起きたんだーっていっても
何の話だと思う?何の話かは言わねぇwww。ってなってるから
誰もおまえの言うことを信じてないんだぞ
602 : Name_Not - 2014/07/21(月) 18:36:56.68 ID:???.net (+3,-29,-8)
>>599
逆じゃね?

>>598
window.openしたら、openしたwindowを返すから、
そのwindowに書き込めばいい。
603 : Name_Not - 2014/07/21(月) 19:10:38.48 ID:???.net (+72,+29,-15)
>>601
だから分からないならいいんじゃねって言ってるだろ
分からないことは責めてないから。
頓珍漢な絡み方をしてくることを責めている
604 : Name_Not - 2014/07/21(月) 19:11:41.41 ID:???.net (+34,-29,-11)
よくwindow.openって書かれますが、
windowいらなくないですか?
何でwindow書くのですか?
605 : Name_Not - 2014/07/21(月) 19:16:06.71 ID:???.net (+57,+29,-11)
参照していたものが失われる可能性がある

ガベージコレクタが回収するから問題ない

なんだこれ
606 : Name_Not - 2014/07/21(月) 19:16:58.13 ID:???.net (+52,+29,-6)
「参照先」に訂正するわ
607 : Name_Not - 2014/07/21(月) 19:22:54.31 ID:???.net (+67,+29,-63)
>>604
openでは汎用過ぎて、なんのopenなのか
わからないから。

コードというのは意図をわかりやすくするのが重要で、
コンピュータにとって問題ないからって省略した方がいいとは限らないんだよ。

コードを読むのは人間なんだから。
608 : Name_Not - 2014/07/21(月) 19:44:19.45 ID:???.net (+22,-29,-21)
MS-Windowsじゃなくてもwindowってつかえるの?
610 : Name_Not - 2014/07/21(月) 20:56:42.91 ID:???.net (+55,+27,-29)
jQueryって要素の操作は得意だけど
nodeの操作はあんまりだね
611 : Name_Not - 2014/07/21(月) 21:06:58.36 ID:???.net (-1,-29,-60)
また頓珍漢な反論が出てきそうなので釘をさしておこう

jQuery の .text() は textContent の代替であってテキストノード値の書き換えではない
http://api.jquery.com/text/
612 : Name_Not - 2014/07/21(月) 21:07:01.30 ID:???.net (+52,+29,+0)
あんまりっていうか全然じゃね
613 : Name_Not - 2014/07/21(月) 21:17:38.07 ID:???.net (+3,-28,-31)
nodeTypeを数字で判定すると、
その数字が何だったのか後から見た時に分からないです
nodeTypeを定数として持ってるオブジェクトはないんですか?
614 : Name_Not - 2014/07/21(月) 21:22:18.80 ID:???.net (-1,-29,-41)
>>613
Node.ATTRIBUTE_NODE とか、DOM Interface オブジェクトを利用しては?
なかったら自前で作る
615 : 608 - 2014/07/21(月) 21:23:32.94 ID:???.net (+53,+25,+0)
ああ、というか Node 使わなくても全てのノードで参照できるな
616 : 608 - 2014/07/21(月) 21:29:20.45 ID:???.net (+0,-28,-5)
IE8- をサポートするなら自前で作る必要があるか
617 : Name_Not - 2014/07/21(月) 21:30:49.30 ID:???.net (-29,-29,-149)
>>609
初学者なりに見てみたんだけど確かに注意すべき問題だけど
addEventListenerが結果を保持するところとinnerHTMLが持ってくるところが違うから起きる現象に見える
// addEventListenerで追加しないで onClickで仕込むと>>609のいう問題な動作は起きないところからそう見た

上書きか書き換えか、とか、壊れる、とかいうと予想外の期待されない動作みたいなニュアンスがあるけど
実際は「まー当然こうなるよね」というふうな動作に見えるのだけど、そうではないのかな?
618 : Name_Not - 2014/07/21(月) 21:58:13.30 ID:8atMqUtx.net (-28,-30,+0)
>>617
確かにイベントが解除される問題は <strong id="Test" onclick="changeBackgroundColor(event);"> で回避できる
しかし、その場合も #Test の要素ノードをクロージャでキャッシュしていた場合は参照が切れる
重要なのは参照が切れてしまう事であってイベントの問題が回避できれば解決するわけではない
(他にも参照を利用したコードはあるだろう)

同様の問題は textContent にもある
テキストノードをキャッシュしていたら textContent で上書きすれば参照が切れる
Text#data で値を書き換えれば、参照は切れないので問題は発生しない
テキストノードの間に要素を挟んでテキストノードを分割するなら新しいテキストノードを作成すべきだが、既存のテキストノードを流用できるなら流用した上で値の書き換えにとどめたほうが良い

> 実際は「まー当然こうなるよね」というふうな動作に見えるのだけど、そうではないのかな?
「当然の事象」を理解した上で問題点の少ないコードを模索するのが良いプログラマだと思う
619 : Name_Not - 2014/07/21(月) 23:07:40.21 ID:???.net (+50,+29,-92)
>>609
> innerHTML の本質は「上書き」であって「書き換え」ではない
> 書き換える必要のないDOMノードまで強制的に上書きするのが

は? 当たり前じゃん。 当たり前じゃん。

欠点でも何でもねーよ。

HTMLの中身を入れ替えるんだから変わるに決まってるじゃん。

びっくりした。あまりにも馬鹿すぎて。
620 : Name_Not - 2014/07/21(月) 23:10:35.26 ID:???.net (+57,+29,-4)
当たり前の事を分かって無い奴がどんだけいるんだろうな
621 : Name_Not - 2014/07/21(月) 23:10:46.07 ID:???.net (+18,-30,-216)
単なる$.html()でイベントが消える・・・というか
入れ替えるhtmlにイベント書いてないから当たり前なんだが、
それが嫌なら、$.clone()使えばいいだけ。

http://js.studio-kingdom.com/jquery/manipulation/clone

[withDataAndEvents] boolean値で、マッチしている要素に付随している
イベントハンドラもコピーするかどうかを決定します。 jQuery1.4からは保持しているdataも同様にコピーの対象になります。

(初期値はfalseでしたが、jQuery1.5でtrueになり、jQuery1.5.1で再度falseにもどされました。)
[deepWithDataAndEvents] boolean値で、マッチしている要素の全ての子要素に対しても、
付随しているイベントハンドラとDataをコピーするかどうかを決定します。 この初期値は1つ目の引数と同じになります。
622 : Name_Not - 2014/07/21(月) 23:16:22.25 ID:???.net (-9,+30,-158)
>>618
onClickの話は別に解決策を提示したわけではないよ
それで、あらためて>>539をみてなるほどと思いかけたけど、となると
消えたように見えるリスナーはどこにいっちゃったのか、消滅したわけじゃなさそう

それと、innerHTMLとかinnerTextって書くの楽だし
jQueryをはじめいろんなところで使われまくってるから
使わないじゃなくて、問題点を理解して使っていくうえで賢いやり方とかあるかな?
今って参照を保持したり動的にイベント制御したりがどのくらい頻繁に出てくるのか知らないけど

> 「当然の事象」を理解した上で~~
いや、言葉の使い方の話
623 : Name_Not - 2014/07/21(月) 23:25:01.84 ID:???.net (+9,-29,-119)
innerHTMLもhtmlも、「HTML文字列」から
新しいHTMLを生成するもので、イベントハンドラが
HTML文字列に書いてないから、イベントハンドラがないの当たり前だろ。

そういう風に動的に追加される要素にイベントハンドラを付けたいなら
個々に追加する(面倒な方法)か、親要素にイベントハンドラ設定するのが常識。
たとえば $(document).on('click', セレクタ, function() {・・・}) みたいに。

> 消えたように見えるリスナーはどこにいっちゃったのか、消滅したわけじゃなさそう
だから消滅するって。ガベージコレクションって書いただろ。
どこからも参照されなくなれば消える。
624 : Name_Not - 2014/07/21(月) 23:25:54.10 ID:???.net (+50,+26,-45)
innerHTMLやjQueryのhtml()には欠点があるのではなく
注意点があるだけの話。いやはや馬鹿だった馬鹿だったw
625 : Name_Not - 2014/07/22(火) 00:08:55.56 ID:HZZvAY0t.net (+20,+26,+0)
>>621
そのまま使えばいいのになぜ clone() するんだよ
>>618を全く読んでないな
626 : Name_Not - 2014/07/22(火) 00:37:31.52 ID:???.net (+57,+29,-25)
当たり前の事実を目にして、改善するか、何もしないか、の違いだな
627 : Name_Not - 2014/07/22(火) 01:24:41.34 ID:???.net (+124,+29,-21)
やる必要がないことをやらないのは大事だ
やる必要をなくすことも大事だ
628 : Name_Not - 2014/07/22(火) 01:25:33.54 ID:???.net (+55,+29,-7)
まる一日使って613でようやく飲み込むとか本当に馬鹿だな
629 : Name_Not - 2014/07/22(火) 03:18:02.49 ID:???.net (+0,-29,-29)
>>608
別にwindowってWindows固有の用語じゃないしな…
例えばLinuxやUnixの世界にはX Window Systemってのがあるし
630 : Please C - 2014/07/22(火) 05:44:24.97 ID:???.net (+7,-15,-12)
jsってgcあるんですね
631 : Name_Not - 2014/07/22(火) 06:45:16.91 ID:???.net (+68,+29,-7)
>>627
理解した上でその判断なら君は本物の馬鹿だ
632 : Name_Not - 2014/07/22(火) 06:52:21.28 ID:???.net (+57,+29,-6)
今年工業高校卒業予定なんですが愛知でインターンシップみたいなのって無いですか
633 : Name_Not - 2014/07/22(火) 07:33:06.29 ID:???.net (+74,+29,-25)
>>627
参照を切らなければ、参照を保持している事を記憶する必要がない
やる必要をなくすことは大切だな
635 : Name_Not - 2014/07/22(火) 12:48:11.42 ID:???.net (-5,-30,-181)
>>634
> addEventListener に Listener は登録されているので消えているわけではないが、documentとの参照は切れる
> もう一度、document にノードを appendChild すればイベントが発火するはず

ノードとそのノードのイベントハンドラが消えるタイミングを勘違いしてるよ。
まずイベントハンドラが消えるタイミングはノードが消えた時。

ここまではいいよね?

じゃあノードが消えるのはいつかというと、documentから消した時じゃない。
documentから消して、さらにJavaScripのどこからも参照がない時。

DOMからremoveChildしたりinnerHTMLで消して、かつ
JavaScriptのどこからも参照されなくなった時にイベントハンドラは削除される。

JavaScriptのどこからも参照がなくなった時だから、
これをJavaScript内で検知するのは不可能。


> innerHTML を使うなら問題を回避できないので、
だからなんの問題?
636 : Name_Not - 2014/07/22(火) 13:17:05.97 ID:???.net (+12,-30,+0)
ということで、>>634をjQueryとhtml()メソッドを使って、
イベントが解除されないという証拠です。

http://jsfiddle.net/Pc87X/2/

テキスト以外の部分も書き換える可能性があるから
全く同じじゃないが、今の本題はhtml()でメソッドが
解除されるかどうかだから。

ついでにここにもコピペしとく

(function () {
 function changeBackgroundColor () {
  this.style.backgroundColor = this.style.backgroundColor ? '' : 'orange';
 }

 function runInnerHtml () {
  var str = $('body').html();
  str = str.replace('テスト', 'JavaScript');
  $('body').html(str);
 }

 $('#Test').on('click', changeBackgroundColor);
 $('#ClickMe').on('click', runInnerHtml);
}());
637 : Name_Not - 2014/07/22(火) 13:53:36.04 ID:???.net (+3,-30,-226)
>>636はhtml()使ってもイベントハンドラが消えないという証拠として書いたもので
しかもなるべくオリジナルに近い形にしたので俺的には気に入らないコードだった。

普通に書いたらこうかな。ってことでついでにちゃんと書いたよ。

http://jsfiddle.net/Pc87X/4/

短いので、ここにもコピペしておく。

$(function () {
 $('#Test').on('click', function () {
  this.style.backgroundColor = this.style.backgroundColor ? '' : 'orange';
 });

 $('#ClickMe').on('click', function () {
  $('*').contents().filter(function() {
   return this.nodeType === 3;
  }).each(function() {
   this.textContent = this.textContent.replace('テスト', 'JavaScript');
  });
 });
});
638 : Name_Not - 2014/07/22(火) 13:55:12.82 ID:???.net (-1,-29,-37)
あ、今気づいたが、getElementById('SampleText')で
対象を絞り込んでたのねw

まあ適当に補完しといてくれ。
639 : Name_Not - 2014/07/22(火) 14:27:47.80 ID:???.net (+90,-30,-311)
いやー、悪い悪い >>636は自分で書いててて
なんで動くんだって思ったんだw
間違えてたな。うん。動かない。

訂正した奴はこっち。もちろんhtml()は使ってるから安心してな。
やってることは>>623で説明したとおり
http://jsfiddle.net/Pc87X/5/

(function () {
 function changeBackgroundColor () {
  this.style.backgroundColor = this.style.backgroundColor ? '' : 'orange';
 }

 function runInnerHtml () {
  var str = $('#SampleText').html();
  str = str.replace('テスト', 'JavaScript');
  $('#SampleText').html(str);
 }

 $(document).on('click', '#Test', changeBackgroundColor);
 $(document).on('click', '#ClickMe', runInnerHtml);
}());
640 : Name_Not - 2014/07/22(火) 14:34:41.88 ID:???.net (+30,-30,-53)
>>639
html()でイベントが消えないのは分かったが
そのコードだと $('#SampleText')[0].innerHTML = str; でも動いちゃうけどな?
641 : Name_Not - 2014/07/22(火) 14:52:09.04 ID:???.net (+99,+29,-57)
対象のノードの子にあたるノードに対して、スクリプト側で動的にイベントハンドラを設定したり参照を持ったりしていると
innerHTMLを使用したときに、子ノードに設定したイベントハンドラや持ってる参照が消えてしまいますよ
二行でええやん
642 : Name_Not - 2014/07/22(火) 18:30:26.67 ID:???.net (+76,+30,-120)
>>641
っていうか、少し考えればわかることなんだが。

中身を入れ替えてるわけだから、当然新しいものになるわけで、
古い方に割り当てたイベントハンドラは、新しいものにはついてない。
これは別にinnerHTMLのバグでも問題でも何でもなく常識的な動き。

だから新しくイベントハンドラを割り当てるか、親要素にイベントハンドラを
割り当てるかすればいいだけ。

これはinnerHTMLを使うときは、これを見逃さないでねってだけで
innerHTMLを使っちゃいけない理由でもなんでもないよ。

っていうのは、最初っからみんな言ってる話なんだよ。
使っちゃいけない理由はないって。
643 : Name_Not - 2014/07/22(火) 18:32:14.15 ID:???.net (+91,+24,-34)
>>640
何か問題あんの? html()は内部でinnerHTMLを
使ってるんだからあたりまえだと思うが。
644 : Name_Not - 2014/07/22(火) 18:43:45.17 ID:???.net (+49,+17,-18)
ボックスからスクロールバーのサイズを引いたwidthを取得したいのですが
どうやればいいでしょうか?
645 : Name_Not - 2014/07/22(火) 18:48:00.29 ID:7RqdhX7u.net (+29,+29,-60)
>>634
> documentから消して、さらにJavaScripのどこからも参照がない時。
この点では私とあなたで意見の相違はないと思うのだが…

>>639
バブリングで上位ノード監視の手法は知っているし、後述する予定だったが、参照が切れることに変わりはないはず
ようはイベントがはがれる事だけが問題ではないのだが
帰宅中なので詳細は後程
646 : Name_Not - 2014/07/22(火) 18:57:15.54 ID:???.net (+63,+30,-190)
> 参照が切れることに変わりはないはず
参照が切れる切れるうざくね?
なんでそんなものに執着してるのか。

中身を新しいものに入れ替えてるんだから
別物になっただけだよ。全然難しい話じゃない。

そういう動きになるってだけでそれで問題ないなら、なにも問題ないだろ。
少し盲点になるかもねーってだけの話でしか無い。

古いものを無くしたいのなら(だからinnerHTML使ってるわけで)
むしろ消えてなくなった方がいい場合も多い。
たとえば、<select>要素の<option>をinnerHTMLで入れ替えるのに
ほとんどの場合なんの問題もねーよな?

あんたは、中身を少し書き換えることしか頭にないから参照参照とうざいけど
中身を完全に入れ替えて全く違うものにした時、前のデータが残っているほうが不自然だろ。
647 : Name_Not - 2014/07/22(火) 18:58:32.50 ID:???.net (+57,+29,-17)
へんなやつと絡むから話がこじれるんだよ・・
分からなきゃ分からないでいい、で終わる話
何を言っても納得しないし意味ないよ
648 : Name_Not - 2014/07/22(火) 19:10:38.87 ID:???.net (+3,-30,+0)
これ単なる初心者の質問でしかないから。
すごく丁寧に解説すると

【質問】
element.innerHTML = element.innerHTML.replace(テキスト修正);
って書いたら、element.innerHTMLの中に設定していた
イベントハンドラが動かなくなりました。どうしてですか?

【回答】
element.innerHTML の中身を新しいHTMLに入れ替えたのだから
当然中身は新しくHTML(DOM)になります。

たとえば
element.innerHTML の中に '<a href="hoge">link</a>'; があって
element.innerHTML ='<button>button</button>'; を実行したら
aが消えてなくなるのは当たり前だし、aに設定していたイベントハンドラ
などもなくなるのは当たり前です。

中身をちょっとだけ変えた、element.innerHTML ='<a href="hoge">link2</a>'; を
実行したとき、それを元のaと同じとみなすべきかはわかりません。
よってイベントハンドラを引き継ぐべきかどうかもわかりません。

代入したものは新しいHTMLなのですから、そこに書いているもの以外は初期状態です。
649 : Name_Not - 2014/07/22(火) 19:12:34.07 ID:???.net (+91,+29,-26)
innerHTMLの中身を別物に入れ替えてるんだから
参照は切れるべきでしょ。むしろ残す方がおかしい。
650 : Name_Not - 2014/07/22(火) 19:15:31.40 ID:???.net (+69,+29,-95)
常識を持ち出すならObject型が参照なのは常識
addEventListener 以外にも参照を保持するメソッドが定義されている事は十分に想像できるはずだがな
プリミディブ型のように文字列でゴリゴリ処理する方が不自然だって事が感覚としてわからないなら、その程度の実力って事なんだろうな
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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