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

9 jquery event-handling

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

function attachClickToElem() {
    $('.elem').on('click', function () {
        alert('Hello World');
    });
}
Run Code Online (Sandbox Code Playgroud)

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

$(function () {
    attachClickToElem();
    attachClickToElem();
});
Run Code Online (Sandbox Code Playgroud)

我该怎样预防呢?并检查我的元素是否已经click处理?

这是小提琴

Aru*_*hny 12

尝试

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

$(function () {
    attachClickToElem();
    attachClickToElem();
});
Run Code Online (Sandbox Code Playgroud)

演示:小提琴

其他方式

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

$(function () {
    attachClickToElem();
    attachClickToElem();
});
Run Code Online (Sandbox Code Playgroud)

演示:小提琴


小智 5

工作 jsFiddle 演示

使用.each()通过你的元素的方法循环,并检查标志与已经事件处理 .data()方法,如果标志是true,跳过当前循环。否则,将事件处理程序附加到 element 并将标志设置为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');
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

参考: