2013-11-21 26 views
0

我有一個大的div(整頁),它內部的我有較小的一個:JQuery的對(「文本菜單」)的身體,但特殊的一個

<div class="all"> 
    <div class="tiny"></div> 
</div> 

div.all是類似於板對我來說, div.tiny是一個小矩形。 我想在任何時候顯示我的特殊的上下文菜單div.all任何東西(或沒有)將獲得人民幣。但是當我在div.tiny上的人民幣時,我不想執行那個「默認」程序,而是一些(甚至更特別)的代碼。我曾與嘗試:

jQuery('body').on("contextmenu", ".all", function(){ /* special stuff */}); 

jQuery('body').off("contextmenu", ".all .tiny"); /* <- tried to turn off my...*/ 
/*...special stuff for .tiny that way*/ 

jQuery('body').on("contextmenu", ".tiny", function(){ 
    /* even more special stuff */ 
}); 

當我運行它,在它的內部div.all或元素RMB,我得到「特別的東西」來完成。但是當我在div.tiny上點擊人民幣時,我同時獲得了「特殊東西」(我不想)和「更特別的東西」(它非常特別,我不想要它!)。

任何解決方案?

爲了讓生活困難,我不能改變順序(div.all第一jQuery(),比我的功能div.tiny) - 我真正的項目的事情比較複雜,我必須保持某種原因(但仍然是我們看的順序非常合理 - 從全球事件到精確的事件)。

回答

7

這很簡單,你只需要停止事件傳播比你的.tiny處理程序更進一步。

$('.tiny').on('contextmenu', function(e){ 
    e.stopPropagation(); 
    // Your code. 
}); 

假設你可能有一大堆的.tiny的,或者他們正在動態生成的,可以將這個事件委託給.all

$('.all').on('contextmenu', '.tiny', function(e){ 
    e.stopPropagation(); 
    // Your code. 
}); 

另一種方法是檢查e.target

$('body').on('contextmenu', '.all', function(e){ 
    if(!$(e.target).hasClass('.tiny')){ 
    // The target element is not a .tiny div 
    } 
}); 

然後你只需要你的其他正常的處理程序.tiny

+2

天才!我等了1.5分鐘,回答我自己正在尋找一個小時。第二個選擇適合我最好的。謝謝你,先生 :) – PolGraphic

相關問題