避免重复听众

时间:2012-10-05 17:05:22

标签: javascript jquery events onclicklistener

我需要关注可排序列表的输入和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);

4 个答案:

答案 0 :(得分:2)

这应该有效:

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

答案 1 :(得分:0)

您可以将其删除并重新添加

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

您可以尝试像这样添加

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

答案 2 :(得分:0)

您应该修改代码以仅添加一次侦听器,或者首先删除旧侦听器:

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

如果你有其他你不想删除的监听器,你可以在添加监听器时使用命名空间功能,这样你就只能删除你感兴趣的监听器:

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

答案 3 :(得分:-1)

尝试委派活动..因此,每次创建新元素时都不需要分配事件

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