Javascript 当dom被阻止时,如何注册单击事件?

Javascript 当dom被阻止时,如何注册单击事件?,javascript,html,dom,dom-events,Javascript,Html,Dom,Dom Events,当我的JavaScript代码循环3秒时,我点击HTML页面中的按钮,此时什么也没有发生。DOM没有响应。我假设在JavaScript代码完成执行之前,它会被阻止。但是3秒钟后,我在控制台日志中得到了“按钮点击事件”和“点击事件” DOM如何注册事件,即使它被我的JavaScript代码阻止 //长时间运行的函数 函数waitThreeSeconds(){ var ms=3000+新日期().getTime(); 而(新日期()

当我的JavaScript代码循环3秒时,我点击HTML页面中的按钮,此时什么也没有发生。DOM没有响应。我假设在JavaScript代码完成执行之前,它会被阻止。但是3秒钟后,我在控制台日志中得到了“按钮点击事件”和“点击事件”

DOM如何注册事件,即使它被我的JavaScript代码阻止

//长时间运行的函数
函数waitThreeSeconds(){
var ms=3000+新日期().getTime();
而(新日期()

点击我当您将一个处理程序绑定到一个单击事件,并且该单击事件发生时,DOM将在JavaScript的事件队列中放置一个作业,即对事件处理程序的调用。请注意,这发生在“幕后”——这不是JavaScript代码,而是编译(低级)代码。该进程可以与执行JavaScript并发执行

如果JavaScript引擎正忙于执行代码,那么该作业就位于队列中。当JavaScript代码最终完成执行,因此其调用堆栈为空时,引擎将处理它在事件队列中找到的下一个作业。然后执行作业。在这种情况下,作业是相关的单击处理程序

在您的示例中,当您单击按钮时,将向队列中添加两个作业,因为该单击事件有两个处理程序(在按钮和文档上)。在页面上单击按钮旁边时,将有一个作业添加到队列中


当JavaScript在单击时不执行代码时,JavaScript引擎会持续监视队列,因此它会立即对单击做出“反应”,执行它在队列中找到的作业。

当您将处理程序绑定到单击事件,并且单击事件发生时,DOM会放置作业,即在JavaScript的事件队列中调用事件处理程序。请注意,这发生在“幕后”——这不是JavaScript代码,而是编译(低级)代码。该进程可以与执行JavaScript并发执行

如果JavaScript引擎正忙于执行代码,那么该作业就位于队列中。当JavaScript代码最终完成执行,因此其调用堆栈为空时,引擎将处理它在事件队列中找到的下一个作业。然后执行作业。在这种情况下,作业是相关的单击处理程序

在您的示例中,当您单击按钮时,将向队列中添加两个作业,因为该单击事件有两个处理程序(在按钮和文档上)。在页面上单击按钮旁边时,将有一个作业添加到队列中


当JavaScript在单击时不执行代码时,JavaScript引擎会持续监视队列,因此它会立即对单击做出“反应”,执行它在队列中找到的作业。

所以DOM即使在调用堆栈已满时也在侦听用户事件,然后在调用堆栈为空时将单击事件排队?DOM侦听器是否独立于在其上执行的javascript运行?是的,DOM使用自己的线程在较低级别与操作系统通信。这不是JavaScript引擎使用的线程。JavaScript世界和较低级别世界之间的联系点是它的事件队列。因此,DOM即使在调用堆栈已满时也在侦听用户事件,然后在调用堆栈为空时对单击事件进行排队?DOM侦听器是否独立于在其上执行的javascript运行?是的,DOM使用自己的线程在较低级别与操作系统通信。这不是JavaScript引擎使用的线程。JavaScript世界和低级世界之间的接触点是它的事件队列。