2013-06-19 79 views
1

如何獲取對JQuery中元素的點擊處理程序的引用?從JQuery中的元素獲取點擊處理程序

這裏就是我想要做:

商店單擊處理程序, 更改下單擊一下處理程序, 恢復原來的單擊處理

var originalClick = $(settings.currentTarget).click; 
$(settings.currentTarget).off("click"); 

$(settings.currentTarget).click(function (e) { 
    e.preventDefault(); 
    settings.model.modal.close(); 

    $(settings.currentTarget).off("click"); 
    $(settings.currentTarget).click(originalClick); 
}); 

上面的代碼工作原理第一次,然而,當我點擊元素再次失敗:

Uncaught TypeError: Object [object HTMLAnchorElement] has no method 'on' 

更新:
我現在意識到這是一個非常糟糕的設計,我正在嘗試。我通過在viewmodel中維護一個可見性布爾值來解決這個問題,如果它是真的,不要重新打開模式。

+0

'$(settings.currentTarget).click'是您綁定事件處理函數的函數。它不是事件處理程序本身。原始事件處理程序是如何綁定的?用jQuery或其他方式? –

+0

@FelixKling原始點擊處理程序使用淘汰賽進行綁定。 – mcottingham

+0

這可能有助於:http://stackoverflow.com/questions/2518421/jquery-find-events-handlers-registered-with-an-object – musicnothing

回答

6

$(...).click是jQuery click()方法,而不是您的事件處理程序。

您可以使用undocumented internal API讓事件處理程序的列表:

jQuery._data(elem, "events"); 
0

會發生什麼事,如果你嘗試這樣說?

var originalClick = $(settings.currentTarget).click; 
    $(settings.currentTarget).off("click"); 

    $(settings.currentTarget).on("click",function (e) { 
     e.preventDefault(); 
     settings.model.modal.close(); 

     $(settings.currentTarget).off("click"); 
     $(settings.currentTarget).click(originalClick); 
    }); 
+0

不幸的是,這給了我同樣的事情。我認爲我需要做的就是讓這個新的點擊處理程序在原始處理程序和stopPropagation之前執行,只是不知道該怎麼做。 – mcottingham

+0

我不認爲你正確使用.Off()。你爲什麼試圖解開你還沒綁定的東西?從jQuery文檔'off()方法刪除使用.on()附加的事件處理程序。「第一次調用它時,您從來沒有首先使用.on()附加它。你可能會混合東西。 –

+0

你可以提供更多關於你想要做什麼的信息嗎?什麼是'settings.currentTarget'?另外我注意到你說你正在使用knockout.js。任何原因這部分不能用jQuery完成? –