【问题标题】:jQuery click firing multiple timesjQuery单击多次触发
【发布时间】: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


【解决方案1】:

您正在类上运行一个 for each 循环,因此它将为该类的每个元素创建一个新的事件处理程序。如果你只想要一个事件处理程序,你需要这样写:

$(".btn-filter").click(function() {
  console.log($(this).text());
});

显示或隐藏特定内容的按钮最好使用数据值或 id 进行描述

编辑:在得知你有这个之后,我会补充说你提供的任何东西都不会导致你收到的错误。

【讨论】:

  • 对不起,我没有在帖子中澄清;我也尝试过同样的结果。我切换到.each() 试图了解事件处理程序是否实际上被多次注册。
  • 请注意,这实际上与 OP 的代码相同。两者都使用循环将事件侦听器放在每个元素上。 $(".btn-filter").click() 只是在内部做循环
  • 另外,我是 JS 的新手,所以我想确定,我在课堂上使用 .each(),但在该调用的范围内,我正在使用$(this) 来分配点击,所以应该只做类中的一个元素,对吧?
  • 您仍然需要有一种方法来指定您希望在单击按钮时执行的操作。通常这是使用 id 或数据值完成的。否则,如果您单击任何按钮,将运行完全相同的代码
  • 虽然我和你在同一条轨道上,丹尼尔,我用原始代码做了一个简单的测试。所描述的行为无法重现:jsfiddle.net/2h1ygLzo/1
【解决方案2】:

你的代码有问题

$(".btn-filter")**.each**(function() {

你应该通过简单地做这样的事情来简化它

$(".btn-filter").click(function(e) {
      e.preventDefault();
      e.stopPropagation();
      console.log(e); 
  debugger;
})

由于您已经通过类名 $(".btn-filter") 进行选择,因此应该将函数添加到所有元素中。

【讨论】:

  • 我已经更新了帖子以澄清这是我的初始代码,它不起作用并导致我执行.each()$(this) 以确保我没有重新注册事件处理程序。
  • 您确定没有从多个位置初始化/声明函数吗? T
  • 代码被一个函数包裹,并且该函数在文档准备好时被调用一次。此外,一些按钮按预期触发一次,但其他按钮触发 3 次,所以虽然我考虑过这一点,但我使用它的方式没有问题。这看起来像是浏览器同步问题。
【解决方案3】:

使用类调用点击事件并使用.html()获取点击值

$(document).ready(function () {
        $(".btn-filter").click(function() {
                    alert($(this).html());
                })
    });

JSFiddler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2018-11-08
    • 2011-01-08
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多