【问题标题】:Understanding setTimeout了解 setTimeout
【发布时间】:2016-12-07 02:19:22
【问题描述】:

我正在用 JavaScript 玩 setTimeout。我对它是如何工作的感到困惑。我有以下代码:

<input type="button" value='click'>

<script>
var input = document.getElementsByTagName('input')[0]

input.onclick = function() {
  setTimeout(function() { 
    input.value +=' input'  
  }, 0)
}

document.body.onclick = function() {
  input.value += ' body'
}
</script>

当我们单击该函数时,它会将文本正文输入附加到按钮元素。我知道这是因为首先触发了父(主体)事件,并且在下一个计时器滴答声中,子(输入)事件被执行,因为它稍后被推送到事件队列中。

我现在尝试了以下代码:

var input = document.getElementsByTagName('input')[0]

document.body.onclick = function() {
  setTimeout(function() { 
    input.value +=' body'  
  }, 0)
}

input.onclick = function() {
  setTimeout(function() { 
    input.value +=' input'  
  }, 0)
}

这会将文本输入主体附加到按钮元素。当两个超时都设置为0时,如何确定这里的执行顺序?在这种情况下,它们按什么顺序推送到事件队列?

【问题讨论】:

  • 它们按照预定的顺序执行。

标签: javascript dom-events settimeout


【解决方案1】:

点击首先在最里面的元素上触发,然后冒泡。

因此,在您的第一个示例中,首先触发了对输入的点击,但由于 setTimeout 它没有立即执行,而是添加到队列中,因此触发并执行了正文上的事件。

现在第二个场景是解释性的,首先触发输入,由于setTimeout,它会将执行添加到队列中,但是当触发文档上的事件时,它会执行相同的操作,现在执行队列,因此先执行输入然后再执行文档事件,

这是因为 JavaScript 是单线程的,因此一旦setTimeout 被触发,它就会将函数推送到队列并等待超时并转而执行它。

进一步阅读参考W3.org Link

【讨论】:

  • "点击首先在最里面的元素上触发,然后冒泡。"我在想首先执行父元素(它是主体而不是输入)。我错过了这个关键的知识。谢谢。
  • @clever_bassi : 不用担心,很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多