2010-08-04 62 views
12

也許我完全錯過了在jQuery中處理的東西,但這裏是我的問題。jquery臨時解綁事件

假設有一些事件綁定,就像

$(element).bind("mousemove", somefunc); 

現在,我想介紹一個新的鼠標移動綁定不覆蓋舊的,但暫時排除(取消)它。換句話說,當我綁定我的函數時,我必須確定沒有其他函數會執行該事件,直到我恢復它爲止。

我在尋找類似:

$(element).bind("mousemove", somefunc); 
// Somefunc is used regularly 
var savedBinding = $(element).getCurrentBinding("mousemove"); 
$(element).unbind("mousemove").bind("mousemove", myfunc); 
// Use myfunc instead 
$(element).unbind("mousemove", myfunc).bind("mousemove", savedBindings); 

當然,somefunc是不是我的控制之下,或者這將是無用的:)

我的理解是可以綁定多個對同一事件起作用,並且這些功能的執行不能預先確定。 我知道停止事件傳播和即時事件傳播,但我認爲他們在我的情況下是無用的,因爲執行順序無法確定(但也許我得到這些錯誤)。

我該怎麼做? 在此先感謝 〜亞基

編輯:我需要突出顯示:我需要以前安裝的處理程序(somefunc)不執行。我沒有定義該處理程序,它可能會或可能不存在,但它由第三方用戶安裝。

編輯2:好吧,這是不可行的現在,我想我需要eventListenerList,這在大多數瀏覽器尚未實現。 http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html

回答

7

另一種方法可能是使用自定義事件,東西沿着這些線路:

var flag = 0; 
$(element).bind("mousemove", function() { 
    if(flag) { 
     $(this).trigger("supermousemove"); 
    } else { 
     $(this).trigger("magicmousemove"); 
    } 
}).bind("supermousemove", function() { 
    // do something super 
}).bind("magicmousemove", function() { 
    // do something magical 
}); 

$("#foo").click(function() { 
    flag = flag == 1 ? 0 : 1; // simple switch 
}); 

高度惱人的演示在這裏:http://jsfiddle.net/SkFvW/

+0

哇!我沒有那個:)這可以完全工作!謝謝! – AkiRoss 2010-08-04 23:29:14

+0

哎呀,對不起,我錯了:該解決方案不起作用,因爲我需要禁用之前綁定的mousemove處理程序。 – AkiRoss 2010-08-05 00:31:44

+0

@AkiRoss - 爲什麼你需要禁用以前的處理程序?通過翻轉開關,您可以獲得相同的效果。 – JasCav 2010-08-05 00:38:11

0

如果好該事件被綁定到多個要素:

$('.foo').click(function() { 
    if (! $(this).hasClass('flag')) { 
     do something 
    } 
}); 

(將類'標誌'添加到解除綁定,將其添加到'綁定')