Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的脚本在JS中被事件处理程序中断_Javascript - Fatal编程技术网

Javascript 为什么我的脚本在JS中被事件处理程序中断

Javascript 为什么我的脚本在JS中被事件处理程序中断,javascript,Javascript,我已经读了以下主题 这里有一个很好的例子: <textarea id="log" rows="20" cols="40"></textarea> <input id="inp"> <script type="text/javascript"> var l= document.getElementById('log'); var i= document.getElementById('inp'); i.onblur= func

我已经读了以下主题 这里有一个很好的例子:

<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">
<script type="text/javascript">
    var l= document.getElementById('log');
    var i= document.getElementById('inp');
    i.onblur= function() {
        l.value+= 'blur\n';
    };
    setTimeout(function() {
        l.value+= 'log in\n';
        l.focus();
        l.value+= 'log out\n';
    }, 100);
    i.focus();
</script>
而非预期

log in
log out
blur
因此,这基本上表明,
blur
上的事件处理程序被触发,从而在setTimeout回调中中断了代码的执行。我已经阅读了其他几篇文章和解释,说明代码不会被中断(),除了一些特殊情况,如模式弹出窗口(警报、提示窗口)。那么,为什么在示例中会被中断呢


我能提供的唯一解释是,我从代码中手动触发
focus
事件,同时在JS引擎上控制执行。如果未手动触发,浏览器将在代码执行期间检测到模糊事件,并将其放入队列中,该队列仅在代码执行完成(堆栈为空)后才会处理。

如您链接到的问题中所述:

当您的代码导致这些[事件]时,浏览器将立即触发这些[事件]:

在上面的示例中,聚焦在某个元素上会导致先前具有焦点的元素立即发生模糊事件。此事件未排队,它将立即触发。实际上,
focus()
方法直接调用先前聚焦元素的
blur
侦听器


立即执行此操作非常有用,这样
blur
处理程序就可以确保能够访问被保留元素的当前状态;我们不想让其他代码有机会先更改字段。

这不是在您复制代码的答案中解释的吗?好吧,答案的问题是,作者将此示例与模式弹出窗口混合
这些事件不仅仅是因为您直接调用了focus(),还可能是因为您调用了alert(),或者打开一个弹出窗口,或者其他任何移动焦点的操作。
。然后他的大部分答案都与模态弹出窗口有关。然而,第一个示例和模式弹出窗口是非常不同的。他在代码上方解释了这一点:当您的代码执行某些操作时,浏览器会立即启动这些弹出窗口:谢谢,所以根据我的判断,我可以认为我的代码被中断是一个bug?谢谢!但我提到的答案否定了即时事件的概念,即未添加到队列中的事件,那么答案又如何呢?你知道有没有其他来源可以阅读关于未添加到队列中的事件的信息?我在那里的评论中发布了一个关于它的问题。如果你对答案有疑问,那是你应该做的,而不是发布新问题。我明白了,谢谢。我只是觉得在评论中讨论东西不是一件好事。我会关注你的评论。我想我已经找到了答案。这些被称为
同步事件
,并且解释得相当详细。如果在链接中找到相关信息,您可能需要编辑您的答案。您可以回答自己的问题并接受答案。
log in
log out
blur