【问题标题】:Does changing window.location stop execution of javascript?更改 window.location 是否会停止执行 javascript?
【发布时间】:2010-03-29 09:08:48
【问题描述】:

在编写服务器端代码时,您需要在向客户端发送“Location: ...”标头后显式停止执行,否则您的代码将继续在后台执行。

但是当您在客户端脚本中更改 window.location 时呢?这会立即停止当前脚本的执行,还是由程序员来确保未到达此调用之后的任何代码?

【问题讨论】:

  • @DavidAndersson 您的 +1 还意味着什么?
  • @stolsvik 几乎任何东西,包括它都是有用的,显示了研究工作,并且很清楚。也许它也只是值得一读、有趣、耐人寻味等?
  • 我必须在下一行显式调用 return; 才能退出流程,让 window.location 完成它的工作。

标签: javascript


【解决方案1】:

这是否会立即停止当前脚本的执行

不,剩余的处理程序脚本将在控制权返回浏览器并开始发生事件之前执行到最后。当新页面的加载距离足以发生“导航”时,beforeunloadunload 事件将触发,然后页面和其中的任何脚本都将变为非活动状态。

但是,任何进一步的排队事件和超时都可能不会触发。例如,如果您在表单提交按钮的 click 处理程序中导航页面并且不取消默认操作,则导航可能(竞争条件)在默认操作排队的 submit 事件之前发生click.

【讨论】:

  • 谢谢。作为这个问题的推论,有什么方法可以检测您何时处于这种状态(即window.location 已更改但尚未发生导航)?
  • 谢谢,正是我需要的答案。您的答案是基于观察浏览器的工作方式,还是在某处定义了这种行为?
  • 答案基于观察,但在 HTML5 中已经完成了一些关于标准化浏览器控制流的工作——例如w3.org/TR/html5/webappapis.html#event-loopsw3.org/TR/html5/browsers.html#navigate。我们最终得到的标准在很大程度上是不可读的,并且仍然留下了一堆未指定的东西,但我们仍然处于比我们之前的不一致和神秘的更好的情况。
【解决方案2】:

设置window.location 不会隐式停止JS 执行。以以下为例:

function locationTest() {
  window.location = 'http://www.google.com/';
  window.open('http://www.yahoo.com/');
}

locationTest();

尝试从 Firebug/Web Inspector/etc 运行它。您会注意到当前窗口会加载 Google,但还会打开一个带有 Yahoo 的新窗口。

【讨论】:

  • 这可能是一个竞争条件。我可以想象当新位置完成加载时旧脚本停止执行
  • 在 Safari 上,它似乎在 window.location 之后停止执行
猜你喜欢
  • 2016-09-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多