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

时间:2013-06-08 03:10:10

标签: jquery event-handling

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

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

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

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

我该如何预防呢?并检查我的元素 已经click处理程序?

Here is fiddle

3 个答案:

答案 0 :(得分:12)

尝试

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

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

演示:Fiddle

另一种方式

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

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

演示:Fiddle

答案 1 :(得分:4)

<强> 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');
        });
    });
}

参考文献:

答案 2 :(得分:0)

我相信接近这一点的事情:

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