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

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

    JavaScript覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    601 = :

    >>597
    じゃあ、おまえが何の話してるか言えよ。
    わかってるんだろ?

    それを言わないから、問題が起きたんだーっていっても
    何の話だと思う?何の話かは言わねぇwww。ってなってるから
    誰もおまえの言うことを信じてないんだぞ

    602 = :

    >>599
    逆じゃね?

    >>598
    window.openしたら、openしたwindowを返すから、
    そのwindowに書き込めばいい。

    603 = :

    >>601
    だから分からないならいいんじゃねって言ってるだろ
    分からないことは責めてないから。
    頓珍漢な絡み方をしてくることを責めている

    604 = :

    よくwindow.openって書かれますが、
    windowいらなくないですか?
    何でwindow書くのですか?

    605 = :

    参照していたものが失われる可能性がある

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

    なんだこれ

    606 = :

    「参照先」に訂正するわ

    607 = :

    >>604
    openでは汎用過ぎて、なんのopenなのか
    わからないから。

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

    コードを読むのは人間なんだから。

    608 = :

    MS-Windowsじゃなくてもwindowってつかえるの?

    610 = :

    jQueryって要素の操作は得意だけど
    nodeの操作はあんまりだね

    612 = :

    あんまりっていうか全然じゃね

    613 = :

    nodeTypeを数字で判定すると、
    その数字が何だったのか後から見た時に分からないです
    nodeTypeを定数として持ってるオブジェクトはないんですか?

    615 = :

    ああ、というか Node 使わなくても全てのノードで参照できるな

    619 = :

    >>609
    > innerHTML の本質は「上書き」であって「書き換え」ではない
    > 書き換える必要のないDOMノードまで強制的に上書きするのが

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

    欠点でも何でもねーよ。

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

    びっくりした。あまりにも馬鹿すぎて。

    620 = :

    当たり前の事を分かって無い奴がどんだけいるんだろうな

    621 = :

    単なる$.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つ目の引数と同じになります。

    623 = :

    innerHTMLもhtmlも、「HTML文字列」から
    新しいHTMLを生成するもので、イベントハンドラが
    HTML文字列に書いてないから、イベントハンドラがないの当たり前だろ。

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

    > 消えたように見えるリスナーはどこにいっちゃったのか、消滅したわけじゃなさそう
    だから消滅するって。ガベージコレクションって書いただろ。
    どこからも参照されなくなれば消える。

    624 = :

    innerHTMLやjQueryのhtml()には欠点があるのではなく
    注意点があるだけの話。いやはや馬鹿だった馬鹿だったw

    625 :

    >>621
    そのまま使えばいいのになぜ clone() するんだよ
    >>618を全く読んでないな

    626 = :

    当たり前の事実を目にして、改善するか、何もしないか、の違いだな

    627 = :

    やる必要がないことをやらないのは大事だ
    やる必要をなくすことも大事だ

    628 = :

    まる一日使って613でようやく飲み込むとか本当に馬鹿だな

    629 = :

    >>608
    別にwindowってWindows固有の用語じゃないしな…
    例えばLinuxやUnixの世界にはX Window Systemってのがあるし

    630 = :

    jsってgcあるんですね

    631 = :

    >>627
    理解した上でその判断なら君は本物の馬鹿だ

    632 = :

    今年工業高校卒業予定なんですが愛知でインターンシップみたいなのって無いですか

    633 = :

    >>627
    参照を切らなければ、参照を保持している事を記憶する必要がない
    やる必要をなくすことは大切だな

    636 = :

    ということで、>>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 = :

    >>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');
      });
     });
    });

    639 = :

    いやー、悪い悪い >>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 = :

    >>639
    html()でイベントが消えないのは分かったが
    そのコードだと $('#SampleText')[0].innerHTML = str; でも動いちゃうけどな?

    641 = :

    対象のノードの子にあたるノードに対して、スクリプト側で動的にイベントハンドラを設定したり参照を持ったりしていると
    innerHTMLを使用したときに、子ノードに設定したイベントハンドラや持ってる参照が消えてしまいますよ
    二行でええやん

    642 = :

    >>641
    っていうか、少し考えればわかることなんだが。

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

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

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

    っていうのは、最初っからみんな言ってる話なんだよ。
    使っちゃいけない理由はないって。

    643 = :

    >>640
    何か問題あんの? html()は内部でinnerHTMLを
    使ってるんだからあたりまえだと思うが。

    644 = :

    ボックスからスクロールバーのサイズを引いたwidthを取得したいのですが
    どうやればいいでしょうか?

    645 :

    >>634
    > documentから消して、さらにJavaScripのどこからも参照がない時。
    この点では私とあなたで意見の相違はないと思うのだが…

    >>639
    バブリングで上位ノード監視の手法は知っているし、後述する予定だったが、参照が切れることに変わりはないはず
    ようはイベントがはがれる事だけが問題ではないのだが
    帰宅中なので詳細は後程

    646 = :

    > 参照が切れることに変わりはないはず
    参照が切れる切れるうざくね?
    なんでそんなものに執着してるのか。

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

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

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

    あんたは、中身を少し書き換えることしか頭にないから参照参照とうざいけど
    中身を完全に入れ替えて全く違うものにした時、前のデータが残っているほうが不自然だろ。

    647 = :

    へんなやつと絡むから話がこじれるんだよ・・
    分からなきゃ分からないでいい、で終わる話
    何を言っても納得しないし意味ないよ

    648 = :

    これ単なる初心者の質問でしかないから。
    すごく丁寧に解説すると

    【質問】
    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 = :

    innerHTMLの中身を別物に入れ替えてるんだから
    参照は切れるべきでしょ。むしろ残す方がおかしい。

    650 = :

    常識を持ち出すならObject型が参照なのは常識
    addEventListener 以外にも参照を保持するメソッドが定義されている事は十分に想像できるはずだがな
    プリミディブ型のように文字列でゴリゴリ処理する方が不自然だって事が感覚としてわからないなら、その程度の実力って事なんだろうな


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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