【发布时间】:2018-10-02 22:11:53
【问题描述】:
更新:
似乎问题与我的代码无关。我一直在通过浏览器同步运行网页,这就是问题出现的地方。当我直接在 Chrome 中打开静态网页时,一切似乎都正常。感谢大家的帮助!
我正在开发我的个人网站,并想通过按钮过滤我的项目列表。
<div class="filters">
<button class="btn btn-filter">Android</button>
<button class="btn btn-filter">iOS</button>
<button class="btn btn-filter">Web Dev</button>
<button class="btn btn-filter">Data Science</button>
</div>
我正在尝试通过这样做将事件侦听器附加到按钮,但似乎事件侦听器被附加了多次:
$(".btn-filter").each(function() {
console.log(this); // #1
$(this).click(function(e) {
e.preventDefault();
e.stopPropagation();
console.log(this); // #2
})
debugger;
})
我也尝试过使用类选择器。它不起作用,我切换到 .each() 和 $(this) 以确保元素只被分配一次事件处理程序。
$('.btn-filter').click(...)
日志显示每个按钮被选中一次以分配一个点击侦听器,但是当我实际点击按钮时,只有一些触发一次,一些触发 3 次。我使用一些,因为每次运行页面时它的行为方式并不总是相同。
我已经尝试了中描述的解决方案
this post(off(), unbind(), stopPropagation()),但没有一个有效。
使用 Google Chrome 的调试器工具,似乎在断点处,this 每次迭代都会引用 HTML 元素两次,尽管有些点击会触发一次或三次。
我想我可以分配 ID 并单独连接每个按钮,但我想知道我在这里做错了什么。谁能解释一下?
【问题讨论】:
-
使用
".btn-filter",您已经选择了所有按钮(使用该类)并且可以将一个处理程序绑定到所有按钮。 -
我已经尝试使用类选择器为类中的每个元素分配一个监听器,但结果是一样的。我切换到
each()和this进行调试 -
这段代码是否意外被多次调用,意思是
$(".btn-filter").each()被多次调用,例如在另一个事件处理程序中? -
您需要提供minimal reproducible example,因为代码本身不会导致您看到的情况
-
我无法复制:jsfiddle.net/2h1ygLzo/1 - 每次点击只会触发一次。问题一定出在其他地方。
标签: javascript jquery html