[英]Jquery one() function fires twice on click
我的Jquery one()
函数在第二次单击而不是第一次单击后死亡。 这是我的HTML
<div class="box">
<div class="call" data-tai="5">CLICK</div>
</div>
这是我的Jquery
$('body div').one('click', '.call', function() {
var mother = $(this).parent();
if(mother.css('position') === 'static')
mother.css('position', 'relative');
var tai = $(this).data('tai');
$.ajax({
method: 'GET',
url: '/bootstrap/call.php',
data: 'tai='+tai,
dataType: 'html',
success: function(ret) {
mother.append(ret);
},
});
return false;
});
有趣的是,如果我不使用return false;
,它会在第一次单击后死亡。 但是会发生bubbling
,并且会在box
元素内附加2个html标签而不是1个。 感谢帮助
$('body div')
会同时选择两个div,并将点击处理程序都附加到它们上。 当您单击嵌套的div时,将同时触发两次单击。 使用特定的选择器可以避免这种情况。
$('.call')
也许可以实现这一目标。
这是因为使用.one
绑定的事件处理程序将为jQuery集合中的每个元素触发一次 。 由于return false
停止了事件的传播,因此如果单击.call
元素,则不会执行父元素的单击处理程序,但是父元素仍然具有活动的单击处理程序。 您应该使用更具体的选择器来选择目标元素。 如果点击处理程序应绑定到div.call
元素:
$('.box div.call').one(...);
现在,如果.box
元素具有9个div.call
后代,那么您就有9个单击处理程序! 单击每个元素后,jQuery取消绑定该特定元素的处理程序。
不是所有元素一次 ,而是每个元素一次 。
如果应该为所有匹配的元素调用一次处理程序,则可以使用.one
方法的委托版本:
$(document).one('click', '.box div.call', function() {
// ...
});
如果要委托事件并使处理程序为动态生成的元素工作一次,则可以使用.on
方法和:not
选择器:
$(document).on('click', '.box .call:not(.clicked)', function() {
$(this).addClass('clicked');
// ...
});
现在, 为每个.call
元素调用一次处理程序。 由于:not
排除具有.clicked
类的元素,因此选择器与已单击的元素不匹配。
事件在JavaScript中冒泡。 您的密码
$('body div').one('click', '.call', function() {
}
都连接
<div class="box"> <!-- This -->
<div class="call" data-tai="5">CLICK</div> <!-- And this -->
</div>
您需要一个更具体的选择器。 如果此div是主体中的父元素,如下所示:
<body>
<div class="box">
<div class="call" data-tai="5">CLICK</div>
</div>
<div class="box">
<div class="call" data-tai="5">CLICK</div>
</div>
</body>
那么您可以使用如下选择器:
$('body > div').one('click', '.call', function() {
}
问题是-您希望将点击事件放置在哪里? 也许有box类的div?
$('div.box').one('click', '.call', function() {
}
假设.call div是动态添加到.box div中的。
PS-如果您想停止冒泡,建议您将事件对象传递给click事件并调用stopPropagation()
$('div.box').one('click', '.call', function(evt) {
evt.stopPropagation(); // no bubbling
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.