【问题标题】:addEventListener("click",...) firing immediately [duplicate]addEventListener(\"click\",...) 立即触发 [重复]
【发布时间】:2022-11-13 07:14:38
【问题描述】:

我正在尝试创建一些适当放置的指导性工具提示,用户可以点击这些提示来了解网站界面的工作原理。每个工具提示都有一个“下一个”链接,该链接通过修改类(以及 css)来切换上一个和下一个工具提示的可见性。

这是一些应该执行此操作的简化代码:

function displayTooltip(t){
  //...some code to determine the tooltip IDs "next" and "previous"
  document.getElementById(previous).className = "tooltip invisibleTooltip";
  document.getElementById(next).className = "tooltip";
}

document.getElementById("tooltip-link1").addEventListener("click", displayTooltip(2));

当我将此代码粘贴到控制台(或页面加载时)时,会立即调用 displayTooltip(并正确切换类)。如果我用alert() 替换displayTooltip,它会在我点击时触发,正如预期的那样。我究竟做错了什么?

【问题讨论】:

  • 当你说 document.getElementById("tooltip-link1").addEventListener("click", displayTooltip(2));您只在那里调用该方法,因此它会立即执行
  • displayTooltip(2) 更改为displayTooltip.bind(null, 2)。有关解释,请参见下面的答案。

标签: javascript html


【解决方案1】:

当您绑定事件时,您是calling 函数document.getElementById("tooltip-link1").addEventListener("click",displayTooltip(2));

您需要传递对该函数的引用。

改成下面

document.getElementById("tooltip-link1").addEventListener("click", function(){
   displayTooltip(2)
});

【讨论】:

  • 谢谢。您对调用和传递引用之间区别的解释使发生的事情变得可以理解(我认为 addEventListener 接受了引用,而不是函数它们)。
  • 谢谢。这就是我一直在寻找的。没有教程解释这一点。
  • 非常感谢您,我一直在寻找整个互联网!!!!
【解决方案2】:

当你写functionName 后跟() 时,它会调用函数。如果您希望将功能分配给处理程序,您应该这样做

document.getElementById("tooltip-link1").addEventListener("click", displayTooltip);

现在,如果您希望将参数传递给此函数,您可以将其包装在一个函数中,例如

document.getElementById("tooltip-link1")
  .addEventListener("click", function(){displayTooltip(2)});

或者你可以使用.bind()

document.getElementById("tooltip-link1")
  .addEventListener("click", displayTooltip.bind(this, 2));

【讨论】:

    【解决方案3】:

    您需要将此方法作为回调调用。由于您将其称为 displayTooltip(2) ,因此您最终将在该行调用该函数。

    您需要做的是绑定回调而不是在该行调用。 就像是

     .addEventListener('event', function()
         { displayTooltip(2) } 
    

    希望这会有所帮助

    快乐学习

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2017-08-23
      • 2021-03-31
      相关资源
      最近更新 更多