是否可以在JavaScript的执行堆栈末尾放置一段代码

时间:2014-11-18 15:56:27

标签: javascript jquery javascript-events

例如,我在文本框的焦点上有许多处理程序。 我想通过代码集中注释文本框,并在执行所有处理程序后运行另一个代码。

------- ------更新

在我的情况下,我没有任何访问事件处理程序的权限。它是一个带有自己UI的外部模块。实际上我使用的是Chromium Embedded Framework。焦点出现后,网页上的某些模块会保存数据。

2 个答案:

答案 0 :(得分:1)

  

是否可以在JavaScript的执行堆栈末尾放置一段代码

不,因为从技术上讲,你只能把东西放在堆栈顶部而不是它下面。

然而,您可以利用以下事实:在执行堆栈清除后,引擎会查看另一个名为"回调队列"完成异步操作的回调等待轮到他们执行。


计时器

您可以使用计时器。定时器的工作方式是定时器在计数完成时将回调队列中的回调排队。如前所述,当执行堆栈清除时,引擎会查看回调队列,获取回调并执行它。从技术上讲,它不是在堆栈的末尾,而是在堆栈清除后执行它,它应该看起来差不多。

但是,只有当所有其他处理程序都执行同步代码时才会这样。如果其中一个执行异步操作(如AJAX或定时内容),JS将以相同的方式对AJAX回调进行排队,并且您将失去效果。在此处查看此操作:http://jsfiddle.net/w8brztL4/


Bind Late

你可以做的另一种方法是取消绑定你的处理程序以进行聚焦并重新绑定它。这样,它最后一次注册,很可能在附加处理程序中最后执行。

然而,jQuery的执行顺序,据我所记得的是:所有处理程序首先绑定在元素上,然后父对齐,然后父母的父母从头到尾,依此类推。在此处查看此操作:http://jsfiddle.net/rcc0c9em/为了获得最大效果,请远程绑定某个地方,例如document上。

答案 1 :(得分:0)

大多数浏览器都有一个名为setImmediate(callback)的函数,它在当前事件队列为空后立即对回调进行排队。

对于不支持它的浏览器,您可以使用setTimeout(callback, 1)获得几乎相同的内容。