2011-09-16 10 views
7

.bindを使用して子イベントと親イベントをバインドすると、子イベントはイベントの伝播を停止してfalseを返します。しかし、私がデリゲートを使用すると、falseを返します。イベントの伝達を停止しません。デリゲートを使用しているときにイベントの伝播を停止する方法はありますか?

http://jsfiddle.net/J3EAQ/

HTML:

<div class="parent"> 
    <div class="child"></div> 
    <div class="child"></div> 
</div> 

JS:

$('.parent').delegate('.child','click',function(e){ 
    alert('child click'); 
    return false; 
}); 
$('.parent').bind('click',function(e){ 
    alert('parent click'); 
}); 
+0

可能な重複はありますか? http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false –

答えて

8

e.stopPropagation()はこの場合は機能しません。代わりにe.stopImmediatePropagation()を使用してください。ここをクリックfiddle

+0

はい、それは私が探していた解決策です。ありがとう! – codez

1

あなたがいないfalseを返すことで、伝播を防ぐためにe.stopPropagation()を使用する必要があります。

return falseは技術的に2つのものです。 1)デフォルト動作を防止し、2)伝搬を停止する。 eのメソッド呼び出しに切り替えて、問題が解決するかどうか確認してください。

+0

まだこの問題は解決していません。 –

+0

@Interstellar_Coder - あなたの解決策は良いです。決して 'stopImmediatePropagation()'について知りませんでした。ありがとう! – Tejs

4

なぜ2つのクリックハンドラあなたは1を持つことができたとき:

$('.parent').click(function (e) { 
    if ($(e.target).is('.child')) { 
     alert('child click'); 
    } else { 
     alert('parent click'); 
    }  
}); 

ライブデモ:http://jsfiddle.net/J3EAQ/2/


このパターンの一般化:

$(element).click(function (e) { 
    if (e.target === this) { 
     // this element was clicked directly 
    } else { 
     // this element was NOT clicked directly 
     // a descendant of this element was clicked 
    }  
}); 

別個のハンドラ?

$('.parent').click(function (e) { 
    if (this ==== e.target) { 
     parentClicked.call(e.target, e); 
    } else { 
     childClicked.call(e.target, e); 
    }  
}); 

function childClicked(e) { 
    // child click handler 
} 

function parentClicked(e) { 
    // parent click handler 
} 
+0

技術的には問題は解決しますが、私はさまざまな要素の機能を分離したいので、2つのイベントハンドラを持つソリューションが必要です。 – codez

+0

その後、 '.delegate'を使わず、両方の場所で' .click'を使うだけです。 – Blazemonger

+0

@codezこれも可能です。私の更新を参照してください。 –

0

あなたはいつもイベントが伝播されていないe.stopPropagation()

+0

動作しません:http://jsfiddle.net/J3EAQ/3/ – codez

-1

使用することができます。 Clickハンドラを.parentにバインドしていて、.parentをクリックしている場合

0

私にとっては、他のクリックイベントによってトリガーされたくないクリックハンドラーのクリックターゲットのクラス名をチェックすることでした。このようなもの。

if(e.target.className.toString().indexOf("product-row") > -1){ 
     // Only do stuff if the correct element was clicked 
    } 
関連する問題