2015-09-25 38 views
4

我有一種情況,我使用data屬性data-command在整個網站的特定部分的許多情況下,而不是綁定噸的單獨的點擊事件,我決定只使用一個,並使用一個開關,如:將點擊事件綁定到通過AJAX加載而未授權的內容?

$('[data-command]').on('click', function(event) { 

    // Prevent default click action 
    event.preventDefault(); 

    // Get command 
    var command = $(event.target).data('command'); 

    switch (command) { 
     // Do stuff... 
    } 

    // Prevent default click action (IE 8) 
    return false; 

}); 

然而,它試圖讓它在通過AJAX加載的數據上工作時就成了一個問題。

這顯然工程..

$('#existing_element').on('click', '[data-command]', function(event) { 

...但因爲它應該是在該網站上面也不會在所有頁面上工作的那一段許多不同的網頁。

可以只要確保給出具體id的地方,我加載我所有的Ajax數據父包裝,但是這將意味着到兩個獨立的結合事件與一羣相同的代碼。

我也可以這樣做是爲了覆蓋所有基地..

$(document).on('click', '[data-command]', function(event) { 

...但是這可能不是個明智的想法結合到文檔中的元素。

編輯: Html數據通過jQuery的html方法被加載到DOM

任何乾淨我可以處理這個或我應該創建兩個不同的綁定事件來處理每種情況?

+0

你可以添加AJAX的代碼,你是如何在DOM – Tushar

+0

添加元素'..但是這可能不是個明智的想法元素結合到document.' - 到底爲什麼? – raina77ow

+0

@ raina77ow http://stackoverflow.com/questions/12824549/should-all-jquery-events-be-bound-to-document - 我得到的是它應該避免。 – Brett

回答

2

事件委託是在動態創建的元素上綁定事件的最佳方法。由於您不想使用事件委託,因此請使用以下方法來綁定事件。

$('[data-command]').off('click').on('click', clickHandler); 

// Somewhere in the same scope 
function clickHandler(e) { 
    // Handle click event here 
} 

在使用html()添加動態創建的元素後添加此項。

off('click')將首先解除之前應用的點擊事件處理程序,然後on('click',將綁定與選擇器匹配的所有元素上的點擊處理程序。


編輯

這似乎是一次又一次地重複相同的代碼。我不能保持乾爽嗎?

是的,你可以通過創建一個函數來綁定事件並在你想綁定事件時調用相同的函數來保持代碼乾淨和乾淨。

function clickHandler(e) { 
    // Handle click event here 
} 

function bindEvent() { 
    $('[data-command]').off('click').on('click', clickHandler); 
} 

$(document).ready(bindEvent); 

... 

$.ajax({ 
    ... 
    success: bindEvent 
.... 
+0

這不是基本上只是綁定元素兩次,因爲你說要通過'html'將這段代碼添加到頁面?我試圖弄清楚一切都可以綁定在同一件事情上。 – Brett

+0

@Brett這不會爲元素綁定事件兩次,如果先前綁定的事件先被移除然後綁定新的事件。爲了只爲所有元素做同樣的事情,只需要使用事件委派。 – Tushar

+0

對不起,單詞的選擇不好。我的意思是兩次有兩次相同的代碼,而不是被綁定兩次。就像我可以很容易地將它與事件委託綁定在一起,但這僅僅意味着重複代碼,這就是我將用這種方法進行的操作。 – Brett

相關問題