委任されたイベントを使用する場合、一致するすべての要素が、ターゲットからバブルアップしてイベントをトリガーします。 DIV-4のトリガーをクリックhttps://learn.jquery.com/events/event-delegation/とHTMLとJS以下に参照のうえに基づいてevent.stopPropagation()は委任されたイベントで複数の一致する要素を停止するのはなぜですか?
、それはバブルアップとして、そのすべての先祖(DIV-1、DIV-2、DIV-3、体)のイベントをクリックしてください。 :not(#div-three)
ここでは、div 4をクリックすると3つのアラートがトリガーされます。 div-four、div-two、div-oneの場合div-four
上
- クリックして、トリガー
div-four
からのイベントをクリックします。は、私は何が起こることは、このようなものだと思います。
div-four
イベントバブルをdiv-three
に、div-three
からイベントをトリガーしました。div-four
イベントバブルをdiv-two
に、div-two
からイベントをトリガーしました。div-four
イベントバブルをdiv-one
に、div-one
からイベントをトリガーしました。div-four
イベントバブルをbody
に変更するには、body
からイベントをトリガーします。イベントハンドラが実行されます。報告target:div-four|current:div-four
。div-three
(ステップ2から)イベントバブルはbody
までバブルします。イベントハンドラを起動しません。div-two
(ステップ3から)イベントバブルはbody
にバブルします。イベントハンドラが実行されます。報告target:div-four|current:div-two
。div-one
(ステップ4から)イベントバブルはbody
にバブルします。イベントハンドラが実行されます。報告target:div-four|current:div-one
。
event.stopPropagation()
は、イベントハンドラで呼び出された場合、div-four
イベントがステップ5でバブリングを停止する(body
上記のバブルには何もありませんが、とにかくが。)しかし、イベントが段階的にトリガ2,3,4まだすべき存在し、バブルアップするので、手順6,7,8は引き続き継続されます。
ただし、これは当てはまりません。次のhttps://jsfiddle.net/bLw7ch50/では、event.stopPropagation()
のコメントを外した後、警告が1つだけ表示されます(target:div-four|current:div-four
)。だから私はおそらくどこかで間違っている。私の理解に何が間違っていますか?
HTML:
<body>
<div id="div-one">
1st div
<div id="div-two">
2nd div
<div id="div-three">
3rd div
<div id="div-four">
4th div
</div>
</div>
</div>
</div>
<br/>
<br/>
<div id="output">
</div>
</body>
はCSS:
div {
border: 1px solid;
}
(jquery1.9.1付き)Javascriptの
$(document).ready(function() {
$("body").on("click", ":not(#div-three)", function(event) {
var event_target = $(event.target).attr("id");
var event_current = $(event.currentTarget).attr("id");
$("#output").append("target:" + event_target +
"|current:" + event_current + "<br/>");
alert("target:" + event_target +
"|current:" + event_current);
// Commented out in https://jsfiddle.net/bLw7ch50/1/, exists in https://jsfiddle.net/bLw7ch50
event.stopPropagation(); // When this line is here, all other events stop
});
});
...デリゲートされたイベントが発生すると、そのイベントはデリゲートターゲットに伝播する必要があります。途中のハンドラで伝播を停止すると、伝播しません。 –
..「ボディ」に伝播した後でも、それ以上の伝播はありませんか?イベントが再び 'body'に伝わると言っていますか? – Eric
これは、ドキュメントに一度伝搬した後、再び元に戻ります。間にある各要素で再び開始されません。イベントは1つだけです。それを止めれば停止します。 –