2012-10-05 32 views
2

我需要將焦點設置爲可排序列表的輸入和textarea元素。
這是我的代碼(1)。避免重複聽衆

a)當我加載列表時,它工作正常,因爲它爲每個輸入添加一個偵聽器。
b)當我添加一個新元素到列表中時,它會複製監聽器。

應該如何避免這種情況?
也許試圖使用事件代表團身上的單個監聽器? 任何想法?
感謝

(1)

setTimeout(function() { 
    var setFocus = function() { 
     $('.ui-sortable').find('input, textarea').click(function() { 
      $(this).focus(); 
     }); 
    }; 
    $('.ui-sortable').on('DOMNodeInserted', setFocus); 
    setFocus(); 
}, 0); 

回答

0

,您可以將其刪除,然後重新添加

$('.ui-sortable').off('DOMNodeInserted').on('DOMNodeInserted', setFocus); 

你可以嘗試添加像這樣

$(document).on('DOMNodeInserted', '.ui-sortable', setFocus); 
-1

嘗試委託事件因此,您不需要每次創建新元素時都分配事件

$(document).on('DOMNodeInserted', '.ui-sortable', setFocus); 
+0

難道你不想使用'off'而不是'unbind'?或者至少將某些東西傳遞給「解綁」? – Ian

+0

不通過將刪除所有與它相關的事件。如果我們想要,我們可以傳遞一個特定的事件。在這種情況下,DOMNodeInserted ..編輯帖子 –

0

您應該修改代碼以只添加監聽器一次,或刪除舊的監聽第一:

$('.ui-sortable').off('DOMNodeInserted').on('DOMNodeInserted', setFocus); 

如果您有其他聽衆,你不想刪除,你可以使用當您添加監聽器,這樣你只能刪除你感興趣的聽衆命名空間功能:

$('.ui-sortable').off('DOMNodeInserted.setFocus').on('DOMNodeInserted.setFocus', setFocus); 
2

這應該工作:

$('body').on('.ui-sortable input, .ui-sortable textarea', 'click', function() { 
    $(this).focus(); 
});