2011-03-16 26 views
2

我通過$(document).bind()綁定了頁面的每個元素的事件處理函數。

有沒有人知道如何解除特定元素的處理程序?

這裏是我的示例代碼,不工作的方式我想:這裏考慮到丹尼爾的回答

<html><head> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"> </script> 
</head> 
<body> 
    <div id="mid" style="cursor:pointer" >click me</div> 
    <div>sample</div> 
    <script type="text/javascript"> 
     var fun = function() { 
      alert('default handler'); 
     }; 
     $(document).bind('click.custom', fun); 
     //trying to unbind the handler but it remains there 
     $("#mid").unbind('click.custom'); 
    </script> 
</body> 
</html> 

又是這個問題:

var ff = function() { 
    alert('additional'); 
} 

$(document).bind('click.custom', fun); 
$(document).bind('click.custom2', ff); 
$("#mid").bind('click.custom', false); 

這裏好玩的事件處理程序是完全綁定的#mid元素,但是ff事件處理程序也沒有綁定,這對我來說是一個問題。

回答

1

它被稱爲事件冒泡。嵌套元素的事件發生在父母身上。

您應該bind#mid並從該處理程序返回false

+0

好吧,它很好,謝謝。但是,從處理程序返回false將重置其他名稱空間中的處理程序。有沒有什麼辦法可以解除只綁定特定命名空間的處理程序,並保持其他處理程序不變? – exodus 2011-03-16 00:35:18

0

只有一個事件綁定到文檔。由於冒泡,事件將被髮送到DOM層次結構,直到其傳播停止,或者它到達文檔。

如果來自#mid,您可以修改回調以忽略此事件,或者使用內置代理/實時達到相同的效果。

$(document).delegate('[id!="mid"]', 'click.custom', fun); 

這將忽略來自具有id爲「mid」的元素的事件。另一種替代方法是修改函數本身。

function fun() { 
    if (this.id == "mid") { 
     return; // if event came from #mid, ignore it. 
    } 
    // continue processing as normal 
} 
+0

修改回調函數是獲得所需結果的正確方法,我想過,但對於我的項目,我沒有權限修改初始綁定過程或回調函數。這讓事情變得非常艱難。但是,所有的答案對我原來的問題來說都是完美的,所以謝謝你們。 – exodus 2011-03-16 01:03:02

+0

如果您無法控制事件創建過程,則可以從jQuery中獲取原始事件處理函數,並將其包裝在外部函數中。然後你的邏輯忽略這個外部函數中的某些元素。據jQuery知道,沒有任何改變。 – Anurag 2011-03-16 01:05:21