jQuery点击事件一次点击触发多次
jQuery click event triggered multiple times off one click
当只点击了一个元素时,我在jQuery中注册多次点击时遇到了问题。我已经阅读了Stack Overflow上的一些其他线程,试图解决它,但我认为这是我写的代码。HTML代码无效,但这是由一些HTML5和使用YouTube嵌入代码引起的。没有影响单击的内容。
在document.ready 上触发的jQuery
function setupHorzNav(portalWidth) {
$('.next, .prev').each(function() {
$(this).click(function(e) {
var target = $(this).attr('href');
initiateScroll(target);
console.log("click!");
e.stopPropagation();
e.preventDefault();
return false;
});
});
function initiateScroll(target) {
var position = $(target).offset();
$('html, body').animate({
scrollLeft: position.left
}, 500);
}
}
HTML 示例
<nav class="prev-next">
<a href="#countdown-wrapper" class="prev">Prev</a>
<a href="#signup-wrapper" class="next">Next</a>
</nav>
在Firefox中,一次点击可以记录16次"点击!"!Chrome只看到一个,但两个浏览器都显示了上述代码的问题。
我是不是写错了代码,还是有bug?
--一些额外信息--------------------------------------------
setupHorzNav是由我代码中的另一个函数调用的。我已经对此进行了测试,并确认它在初始负载时只调用一次。
if ( portalWidth >= 1248 ) {
wrapperWidth = newWidth * 4;
setupHorzNav(newWidth);
}
else
{
wrapperWidth = '100%';
}
导航"上一个"有多个实例。所有的目标都是不同的锚。所有这些都在同一个html页面中。
<nav class="prev-next">
<a href="#video-wrapper" class="prev">Prev</a>
</nav>
尝试像这样取消绑定点击事件
$(this).unbind('click').click(function (e) {
});
绑定事件处理程序不需要.each()
。试试这个:
$('.next, .prev').click(function(e){
var target = $(this).attr('href');
initiateScroll(target);
console.log("click!");
e.stopPropagation();
e.preventDefault();
return false;
});
编辑:我认为是您从setupHorzNav
函数中附加事件处理程序的方式导致了它。从$(document).ready()
之类的函数中更改为只附加一次。
通过从事件处理程序调用的函数中附加事件处理程序,我成功地获得了多个事件处理程序的情况。其效果是单击事件处理程序的数量随着每次单击而呈几何级数增加。
这是代码:(和jsfiddle演示)
function setupNav() {
$('.next, .prev').each(function () {
$(this).click(function (e) {
setupNav();
var target = $(this).attr('href');
console.log("click!");
e.stopPropagation();
e.preventDefault();
return false;
});
});
}
setupNav();
查看如何从单击事件处理程序调用setupNav()
函数在连续单击时添加多个事件处理程序(以及click
日志消息)
由于您的问题不清楚您是否多次调用绑定函数,因此快速而肮脏的修复方法是:
$('.next, .prev').unbind('click').click(function() {
...
});
这里要做的是取消绑定以前为click
绑定的任何事件处理程序,然后重新绑定。
其他地方没有其他点击绑定吗?
你正在用ajax加载页面吗?
你也可以试试这个:
$('.next, .prev').click(function (e) {
var target = $(this).attr('href');
initiateScroll(target);
console.log("click!");
e.stopPropagation();
e.preventDefault();
return false;
});
- 主干模型更改事件只触发一次
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- 在单击事件中,第一次单击时激发代码一次,其余代码在所有单击时运行
- 简单的onclick事件只起过一次作用
- 一次点击,两次'单击'事件已启动
- Javascript事件发射器一次处理多个事件
- jQuery单击事件在一次之后不会触发
- JQuery只检查了一次事件工作
- 只为构造函数的所有实例触发一次事件侦听器
- 如何只调用一次事件处理程序,而不是每次单击项目时调用事件处理程序
- 在鼠标悬停时添加事件,如何只添加一次事件
- 每 60 秒仅启动一次事件 (JavaScript)
- 主干分组依据集合仅在一次事件单击后呈现
- 在没有jquery的情况下只执行一次事件侦听器函数
- 如何在Javascript中只执行一次事件处理程序
- jquery只在静态和动态元素上触发一次事件
- 在获得一次事件后删除ng单击事件
- HTML5 -视频播放时每隔几秒触发一次事件
- 为多个控件注册一次事件处理程序-是否可能
- 只运行一次事件