YUI を使用して、JavaScript イベントが伝播し続けないようにしようとしています。以下は、問題を示す最小限の HTML と最小限の JavaScript です。
HTML:
<a href="#foo" onClick="fooClickTest()" id="foo">foo</a>
<a href="#bar" id="bar">bar</a>
JavaScript:
function fooClickTest(e) {
alert('fooClickTest');
YAHOO.util.Event.addListener('bar', 'click', barClickTest1);
YAHOO.util.Event.addListener('bar', 'click', barClickTest2);
YAHOO.util.Event.addListener('bar', 'click', barClickTest3);
YAHOO.util.Event.preventDefault(e);
}
function barClickTest1(e) {
alert('barClickTest1');
YAHOO.util.Event.preventDefault(e);
}
function barClickTest2(e) {
alert('barClickTest2');
YAHOO.util.Event.preventDefault(e);
YAHOO.util.Event.stopEvent(e);
// Also tried:
// YAHOO.util.Event.stopPropagation(e);
// and:
// if (e.stopPropagation) {
// e.stopPropagation();
// } else {
// e.cancelBubble = true;
// }
}
私が予想しているのは、ユーザーが をクリックしfoo
て 3 クリック ハンドラーを追加し、次に をクリックできることbar
です。次に、ユーザーには 2 つのアラートが表示さbarClickTest1
れbarClickTest2
ます。代わりに、3 つのアラートすべてが発生します。は、 へのイベントの伝播を停止するというYAHOO.util.Event.stopEvent(e)
、私が期待することを行いませんbarClickTest3
。
コードを Firefox 3.0.7 と Safari 3.2.1 でテストしました。上記のように、私も試しYAHOO.util.Event.stopPropagation(e)
てみe.stopPropagation()
ました. それらのどれもトリックをしませんでした。
これは明らかに不自然な例ですが、問題を示しています。実際のソリューションでは、いくつかの条件が満たされた場合にのみ、イベントの伝播を防ぎます。
JavaScript のイベントに関する私の理解は、単純にめちゃくちゃなのでしょうか? どうすれば目標を達成できますか?