11

我有一个运行各种 javascript 代码的页面,包括调用setTimeout(). 如果用户单击链接导航到另一个页面,该页面上的 javascript 在什么时候停止运行,因此我的 setTimeout 调用的代码将不再被调用?例如

  • 单击链接后(我知道这是错误的)
  • 当浏览器开始接收新页面时
  • 还有一点?

这对于不同的主要浏览器有什么不同吗?

背景

我想知道这主要是出于兴趣,而不是为了解决任何特定问题。促使我思考这个问题的问题是,当用户单击页面上的特定链接时,我想做一些事情。我想执行一个 ajax 调用并处理结果,但我不太担心它是否在页面卸载之前完成。所以我会在链接点击时触发一个 setTimeout() ,然后如果我很幸运它会完成,但如果我不是它不会。我想知道它在什么情况下会起作用。虽然该问题可能有其他解决方案,但我不想解决问题,我只想知道问题的答案。

4

2 回答 2

3

以下是发生的顺序:

第 1 步:您点击一个链接。在这里,浏览器向服务器发送请求并等待响应。当前页面的文档对象仍然存在。

第 2 步:浏览器收到响应。当前页面的文档对象仍然存在。

第 3 步:浏览器解析、创建和呈现对新文档对象的响应。

第 3 步是当前页面的 JS 将停止时,除非您已将响应定位到 iframe,例如。如果你这样做,那么新的文档对象将在 iframe 中呈现,当前页面的文档对象保持不变,JS 仍将保持功能。

希望这能回答你的问题!

于 2013-05-10T08:52:58.960 回答
0

一种可能的解决方案是停止 click 事件,触发异步调用并在处理 ajax 调用的结果后恢复默认事件。或者,如果可能,您可以处理服务器上的处理,在这种情况下,您甚至不需要停止默认事件 - 只需触发您的异步调用。

在回答您的问题时,我同意 Jack 的观点,即脚本将在 onunload 事件后停止运行。

希望这有帮助。

于 2013-05-10T08:21:53.563 回答