web-dev-qa-db-ja.com

Javascript:stopPropagationを有効にする方法は?

object.stopPropagation()を使用すると、イベントバブリングを停止できますが、再度有効にするにはどうすればよいですか?

Jsにobject.startPropagationのような定義済みの関数はありますか?

編集:

問題は、JSが「オブジェクト」をクリックした場合に、イベントバブリングが不要になった後もイベントバブリングを常に停止することを記憶していることです。そのため、停止します。

document.getElementById("object").onclick = function(e){
    if(e && e.stopPropagation) {
        e.stopPropagation();
    } else {
          e = window.event;
          e.cancelBubble = true;
    }
}
14
Adam

値をまったく覚えていません。イベントeは、onclickが発生するたびに新しくなります。問題は、あなたが常にイベントバブリングをキャンセルしていることです:

_if(foo) {
    e.stopPropagation();
} else {
    e.cancelBubble = true;
}
_
  • _e.stopPropagation_は、イベントのバブリングを防ぐW3Cメソッドです。
  • _e.cancelBubble_は、イベントのバブリングを防ぐためのMicrosoftのメソッドです。

どちらも同じです。つまり、毎回イベントのバブリングをキャンセルしています。もっと読む ここ

基準が満たされた場合にのみバブリングをキャンセルするように、メソッドを変更する必要があります。

_document.getElementById("object").onclick = function(e) {

    if(e && e.stopPropagation && someCriteriaToStopBubbling === true) 
    {
        e.stopPropagation();
    } 
    else if (someCriteriaToStopBubbling === true)
    {
          e = window.event;
          e.cancelBubble = true;
    }
}
_

UPDATE:現在のコードでは、ブラウザがstopPropagationをサポートしている場合、if (e && e.stopPropagation)は常にtrueになることに注意してください。 。 cancelBubbleの2番目のブレースに入る場合、最後に設定された値は記憶されません。 this fiddle を参照してください。

基本的に、要約すると、コード内でクリックするたびに伝播をキャンセルしています。エレメント階層の上の伝搬をキャンセルするかどうかを決定するには、関数にいくつかの基準を入れる必要があります。

26
djdd87