更改window.location会停止javascript执行吗?

42

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

但是,当您在客户端脚本中更改 window.location 时,是否会立即停止当前脚本的执行,或者由程序员确保在此调用之后不会再执行任何代码?


@DavidAndersson 你的+1还意味着什么? - stolsvik
@stolsvik 几乎任何东西,包括有用的内容,都显示了研究的努力,并且表达清晰。也许它还值得阅读,有趣,引人入胜等等? - Andrew
我必须在下一行显式调用 return; 以退出流程并让 window.location 执行其操作。 - VPaul
2个回答

22

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

不是,剩余的处理程序将会一直执行到结束,然后控制权才会返回至浏览器并开始发生事件。当新页面加载到足够程度以便进行“导航”时,beforeunloadunload事件将被触发,然后页面及其内含的任何脚本将变为非活动状态。

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


4
谢谢。作为这个问题的必然结果,有没有办法检测当你处于这种状态时(即 window.location 已经改变但导航尚未发生)? - speedplane
谢谢,这正是我需要的答案。你的回答是基于观察浏览器工作的还是在某个地方有定义? - Tomasz P. Szynalski
1
答案基于观察,但在HTML5上已经进行了一些标准化浏览器控制流的工作,例如https://www.w3.org/TR/html5/webappapis.html#event-loops,https://www.w3.org/TR/html5/browsers.html#navigate。我们最终得到的标准大部分是难以阅读的,并且仍然留下了一堆未指定的内容,但我们现在比以前不一致和神秘的情况要好得多。 - bobince

15

设置window.location并不会隐式停止JS执行。以下是一个示例:

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

locationTest();

试着从Firebug/Web Inspector等工具中运行此代码,你会注意到当前窗口会加载Google,但也会打开一个新窗口加载Yahoo。


这可能是一种竞态条件。我可以想象,当新位置加载完成时,旧脚本停止执行。 - codymanix
在Safari上似乎会在window.location后停止执行。 - Muhammad Faisal Iqbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接