2010-03-29 42 views
31

在编写服务器端代码时,需要在向客户端发送“Location:...”标题后明确停止执行,否则代码将继续在后台执行。是否改变window.location停止JavaScript的执行?

但是,当你在一个客户端脚本改变了window.location什么?这会立即停止当前脚本的执行还是由程序员来确保在此调用之后的任何代码未被达到?

+0

+1有趣的问题 – 2010-03-29 09:43:33

+0

@DavidAndersson还有什么将你的+1意味着什么呢? – stolsvik 2014-08-29 11:26:23

+0

@stolsvik几乎任何东西,包括它很有用,都显示出研究的努力,而且很清楚。也许这也值得一读,有趣,有趣,等等? – Andrew 2015-08-19 01:54:26

回答

11

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

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

locationTest(); 

尝试运行,从萤火虫/网络督察/等。并且您会注意到当前窗口会加载Google,但新窗口也会与Yahoo打开。

+0

这可能是一个竞赛条件。我可以想象,旧的脚本停止执行时,新的位置已完成加载 – codymanix 2010-03-29 09:26:12

+0

在Safari上它似乎停止执行后window.location – 2017-12-19 11:12:03

15

这是否立即停止当前脚本

不,前控制返回给浏览器和事件开始发生剩下的处理程序脚本将执行到执行结束。当新的页面加载得足够远“导航”发生,beforeunloadunload事件将触发,然后的页面,并在其中任何脚本将会无效。

然而,任何进一步的排队事件和超时可能不会闪光。例如,如果您浏览的页面在click处理表单的提交按钮,不取消默认的动作,这是可能的(竞争条件),以供click的默认操作排队的submit事件之前发生导航。

+4

谢谢。作为这个问题的推论,有没有什么办法可以检测到你处于这种状态(即'window.location'已经改变,但导航尚未发生)? – speedplane 2015-04-12 22:01:53

+0

谢谢,只是我需要的答案。您的答案是基于观察浏览器的工作方式,还是在某处定义了此行为? – 2017-08-25 16:43:15

+0

答案基于观察,但HTML5已经完成了一些关于标准化浏览器控制流的工作 - 例如https://www.w3.org/TR/html5/webappapis.html#event-loops,https:// www.w3.org/TR/html5/browsers.html#navigate。我们所取得的标准在很大程度上是难以理解的,并且仍然留下一些未指明的东西,但我们仍然处于比以前那种不一致和神秘的状态更好的状态。 – bobince 2017-08-25 21:47:47