【问题标题】:What happens if the page is closed during javascript execution?如果页面在 javascript 执行期间关闭会发生什么?
【发布时间】:2015-09-15 12:14:20
【问题描述】:

假设用户在 t1 时刻关闭了与当前页面对应的选项卡,此时脚本正在运行:

<script>

  foo();

  // t1 <----------

  bar();

</script>

&lt;script&gt; 的其余部分会运行吗?还是 Javascript 执行被立即终止?

我可以想象在所描述的脚本下面给出第二个&lt;script&gt;,第二个脚本将永远不会运行。但也许第一个被视为一个单一的、不间断的东西?

【问题讨论】:

    标签: javascript browser interruption interruptions


    【解决方案1】:

    可能这可能因浏览器而异,但可能不会。共识(见下文)似乎是脚本似乎完成了,或者至少需要几秒钟才能完成;一旦有(或者在一段时间后,无论如何),浏览器就会关闭标签。

    您可以在现代浏览器上相当轻松地测试这一点,方法是执行忙等待并查看在忙等待期间尝试关闭浏览器时会发生什么。

    例如,考虑这个页面:

    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Example</title>
    <style>
    html, body {
      margin: 0;
      padding: 0;
    }
    </style>
    <body>
    <p>I'm here</p>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script>
    var d = Date.now() + 10000;
    while (Date.now() < d) {
    }
    </script>
    </body>
    </html>
    
    • Chrome:显示“我在这里”,如果您单击关闭选项卡按钮,它不会关闭几秒钟(似乎循环已完成)。 (如果它从未完成,Chrome 很可能最终会告诉你脚本行为不端。)

    • Firefox:不显示“我在这里”,但 UI 会做同样的事情:在您请求关闭标签后几秒钟内不关闭标签。

    • IE11:可能会或可能不会显示“我在这里”,单击“关闭标签”按钮的响应速度似乎比 Chrome 更快(但仍然在几秒钟后)。

    在脚本开始之前点击似乎相当容易,因此您必须在页面加载后等待片刻才能点击关闭按钮。

    【讨论】:

    • 您是否介意在关闭&lt;/script&gt; 之前发出警报并更新结果是否在标签关闭之前显示?
    • @mudasobwa: alert 在浏览器上做松鼠式的事情,而松鼠式的事情因浏览器而异。我一点也不感到惊讶,例如,如果循环完成,我们调用alert,浏览器会暂停 JavaScript 线程(因为alert 很奇怪且阻塞),然后处理关闭事件——在某些情况下浏览器,同时在其他人身上做其他事情。特别是在关闭窗口时,请记住曾经使用 alert 之类的垃圾网站来劫持您的浏览器并阻止您离开,因此浏览器会主动绕过它。
    • @Pablo:是的,大多数浏览器(这不是通用的)不仅在该线程上处理 JavaScript,而且还处理其上选项卡的 UI chrome。
    • @mudasobwa:关闭选项卡后很难看到控制台。但是您可能可以围绕写入单独的窗口做一些事情。您无法在主页解析期间打开单独的窗口(OP 的代码在主解析期间发生),但您可以通过窗口名称访问已经打开的窗口。
    • @T.J.Crowder 我终于意识到LocalStorage 在这里拯救了我,是的,Chrome 和 FF 在关闭标签之前都会写在那里。
    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多