アプリケーションでevent.stopPropagation()
を使用しています。ただし、前述の関数が呼び出されなかったかのように伝播を続行したいというシナリオが1つあります。だから私は疑問に思っています。 停止後に伝播を「再開」する方法はありますか? event.stopPropagation
への1回の呼び出しを12個の個別の条件ステートメントに移動するのは非常に面倒です。
伝播が停止すると、再開することはできません。回避策として、変数を設定し、この変数がtrueの場合にのみ停止することができます。
var stop = false;
// do your logic here
if(stop){
event.stopPropagation();
}
元のイベントを次のようにリファクタリングするだけです。
var refEvent = event.originalEvent;
refEvent.cancelBubble = false;
refEvent.defaultPrevented = false;
refEvent.returnValue = true;
refEvent.timeStamp = (new Date()).getTime();
if (event.target.dispatchEvent){
event.target.dispatchEvent(refEvent);
} else if (event.target.fireEvent) {
event.target.fireEvent(refEvent);
}
event.stopPropagation()
呼び出しを条件内に配置します。例えば
$el.click(function(event) {
if (some_condition) {
event.stopPropagation()
// do stuff
}
else {
// do other stuff, without stopping propagation
}
});
面倒かもしれませんが、残念ながらstopPropagationは一方向のスイッチです。一度停止すると、同じイベントで再びオンにすることはできません。
動作するソリューションは次のとおりです。
$('#mydiv').on('click.new', function(e){
e.stopImmediatePropagation();
alert('this will happen only once');
$('#mydiv').unbind('click.new');
});
イベントがカスタム名前空間を持つことができ、それに応じてバインドを解除できるという事実を利用します。 e.stopPropagation
でも機能します。さらに言えば、そのカスタムクリックイベントに関連付けられているものはすべて元に戻すことができます。