如何防止多次附加事件处理程序



我有一个函数,将click事件处理程序附加到我的元素:

function attachClickToElem() {
    $('.elem').on('click', function () {
        alert('Hello World');
    });
}

问题是每当我调用这个函数时,n click处理程序附加到我的元素,所以当我调用了两次,当我点击元素时,我得到了两个alert

$(function () {
    attachClickToElem();
    attachClickToElem();
});

如何预防?然后检查我的元素已经有click处理器了?

这里是小提琴

Try

function attachClickToElem() {
    $('.elem').off('click.mytest').on('click.mytest', function () {
        alert('Hello World');
    });
}
$(function () {
    attachClickToElem();
    attachClickToElem();
});

演示:小提琴

另一种方式
function attachClickToElem() {
    $('.elem').filter(function(){
        return !$(this).data('myclick-handler');
    }).on('click.mytest', function () {
        alert('Hello World');
    }).data('myclick-handler', true);
}
$(function () {
    attachClickToElem();
    attachClickToElem();
});

演示:小提琴

Working jsFiddle Demo

使用.each()方法循环遍历元素,并检查标志是否已经带有.data()方法,如果标志为true,则跳过当前循环。否则,将事件处理程序附加到元素并将标志设置为true

function attachClickToElem() {
    $('.elem').each(function () {
        var $elem = $(this);
        // check if event handler already exists
        // if exists, skip this item and go to next item
        if ($elem.data('click-init')) {
            return true;
        }
        // flag item to prevent attaching handler again
        $elem.data('click-init', true);
        $elem.on('click', function () {
            alert('Hello World');
        });
    });
}

引用:

  • .each() - jQuery API文档
  • .data() - jQuery API文档

我相信差不多是这样的:

function attachClickToElem() {
    $('.elem:not(.has-click-handler)')
        .addClass('has-click-handler')
        .on('click', function () {
          alert('Hello World');
    });
}

相关内容

  • 没有找到相关文章

最新更新