2011-07-29 94 views
6

此代表事件發射兩次(不總是,有時)。代表事件發射兩次

client.bindButtonClickFunction = function(){ 

    $("#client-plugin").delegate(".client-button", "click", function() 
    { 
     var id = this.id.split('-')[2]; 
     client.retrieveMessageByID(id); 
    }); 
}; 

我在插入所有「.client-button」之後調用該函數。

有關如何阻止它的任何想法?我嘗試了event.stopPropagation(),並且還沒有取消和重新授權。

這是在Chrome中作爲Chrome插件的一部分。

+1

困難沒有進一步的信息的話。最有可能你兩次調用'bindButtonClickFunction' ...順便說一句。你不需要等待'.client-button'被插入,'delegate'的工作方式類似於'live'。 –

+3

你試過stopImmediatePropagation嗎? http://api.jquery.com/event.stopImmediatePropagation/ – exoboy

+0

我只是修復了我遇到的兩次發射問題。就像@FelixKling所說的,我在一些$(document).ready()函數內部使用了delegate()聲明,實際上多次調用函數。 –

回答

20

您可以根據自己註冊代表上,你可能想要做的:

$("#client-plugin").undelegate('event').delegate('event', ...) 

另外,儘量從您的處理程序添加return false

+1

會有同樣的答案。我建議這樣做,然後再次測試,看看它是否仍然被調用兩次 - 如果是這樣,你知道問題在於兩次運行的方法調用,而不是方法本身。 – jammypeach

+0

@mrchief:我有同樣的問題,即我觸發了函數,並且觸發的類在我的代碼中聲明瞭兩次,所以當我點擊該類時,它觸發了兩次觸發器,並且如果我使用返回假然後我的複選框沒有被檢查,請你告訴任何其他解決方案? – Suleman

+0

@Suleman:'UnDelegate'也適用於你的情況。第二個實例化應該取消註冊,然後註冊您的處理程序一次。如果您有更多問題,請打開一個新問題併發布一些代碼。 – Mrchief

7

你需要立即停止傳播

$("#client-plugin").on(".client-button", "click", function (e) { 
    e.stopImmediatePropagation(); 
    var id = this.id.split('-')[2]; 
    client.retrieveMessageByID(id); 
}); 
+0

像http://stackoverflow.com/a/14813418/3786343 – Kamlesh