2

Say the user closes the tab corresponding to the current page, at moment t1, at which a script was running:

<script>

  foo();

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

  bar();

</script>

Will the rest of the <script> run? Or is Javascript execution killed immediately?

I can imagine how given a second <script> below the described one, this second script will never run. But maybe the first one is treated like a single, uninterruptible thing?

4

1 回答 1

4

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

你可以很容易地在现代浏览器上测试这一点,方法是做一个忙等待,看看当你在忙等待期间尝试关闭浏览器时会发生什么。

例如,考虑这个页面:

<!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 响应更快(但仍然在几秒钟后)。

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

于 2015-09-15T12:22:18.353 回答