4 回答
TA贡献1829条经验 获得超13个赞
这是个好问题。我很想说“是”。我不行。
JavaScript通常被认为具有脚本(*)可见的单个执行线程,因此当输入内联脚本、事件侦听器或超时,您将完全处于控制状态,直到从块或函数的末尾返回。
(*:忽略浏览器是否真的使用一个OS线程来实现他们的JS引擎,或者其他有限的执行线程是否是由WebWorker引入的问题)。
然而,在现实中不完全是真的以卑鄙的方式。
最常见的情况是立即发生的事件。当您的代码做了什么事情导致它们时,浏览器会立即触发它们:
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();
<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">
结果log in, blur, log out除了IE。这些事件不只是因为你打电话focus()直接的,他们可能会发生,因为你打电话给alert(),或者打开一个弹出窗口,或者其他任何移动焦点的东西。
这也可能导致其他事件。例如,添加一个i.onchange侦听器并在输入中键入focus()调用没有焦点,日志顺序是log in, change, blur, log out,除了在歌剧院log in, blur, log out, change以及IE在哪里(更难解释)log in, change, log out, blur.
类似调用click()元素上,该元素将调用onclick在所有浏览器中立即执行处理程序(至少这是一致的!)
(我用的是直接on...事件处理程序属性,但同样发生在addEventListener和attachEvent.)
还有很多种情况,在这些情况下,您的代码被线程化时,事件可能会触发,尽管您已经这样做了。没什么挑起它。例如:
var l= document.getElementById('log');
document.getElementById('act').onclick= function() {
l.value+= 'alert in\n';
alert('alert!');
l.value+= 'alert out\n';
};
window.onresize= function() {
l.value+= 'resize\n';
};
<textarea id="log" rows="20" cols="40"></textarea>
<button id="act">alert</button>
命中alert你会得到一个模态对话框。除非你拒绝那个对话,否则不会再执行剧本了,是吗?没有。调整主窗口的大小,您将得到alert in, resize, alert out在文本区域。
您可能会认为,在模式对话框打开时,不可能调整窗口的大小,但并非如此:在Linux中,您可以任意调整窗口的大小;在Windows上,这并不容易,但您可以通过将屏幕分辨率从更大的更改为不适合窗口的更小的分辨率来实现,从而调整窗口的大小。
你可能会想,嗯,这只是resize(可能还有更多的scroll),因为脚本是线程的,所以当用户没有与浏览器进行主动交互时,它就会触发。对于单一窗口,你可能是对的。但是,当你做跨窗口脚本时,这一切都会被抛到脑后。对于除Safari之外的所有浏览器,在任何一个浏览器繁忙时都会阻塞所有窗口/选项卡/框架,您可以从另一个文档的代码中与文档交互,运行在单独的执行线程中,并导致任何相关的事件处理程序被触发。
当模态弹出时( alert
,confirm
,prompt
在除Opera之外的所有浏览器中都是开放的; 期间 showModalDialog
在支持它的浏览器上; “这页上的剧本可能很忙.”对话框,即使你选择让脚本继续运行,允许像调整大小和模糊事件触发和处理,即使脚本是在繁忙的循环中间,除了在Opera。 不久前,对于我来说,在IE中使用Sun Java插件,调用applet上的任何方法都可能允许事件触发并重新输入脚本。这一直是一个时间敏感的错误,有可能Sun已经修复了它(我当然希望如此)。 可能更多。我已经有一段时间没有对此进行测试了,从那时起浏览器就变得越来越复杂了。
setInterval
postMessage
TA贡献1779条经验 获得超6个赞
(给其他人的评论:setTimeout/setInterval
TA贡献1827条经验 获得超8个赞
添加回答
举报