我有一个函数,将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');
});
}