2012-07-02 6 views

答えて

29

イベントバブリングが存在する理由は、どの要素がイベントの対象となるのかのあいまいな問題を解決するためです。したがって、divをクリックすると、divまたはその親をクリックすることを意味しましたか?子にクリックハンドラが接続されていない場合は、親をチェックします。その仕組みが分かっていると思います。

オーディオイベントがバブルしない理由は、他の要素で意味をなさないためです。オーディオ要素のそれがオーディオ要素か親のdivかを問わず、オーディオ要素のtimeupdateをトリガするとあいまいさがないので、バブルする必要はありません。

あなたはイベントのキャプチャ段階を利用することにより、まだ可能であるhere

イベント委任

イベントの委任をバブリングイベントのより完全な歴史を読むことができます。このイベントはバブルはしませんが、DOMツリーをダウンし、stopPropagationで停止することができないこと、

document.addEventListener('play', function(e){ 
    //e.target: audio/video element 
}, true); 

注:単純に次のようになりますaddEventListenerをのための3番目の引数として真追加します。

これをjQueryの.on/.offメソッドで使用する場合(名前空間やその他のjQueryイベント拡張機能を使用する場合など)。 webshim library形取られ、以下の機能が、便利になるはずです。

$.createEventCapturing = (function() { 
    var special = $.event.special; 
    return function (names) { 
     if (!document.addEventListener) { 
      return; 
     } 
     if (typeof names == 'string') { 
      names = [names]; 
     } 
     $.each(names, function (i, name) { 
      var handler = function (e) { 
       e = $.event.fix(e); 

       return $.event.dispatch.call(this, e); 
      }; 
      special[name] = special[name] || {}; 
      if (special[name].setup || special[name].teardown) { 
       return; 
      } 
      $.extend(special[name], { 
       setup: function() { 
        this.addEventListener(name, handler, true); 
       }, 
       teardown: function() { 
        this.removeEventListener(name, handler, true); 
       } 
      }); 
     }); 
    }; 
})(); 

使用法:それは要素の他のタイプにバブルアップメディアイベントをにあまり意味がありませんが

$.createEventCapturing(['play', 'pause']); 

$(document).on('play', function(e){ 
    $('audio, video').not(e.target).each(function(){ 
     this.pause(); 
    }); 
}); 
+17

、それが作るんたとえば、ドキュメント内の任意のメディア要素からイベントをキャッチする、グローバルボディリスナーを 'body 'に登録することができます。 –

+0

これは残念だが、理解できる。残念なことに、jQueryの委任システムのような "トリック"を使用できなくなります。私。 1つの「再生」リスナーをたとえば'

+0

この回答を受け入れない理由は何ですか? – saml

関連する問題