2013-04-30 59 views
1

這段代碼有什麼問題嗎?jquery off沒有觸發

$(document).ready(function() { 

    if($("#textbox-id-recipient").val()) { 
     console.log("In"); 


     $(document).on("click", "#textbox-id-recipient", function(event) { 
      addEmail($(this)); 
     }); 

     $('#textbox-id-recipient').trigger('click'); 

     $("#textbox-id-recipient").off("click"); 
    } 

... 
}); 

因此,頁面刷新後,如果文本框有什麼東西,它會觸發點擊事件,觸發「開」事件之一,但它應該後起飛的事件,但不知何故,當我手動點擊文本框,on事件仍然觸發

+1

您從未將事件綁定到該元素。你將它綁定到文檔... – Ian 2013-04-30 00:40:20

+1

我會好奇你爲什麼要綁定到'document'。既然你已經知道這個元素在那裏,似乎沒有任何事件委派需要。 – 2013-04-30 00:41:32

+0

嘗試通過使用此代碼刪除處理程序。它應該工作:$(document).off(「click」,「#textbox-id-recipient」) – jmartsch 2013-04-30 00:44:01

回答

2

評論

考慮到這聲明:

$(document).on("click", "#textbox-id-recipient", function(event) { 
    addEmail($(this)); 
}); 

你點擊處理程序綁定到document,當click事件冒泡從哪裏開始點擊一路被調用。

$('#textbox-id-recipient').trigger('click'); 

這將模擬您的元素上的單擊事件;如果事件沒有處理,jQuery會通過父項將元素樹向上展開,直到達到document

$("#textbox-id-recipient").off("click"); 

即使上面點擊觸發按預期工作,.off()只會看看目前的元素,也就是說,它不會自動執行「泡沫起來」。

替代1

因此,你應該禁用你連接它在相同的元素上單擊處理程序,即:

$(document).off("click", "#textbox-id-recipient"); 

順便說一句,知道標識符必須是唯一的,你可能以及直接在#textbox-id-recipient上附加事件處理程序,除非元素僅在以後添加。

$('#textbox-id-recipient').on('click', function(event) { 
}); 

替代2

另外,如果點擊只能一次處理,使用.one()

$('#textbox-id-recipient').one('click', function(event) { 
}); 

或者,如果你想使用事件委派:

$(document).one('click', '#textbox-id-recipient', function(event) { 
}); 
2

將您的事件綁定到元素,而不是文檔。

$('#textbox-id-recipient').on("click", function(event) { 
    addEmail($(this)); 
}); 

$('#textbox-id-recipient').trigger('click'); 

$("#textbox-id-recipient").off("click"); 
+1

綁定到文檔沒有什麼問題,所以處理程序也綁定到動態添加的元素。我知道......網頁上只能有一個ID。只是說。 – jmartsch 2013-04-30 00:51:00

+0

我沒有說與文檔綁定有什麼問題。 – 2013-04-30 03:29:30

3

使用.one()

if($("#textbox-id-recipient").val()) { 
    console.log("In"); 

    $("#textbox-id-recipient").one("click", function(event) { 
     addEmail($(this)); 
    }); 

    $('#textbox-id-recipient').triggerHandler('click'); 
} 

演示:Fiddle