Javascript中有“直接事件”吗?

时间:2014-01-20 15:42:43

标签: javascript javascript-events concurrency

直接事件”的概念/概念是否存在于Javascript实现中?

背景

在这个this answer问题“Is javascript guaranteed to be single-threaded?”中,作者提到了他所称的即时事件。这样的立即事件是一个回调函数(即类似于浏览器窗口window.onresize = callbackfunc;的“调整大小”),在其他一些Javascript代码尚未“完成”时执行,因为对于instace它被阻止(即alert("alert");)。

让我用一个例子来澄清:

// (1) Setup a "immediate event" (a callback for "resize");
window.onresize = function(){ console.log("log resize"); };

// (2) Run some code which contains a blocking alert()
console.log("log A");
console.log("log B");
alert("alert");
console.log("log C");

(作为jsfiddle http://jsfiddle.net/rj25m/5/

针对不同情况/场景的上述脚本输出:

案例1(不进行大小调整)

log A
log B
log C

案例2(在alert("alert");之后调整Windows大小)

log A
log B
log C
log resize

案例3 有趣案例(在alert("alert");弹出窗口期间调整Windows大小

log A
log B
log resize
log C

注意:请注意(如前面提到的answer中所述),在某些系统上,在有模态警报期间调整窗口大小并不容易。例如,在MS Windows中,需要暂时减少屏幕旋转以激活窗口的大小调整。在其他系统中,大多数linux,事件虽然有警报,但您仍然可以调整窗口大小。

注意2:(案例3)输出我只能在Firefox中复制(使用26.0版本)。 IE和Chrome似乎并没有“支持”那些“即时事件”,似乎已经注意到调整大小事件,但计划在完成阻止{{1 }}。

案例4(如Case3,但使用Chrome / IE)

log A
log B
log C
log resize

我对Firefox构建中观察到的行为以及术语“即时事件”的使用感到困惑。如果像这样的东西确实存在,我有疑虑。这就是为什么我在这里问,我希望有人熟悉并且可以参考ECMAScript的规范和/或参考实现的规范来回答。 查看MDN对"run to completion"的实际想法的参考 我倾向于认为立即事件描述的行为是不可取的,没有任何名称,实际上是一个Firefox错误。由于他们引入了新的(标签模态警报),因此firefox与alert("alert")有一些麻烦。

我很高兴有见识并愿意回答评论

1 个答案:

答案 0 :(得分:1)

Javascript中没有“立即事件”的东西,通常代码永远不会被中断来处理事件。

像警报这样的模态弹出窗口是唯一的例外。在某些浏览器中,当您调用alert时,方法中的代码可以“保持”,并且在警报打开时会发生事件。通常情况下,警报打开时不会有需要处理的事件,但显然你发现了异常。

通常,“完成运行”原则就是规则。除非您使用alertprompt之类的内容,否则在退出函数之前,您可以依赖不间断运行的代码。实际上,代码运行时浏览器没有任何反应;没有页面更新,甚至在运行Javascript时GIF动画也不会移动。