【问题标题】:Event listeners and hoisting in jsjs中的事件监听器和提升
【发布时间】:2018-01-29 03:07:03
【问题描述】:

我对 js 中的提升感到困惑。

我知道函数和变量被移动到程序的顶部,但是像“监听器”这样的东西会发生什么?

几天前我正在做这样的事情:

function a(){
  //... 
  $("#myElement").trigger("click");
}

$("#myElement").on("click", function(){
  console.log("click!");
});

我意识到如果我尝试在声明之前引用一个事件,该引用将被忽略。

所以,更改顺序后,它起作用了:

$("#myElement").on("click", function(){
   console.log("click!");
});

function a(){
  //... 
  $("#myElement").trigger("click");
}

所以,我的问题是:如果最后一个“函数”被移动到顶部(由于提升)导致类似于第一个示例的结果,为什么最后一个示例会起作用事件调用不起作用?

【问题讨论】:

  • 无论哪种方式,您的代码都可以正常工作(当然,一旦您调用 a() - 您的代码不会)
  • 我已经更正了。感谢您指出这一点
  • 我删除了对该错误的引用,但您的代码无论哪种方式都可以正常工作 - a() 是如何被调用的?那可能是你做错了

标签: javascript jquery hoisting


【解决方案1】:

这完全取决于您何时致电a()。最后,您的事件处理程序只需要在执行trigger() 之前注册。通常使用document.ready(...) 解决此问题。有关说明,请参阅 jquery documentation

function a(){
  //... 
  $("#myElement").trigger("click");
}

$("#myElement").on("click", function(){
   console.log("click!");
});


a();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="myElement"/>

【讨论】:

  • 使用 vanilla js 创建的监听器是不是也一样?
  • 简而言之:是的。但是,有一些“陷阱”需要注意。例如:如果您正在使用 JS 和 HTML,并且您尝试绑定到尚未呈现的 HTML 元素,则无法绑定该事件。最好最后加载您的 javascript,并等待页面完全加载后再应用侦听器。
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多