我有一个函数,它会将click
事件处理程序附加到我的元素:
function attachClickToElem() {
$('.elem').on('click', function () {
alert('Hello World');
});
}
问题在于每当我调用此函数时,
n click
处理程序附加到我的元素,所以当
我把它叫了两次,当我点击我的元素时,我得到两个alert
:
$(function () {
attachClickToElem();
attachClickToElem();
});
我该如何预防呢?并检查我的元素
已经click
处理程序?
答案 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');
});
}