• ベストアンサー

removeEventListenerについて

babu_babooの回答

回答No.3

メモリーリークもんだいは、「循環参照」がおこるからであって・・・

関連するQ&A

  • removeEventListenerの必要性

    参考にしているJavaScriptのソースで下記のような部分があったのですが、 (画面に描画をするプログラムの一部です。動きとしてはマウスの動きに合わせて模様が描かれて残像が残って消えていきます。) j(b)関数の中の一行目でdocument.removeEventListener("mousemove", j, !1); としてmousemoveのイベントリスナーを削除しているのが何故なのか解らず困っています。 メモリリークが発生するとかそういう問題なのでしょうか? ----------------------------------------------------------------------- <script type="text/javascript"> (function() { function j(b) { document.removeEventListener("mousemove", j, !1); document.removeEventListener("touchstart", j, !1); y(b); var g = l - p * 0.5, f = m - q * 0.5, a = Math.sqrt(g * g + f * f), b = l + g / a * 150, a = m + f / a * 150, g = Math.atan2(f, g); g += Math.PI * (0.5 + Math.random() * 0.5) * (Math.random() > 0.5 ? 1 : -1); for (f = 0; f < z; f++) { for (var e = A[f].f, c = 0; c < r; c++) { var d = e[c], h = Math.PI * 0.15 / r * c + g, k = Math.cos(h) * (r - c) * 2, h = Math.sin(h) * (r - c) * 2; d.x = b; d.y = a; d.d = k; d.e = h } j = !1 } document.addEventListener("mousemove", y, !1); document.addEventListener("touchmove", y, !1); document.addEventListener("touchstart", K, !1); setInterval(L, 1E3 / 30) } ------------------------------------------------------------------------- 同じソースの中で window.onload = function(){ ・・・   document.addEventListener("mousemove", j, !1); というようにイベントリスナーに登録しているところは見つかったので、これを削除しているのかとは思うのですが、 何分未熟なもので、それがどういう意図によるものなのか理解できません。 どなたか、知恵を貸して頂けないでしょうか?

  • JSのイベントターゲット が難しい

    JSのイベントターゲット (EventTarget)が難しくてよくわからないのですが初心者にもわかるように解説していただけるとありがたいです。 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget イベントターゲット(EventTarget)は、DOMイベントを受け取り、それらへのリスナーを持つことが出来るオブジェクトによって実装されるDOMインターフェースです。 Elementと、 documentと、 windowは、ほとんどの共通イベントターゲットですが、 例えば、XMLHttpRequest、AudioNode、AudioContextなど、 他のオブジェクトもエベントターゲットになることが可能です。 多くのイベントターゲット(Element、document、windowを含む)は、 onXXXプロパティと属性を介して、 イベントハンドラの設定もサポートします。 メソッド .addEventListener() 要素にイベントハンドラを登録します。 .dispatchEvent() DOM内のノードのイベントを実行します。 .removeEventListener() EventTarget.addEventListenerを使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • 問題はbind の付いたリスナーを削除できないこと

    リンク先で下記のように書かれていますが、どういう意味でしょうか? >問題は、bind の付いたリスナーを削除できないということ ・「bind の付いたリスナーを削除」しないと何がマズいのでしょうか? ・thisの挙動が変わったままになるから? ・thisの挙動が変わるというのは、Somethingの中だけの話ではないのでしょうか? ・この場合のリスナーは? addEventListener('click', this.onclick2を指すのでしょうか? >リスナーを後で削除できるように、そのリスナーへの参照を残しておく必要があります ・「リスナーへの参照を残しておく」って、具体的にどういうことなのでしょうか? https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener

  • イベントリスナを調べる方法についての質問です。

    イベントリスナを調べる方法についての質問です。 現在twitterのページで使われているJavaScriptの挙動を分析しているのですが、コード量が非常に多く苦労しています。 ある要素にどのようなイベントリスナが追加されたか、または追加されているかということを調べるいい方法はないでしょうか? addEventListenerで関数を登録した場合、element.onclickにセットされた関数を取得するというような方法が使えないので困っています。 bookmarkletやユーザースクリプト、アドオンなど何でもいいので、要素に追加されているイベントリスナを直接調べたり、あるいはイベントリスナが追加される瞬間を検出できるようないい方法があれば教えてください。 (解析はFirefox上で行っていますが、他のブラウザを使う方法でも構いません) 宜しくお願いします。

  • Javascriptのオブジェクト指向プログラミングとイベント、thisの扱い

    Javascriptを勉強中です。 オブジェクト指向プログラミングを習得しようと努力しております。 あるHTML要素(例ではelm)にクリックイベントを付加する際、オブジェクト内のmyFuncを呼ぶのに以下のようにthis.myFuncとすると、thisがHTML要素となるためにエラーが出ます。 elm.addEventListener("click", this.myFunc, false); これを回避する目的で elm.addEventListener("click", (function(that) { return function() { that.myFunc(); } } )(this), false); とオブジェクト内からクロージャを使って定義することで解決することは分かったのですが、このイベントを削除するのに、 elm.removeEventListener("click", (function(that) { return function() { that.myFunc(); } } )(this), false); や elm.removeEventListener("click", function() { that.myFunc(); }, false); としても除去することが出来ません。この場合はどのようにイベントを削除することが出来るのでしょうか? そもそもクロージャを使った定義部分に問題があるのでしょうか? どうぞ教えていただきますようお願いいたします。

  • addEventListenerについて

    addEventListenerメソッドについてgoogleで検索してみていろいろと読んでみましたがいまいち理解できません。 ブラウザ上でのイベントとjavascriptの関数を結びつけるのが役割かなとはなんとなく分かりましたが、このメソッドの第3引数のtrue,falseが、キャプチャのオンかオフらしいのですが、キャプチャなるものが理解できません。 教えて下さい。よろしくお願いします。

  • 循環参照とメモリリークに関して

    次のスクリプトはメモリリークを起こしているでしょうか。 function process(listener){ return function(evt){ listener.call(evt.target,evt); }; } function addEvent(element,type,listener,useCapture){ element.addEventListener(element,type,process(listener),useCapture); } var div=document.getElementsByTagName('div')[0]; //存在するものとして addEvent(div,'click',function(){;},false); //いかにも起こしそう div.parentNode.removeChild(div); //親も存在するものとして 工夫してみたものの、やはりメモリリークするんでしょうか。 実際にaddEventListenerのlistener引数に渡されるのは、element変数を参照しない function(evt){ listener.call(evt.target,evt); }; ですが、listener変数は参照します。 そして、そのlistener変数はdiv変数(DOM)を参照するので、ここで循環するのでしょうか。 そして、以下の場合はどうなのでしょうか。。 var elements=[document.getElementsByTagName('div')[0]]; elements[0].addEventListener('click',function(){;},false); elements[0].parentNode.removeChild(elements[0]);

  • Now Loading+FLV_????? 教えてください!

    皆様、お世話になります。 以下、某Flash入門書に載っている簡単なNow Loadingのスクリプトです。 この本では、load完了後、jpegの写真が表示されます。 私は、load完了後に、自前のFLVを再生させたいと思い、既存のjpegを 自前のFLVに取り替えました。書き出すと、エラーが起こります。 以下、どのようにしたら、Now Loadingのカウントダウン後に、FLVが表示 できるでしょうか? ----------------------------------------------------------------------------------------------------------------- //イベントリスナーの登録 addEventListener(Event.ENTER_FRAME, loadCheck); stop(); function loadCheck(event:Event):void { //ロードされたパーセンテージを求める var percent:int = Math.ceil(loaderInfo.bytesLoaded / loaderInfo.bytesTotal * 100); //テキストボックスに表示 percentBox.text = percent + "%"; //100%ロードされたら if (percent >= 30) { //イベントリスナーを削除 removeEventListener(Event.ENTER_FRAME, loadCheck); //2フレーム以降に進む gotoAndPlay(2);; } } -----------------------------------------------------------------------------------------------------------------

    • ベストアンサー
    • Flash
  • addEventListenerの使い方について

    イベントリスナでスクロール時にアラートを表示したいのですが、 以下のソースでは動作しませんでした。 どこかに簡単なイベントに対するアクションを記載したサンプルコードはありますでしょうか? <script type="text/javascript"> document.addEventListener("scroll", alview, false); funciton alview(a){ alert(1); } </script> <body>

  • Actionscript3.0 子のイベントを削除

    Actionscript3.0で親のムービーから子のイベント指定して削除することは可能でしょうか? 親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。 親のステージに配置したbtnをクリックすることで、 ENTER_FRAMEを削除したいのですが、 下記のスクリプトだと、親のほうでmyenterframeが未定義と表示されてしまいます。 どのように記述すればよいのでしょうか? よろしくお願いいたします。 ーーーーーーーーーーーーーーーーー親ーーーーーーーーーーーーーーーーー btn.addEventListener (MouseEvent.CLICK, myclick); function myclick(event:MouseEvent):void{ mymc.removeEventListener(Event.ENTER_FRAME, myenterframe); } ーーーーーーーーーーーーーーーーーmymcーーーーーーーーーーーーーーーーー addEventListener(Event.ENTER_FRAME, myenterframe); function myenterframe(evt:Event):void { ball.x++; }

    • ベストアンサー
    • Flash