2009-01-29 30 views
9

我有以下述方式設置onclick事件處理程序:取消jQuery的事件處理

element.onclick = function() { /*code */ } 

想象有使用jQuery方法結合()或類似的處理程序事件處理程序設置。

$('element').bind('click', function(){/*another function*/}) 

我該如何防止從開始描述的處理程序中調用使用jQuery定義的處理程序?

NB stopPropagation()等jQuery的方法不起作用,因爲它是通過本機事件對象傳遞。

回答

7

我不是100%肯定你問什麼,但也許這將幫助:

您可以通過jQuery的暴露事件構造函數創建一個新的事件對象(符合W3C DOM):

對於例如:

element.onclick = function(e) { 
    var aBetterEventObject = jQuery.Event(e); 
    // Now you can do what you want: (Cross-browser) 
    aBetterEventObject.preventDefault() 
    aBetterEventObject.isDefaultPrevented() 
    aBetterEventObject.stopPropagation() 
    aBetterEventObject.isPropagationStopped() 
    aBetterEventObject.stopImmediatePropagation() 
    aBetterEventObject.isImmediatePropagationStopped() 
} 

編輯:通過您的問題再次閱讀,我不認爲是傳播問題 - 你似乎想從內運行,即使取消的事件處理程序t處理程序 - 我不確定這是可能的。你可以解除綁定所有處理程序(jQuery(elem).unbind('click')),但我不認爲這就是你之後...

3

嘗試在jQuery事件中添加以下行處理程序:

return false; 
5

繼續從JimmyP的回答。我試過這個

$('#x').click(function(e){ 
    alert('hello'); 
}); 
document.getElementById('x').onclick = function(){ 
    $('#x').unbind('click'); 
    alert("goodbye"); 
} 

jQuery事件在這個例子中運行一次。我不認爲你可以依賴被調用的順序,但是你定義了它們,所以我想你必須接受jQuery事件可能會觸發一次。首先添加onclick可以防止jQuery事件發生,但如我所說,我認爲這不可靠。

+0

+1我認爲你不能保證事件處理程序被調用的順序 – 2009-01-30 15:35:15

+0

2meouw:正如我所解釋的,解除綁定將放棄處理程序警告'hello'永遠。它不好:)用例可以是:document.getElementById('x')。onclick = function(){if(/ * some case * /){/ *防止調用函數提醒'HELLO'* /}}所以當我再次點擊元素時,情況可能是錯誤的,應該調用處理程序。我清楚了嗎? :) – glaz666 2009-01-29 14:57:06

2

jquery有一個命名空間事件的方法。爲您解除綁定的命名空間的情況下你的正常的onclick應該不會受到影響

$("a").bind("click.custom1",function(){ ... }); 
$("a").bind("click.custom2",function(){ ... }); 
$("a").trigger("click.custom2"); 
$("a").unbind("click.custom2"); 

只要:http://docs.jquery.com/Namespaced_Events

您可以添加,觸發和刪除通過命名空間綁定到同一事件不同的功能。如果這不起作用,您可能必須將兩個單獨的名稱空間綁定到上述的點擊事件。