【发布时间】:2017-07-11 22:17:58
【问题描述】:
当仅单击一个元素时,我在 jQuery 中注册了多次单击时遇到问题。我已经阅读了Stack Overflow 上的一些其他线程来尝试解决它,但我认为这是我编写的代码。 HTML 代码无效,但这是由某些 HTML 5 和使用 YouTube 嵌入代码引起的。不会影响点击。
jQuery,在 document.ready 上触发
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 只看到一个,但两种浏览器都显示上述代码存在问题。
是我写错了代码还是有错误?
-- 一些额外的信息 ------------------------------------------
setupHorzNav 由我的代码中的另一个函数调用。我已经对此进行了测试并确认它仅在初始加载时被调用一次。
if ( portalWidth >= 1248 ) {
wrapperWidth = newWidth * 4;
setupHorzNav(newWidth);
}
else
{
wrapperWidth = '100%';
}
nav 'prev-next' 有多个实例。所有目标都是不同的锚点。都在同一个html页面中。
<nav class="prev-next">
<a href="#video-wrapper" class="prev">Prev</a>
</nav>
【问题讨论】:
-
你能发布你打电话给
setupHorzNav的地方和<nav class="prev-next">周围的代码吗? -
只是一些建议。在这种情况下您不需要使用
each,只需使用:$('.next, .prev').click(function (e) { //... });。而且您不需要使用所有三个e.stopPropagation();、e.preventDefault();和return false;。return false;自动执行preventDefault和stopPropagation。如果您仅想要执行其中一项,或者由于代码中可能存在问题而想要比return false更早地执行它,那么这些非常有用 -
另外,最好在循环之外定义你的事件处理函数(比如你的情况下的每个),以确保你没有多个相同的实例在内存中起作用。
-
我相信 chrome 也会显示 16 条日志,但在行前显示为一个数字。
-
在
setupHorzNav函数的开头放置一个console.log并检查它被调用了多少次。
标签: javascript jquery html