をSpecialChildDiv
はおそらくMainDiv
の子孫であるので、それは最初に呼び出されます。これは、イベントがターゲットから飛びぬけて、その順序で途中で見つかったハンドラを呼び出すためです。
一つの可能性はsetTimeout
を使用してSpecialChildDiv
ハンドラ非同期にHandler2
への呼び出しを行うことであろう。
$('#MainDiv').on({
click: function() {
Handler1($(this));
}
}, '.MyClass');
$('#SpecialChildDiv').on({
click: function() {
setTimeout($.proxy(function() {
Handler2($(this));
}, this), 0);
}
}, '.MyClass');
だから、ハンドラ自体はすぐに呼び出されますが、あなたのHandler2
関数がHandler1
が呼び出された後まで実行されません。
私はまた、に渡す関数で正しいthis
の値を保持するために$.proxy
を使用しました。
少しオフトピックが、あなたはthis
ではなく引数として渡すので、要素への参照であることをHandler1
のでHandler2
を変更する場合は、あなたのコードクリーナーを作ることができます...
$('#MainDiv').on({
click: Handler1
}, '.MyClass');
$('#SpecialChildDiv').on({
click: function() {
setTimeout($.proxy(Handler2, this), 0);
}
}, '.MyClass');
関数内で$(this)
を実行するだけで、要素をjQueryオブジェクトにラップする必要があります。合格する他の議論があるなら、これは役に立たないかもしれませんが。
以下のコメントに基づいて、このテクニックをさまざまな子孫要素に適用する必要があるようです。
コードを乾燥させるために、あなたのクリックハンドラ...
function async_handler_factory(the_handler) {
return function() {
setTimeout($.proxy(function() {
the_handler($(this));
}, this), 0);
};
}
のファクトリを作成することができます...そして、このようにそれを使用して...
$('#MainDiv').on({
click: Handler1
}, '.MyClass');
$('#SpecialChildDiv').on({
click: async_handler_factory(Handler2)
}, '.MyClass');
$('#AnotherChildDiv').on({
click: async_handler_factory(Handler3)
}, '.MyClass');
だから、それはです同じ原則。ただHandlerN
関数をasync_handler_factory
に渡して、setTimeout
のHandlerN
を呼び出すことで、元のコードと同じになるclick
ハンドラ関数を作成して返します。
だけ$.proxy
についての混乱を避けるために、ここでそれを排除し、更新されたバージョンです。
function async_handler_factory(the_handler) {
return function() {
var self = this;
setTimeout(function() {
the_handler($(self));
}, 0);
};
}
これは、実際にあなたのソリューションの仕事をしているsetTimeout
だということを示しています。
EDIT:別の場所にasync_handler_factory
に別の名前を持っていました。一定。
これは2つの異なるハンドラです...私はあなたが何を求めているのかよく分かりません... – Neal
申し訳ありませんが、最後には「.myClass」が何をしていますか? http://api.jquery.com/on/ – Blazemonger
私はそれが内側から働くと思う。 –