2012-10-05 30 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(); 
});