addEventListener の第三引数の意味

このQ&Aのポイント
  • addEventListenerの第三引数の意味について、具体的な使い分けや適切な場合を教えてください。
  • addEventListenerの第三引数は、ユーザがキャプチャを開始したいかどうかを示します。
  • 一般的には、第三引数がtrueの場合はキャプチャフェーズで、falseの場合はバブリングフェーズでイベントが処理されます。
回答を見る
  • ベストアンサー

addEventListener の第三引数の意味

addEventListener の第三引数の意味を教えてください。 MDNでは element.addEventListener - MDN https://developer.mozilla.org/ja/DOM/element.addEventListener 「true の場合、useCapture は、ユーザがキャプチャを開始したいことを示しています」 と書いてあり何のことやらさっぱり分かりませんでした。 一応下記のサイトを見て表面的な動きは理解しました。 addEventListener の第三引数について - hogehoge @teramako http://d.hatena.ne.jp/teramako/20070126/about_useCapture_of_addEventListener 以下の順で処理される。 1 親のtrue 2 子のtrue 3 子のfalse 4 親のfalse それは分かったのですが、どういうときに使い分けるのかということが結局分かりませんでした。おそらくはほとんどの場合でどちらでもいい・意識する必要が無いのではないかと思いますが、しかし一応きちんと理解しておきたいと思っています。 ◎addEventListener の第三引数の意味 ◎addEventListener の第三引数を ・trueにした方がいいケース ・falseにした方がいいケース このあたりを教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.2

バブリングするイベントタイプ(click、keydown) ・ルートノード → (キャプチャリングフェーズ)→ ターゲット → (バブリングフェーズ)→ ルートノード バブリングしないイベントタイプ(focus、load) ・ルートノード → (キャプチャリングフェーズ)→ ターゲット このように、バブリングしないイベントタイプであってもキャプチャリングフェーズは発生します。だから、 // activeElement をサポートしないブラウザ向け document.addEventListener('focus', function (e) {  e.currenttarget.activeElement = e.target; }, true); のように、バブリングしない focus をルートノードで監視することも可能です。かつ、キャプチャリングという割り込みをルートノードで行うということは、あらゆるイベントリスナの前に実行されるという意味ですから、activeElement について整合性を崩すようなこともありません。 実のところ、click や keydown なんて「具体的な操作」イベントを監視せずとも、focus さえ監視すれば両方の代替になる、という場合がよくあります(廃止された DOMActivate の代替)。そんなとき、いちいち個々の要素で focus を監視するのでなく、キャプチャリングを使ってルートノードで一括監視できます。 --- キャプチャリングはもともと Netscape に由来し、IE では ver. 9 になるまでありませんでした。IE には focusin というバブリングするイベントタイプがあり、結局それが DOM3-Events に収録されています。 ブラウザの DOM 文書木というのは、誰がどう弄るか分かりません。ならば、イベントの発生源を直接監視するのでなく、発生源からできるだけ遠くから監視するのが安全です。そうすれば、自然とイベントオブジェクトに情報を問い合わせる形になるはずです。

pringlez
質問者

お礼

少し難しいかったです…。 イベントの種類によって、バブリングしないイベントもあるのですね。知りませんでした。 そのようなイベントでかつ親で観測したい場合には、なるほど確かにtrueにする必要がありますね。 参考になりました。ありがとうございました。

その他の回答 (3)

  • Chaire
  • ベストアンサー率60% (79/130)
回答No.4

多用するか否かで言えば、キャプチャリングは多用するものではないと思います。『JavaScript: The Good Parts』の著者 D. Crockford に至っては「バブリングは大いに使え、しかしキャプチャリングは避けろ」とまで言っています。確かに、addEventListener() の通常用途としてはその方が良いでしょう。 ところで、IE の独自拡張に element.setCapture() というのがあります。これは、ブラウザ外も含めてあらゆる場所で起きたイベントを、一度だけ「element で起きたもの」として渡します。「どこをクリックしても、element をクリックしたことになる」わけです。全画面で警告を出した後、どこかをクリックすれば元に戻る、みたいな用途に使えますね。 今のところ、IE 以外でそのようなブラウザ外イベントを拾うことはできません。しかしブラウザ内であれば、キャプチャリングを使うことでターゲットより先にイベントを拾うことができます。つまり、モーダルウィンドウのように「一定の範囲以外は一時的に入力を受け付けない」状態にできるわけです。 仕組みは違えど、名前(と目的)が同じということで。

pringlez
質問者

お礼

setCapture試してみました。 ちょっとびっくりしました。面白いですね。 いつか使ってみたいと思います。 また参考になりました。ありがとうございました。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

[ANo.2] さんの回答をもとに、具体的なケースを考えてみたよ! 例えば、 「文字列を選択して、右クリックをすると独自のメニューが表示される。」 という機能を実装するときに、 一つ一つの要素を Listening するのではなくて、 ルート要素を true で Listening する。 というイメージ。

pringlez
質問者

お礼

試してみました。 右クリックはcontextmenuだと思うのですが、これはclickと同じようでfalseでも親で観測できました。つまり親だけで観測しようとするならばtrueでもfalseでも変わりませんでした。 一方focusではtrueにしなければ親で観測できませんでした。 結論を言うとイベントを親で観測したいときに、falseでうまくいかなかったらtureにしてみろ、ということかなと思いました。(曲解かもしれませんが) 試すきっかけになりました。ありがとうございました。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

JavaScript ソースを全部自分で編集できる立場にあれば、あまり使い道はないとおもう。。。 他の人のウェブページの動きをユーザスクリプトで手を加えたいときにつかうのかな? http://ja.wikipedia.org/wiki/Greasemonkey ケースその1 子要素が onclick を Listen しているけれど、子要素の listner を呼ばせたくないとき。 子要素の listner が呼ばれないようにするためには、 .removeListner() で listener を指定ればよいけれど、一般的に、ユーザスクリプトから listner を調べる方法がないから使えない。 なので、親要素の onclick を true で捕捉して、return false でぬければ、子要素の listener が呼ばれることを回避できる。 ケースその2 子要素が onclick を Listen しているけれど、子要素の listner が呼ばれる前に別の処理をしたいとき。 親要素の onclick を true で捕捉して、別の処理を済ませたら return true でぬければ、その後、子要素の listener が呼ばれる。 ケースその3 子要素が onclick を Listen していて、listner が return true で抜ける場合に、その後に別の処理をしたいとき。 親要素の onclick を false で捕捉すれば、子要素の listner が return true でぬければ、親要素の listner が呼ばれるから別の処理を実行できる。 。。。ような気がする。

pringlez
質問者

お礼

なるほど。ユーザスクリプトで独自のイベントを追加したいときには使える場面があるかもしれませんね。(ものすごく限定された例ですが) とにかくほとんど使い道はなくあまり気にしなくてもいい事ということですかね。 参考になりました。ありがとうございました。

関連するQ&A

  • 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]);

  • 「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてくだ

    「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてください。 クラス内のコード抜粋なのですが、下記はどういう意味なのでしょうか? ▼メンバ変数 var $j = true; ▼メンバ関数 function j($p = false){ if($p) $this->j = false; return $this->j; } $this->j(true); 分からないこと ・コードの意味全般 ・($p = false)と書かれている引数の意味 ・メンバ変数とメンバ関数の名前は同じでもよいか? 

    • ベストアンサー
    • PHP
  • 座標のみでクリックする方法

    DOMで取得した要素ではなく、座標のみでクリックすることは可能でしょうか? フラッシュなどの、要素を取得できないサイトでクリックをさせたいと思っております。 (私が知らないだけでフラッシュの要素が取り出せるかもしれませんが・・・) 要素を指定するのに、座標を指定する引数がある意味がよくわかりません。 下記の例だと■■■の記述方法が分かりませんでした。 ご教授のほど宜しくお願い致します。 e = document.createEvent("MouseEvents"); e.initMouseEvent("click",true,true,window,1,0,0,0,0,false,false,false,false,0,null); ■■■.dispatchEvent(e);

  • 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を使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • エクセルVLOOKUPで引数がマイナス?

    人の作ったエクセルのワークシートをみていたところ =VLOOKUP(A40,M59:N71,2,-1) という式がありました。 これまでVLOOKUPでは、 =VLOOKUP(A40,M59:N71,2,FALSE) =VLOOKUP(A40,M59:N71,2,0) =VLOOKUP(A40,M59:N71,2,TRUE) =VLOOKUP(A40,M59:N71,2,1) ならよく見るのですがマイナスの引数は初めてです。 これはどういう意味なのでしょうか?

  • 関係性を持ったソート

    例えば以下の様なデータで 親-子, 判定とした場合 1-1, true 1-2, true 1-3, true 2-1, true 2-2, true 2-3, false 群の中で一つでもfalseがあれば親単位で全てを抜き出すと言う方法を探しています 結果として 2-1, true 2-2, true 2-3, false だけ抜き出せればOKです

  • ソースの意味がわかりません。

    先日PHPのコミュで質問して回答をいただいたのですが、その後、その回答に質問したのですが回答がなくて、どうしてもソースの意味がわからず困っています。分かる方どうかご教示ください。 クラスファイルの一部ですが、 ────────────────── function __is_browser_pc() { $browser = __get_browser(); switch ($browser) { case 'docomo': case 'au': case 'softbank': return false; default: return true; } return true; } function session_start_smart() { $is_pc = __is_browser_pc(); if (!$is_pc) ini_set('session.use_trans_sid', '1'); session_start(); } function session_url_smart($url) { $is_pc = __is_browser_pc(); if (!$is_pc) { $url.= (strpos($url, '?') === false ? '?' : '&') . SID; } return $url; } ?> ──────────────────── get_browser(); はブラウザを調べているのだと思います。 is_browser_pc() の下のほうの ///////////////////////////// default: return true; } return true; } ///////////////////////////// 最初の「return true;」 はわかりますが、次の「return true; 」の意味は何でしょうか? あと「session_url_smart」の ///////////////////////////// $url.= (strpos($url, '?') === false ? '?' : '&') . SID; ///////////////////////////// この部分がわかりません。 プログラム自体初心者です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • VLOOKUP関数のFALSEって?

    VLOOKUP関数をよく使うのですが、ふと最後の引数のFALSEって何を意味しているのかが気になりました。いつも無意識にFALSEを使っていましたが、TRUEはどのような場合に使う必要が生じるのでしょうか? 本をみると「検索の型」を選択するようですが、よく意味がわかりません。具体的にどういうことなのでしょうか?

  • VLOOKUP関数のFALSEって?

    VLOOKUP関数をよく使うのですが、ふと最後の引数のFALSEって何を意味しているのかが気になりました。いつも無意識にFALSEを使っていましたが、TRUEはどのような場合に使う必要が生じるのでしょうか? 本をみると「検索の型」を選択するようですが、よく意味がわかりません。具体的にどういうことなのでしょうか?

専門家に質問してみよう