JavaScript重定向(设置window.location.href)后,代码会发生什么?

32

我有以下的JavaScript重定向代码,后面跟着一些其他的代码。

window.location.href = '/someurl';
alert('hello');
alert('hello again');

这会导致浏览器不一致。

在Firefox中,第一个警报在重定向前的瞬间可见。第二个警报根本不可见。

在Chrome中,两个警报都会弹出,只有在点击两个警报的“确定”后才会重定向。

是否有某种关于重定向后代码执行情况的概念可以解决这些差异?如果重定向是异步的,那么Chrome在做什么?我想了解发生了什么,以便在更复杂的场景中确定在回调和其他逻辑中深埋的重定向该如何处理。


1
重定向后为什么还想要做任何事情呢? - Musa
1
这将完全取决于时间 - 一旦更改位置,您就无法依赖处理/渲染等需要多长时间。 - Dave Newton
1
@Musa 实际上我不想在重定向之后做任何事情,这就是为什么会有这个问题。例如,如果重定向应该在从某个其他库的代码触发的回调中发生,那么在库调用我的回调后可能会执行其他一些由库执行的内容。但是,如果我只想重定向页面而不运行其他内容,我可能需要做一些防止它继续正常运行的事情,具体取决于浏览器试图做什么。 - user1385729
2个回答

30

Javascript会在即将到来的毁灭中继续其使命,但是以这种方式编码被认为是不可预测的...而且残酷。


19

window.location.href = 'url' 后面的代码将会在页面跳转到下一个网址之前尝试执行,因此执行的代码行数取决于浏览器的速度。


谢谢,这看起来是可行的。我正在尝试通过在重定向后添加一个长时间运行的循环来测试它。如果只是速度的问题,浏览器不会在循环期间的任意点进行重定向吗?无论循环中有什么内容,Chrome和Firefox似乎都会执行所有代码(除非循环中有警报,在这种情况下Firefox会在那一点上重定向)。虽然我不确定长时间运行的循环测试是否是最好的测试... - user1385729
你是对的。也许不是速度的问题,而是每个JavaScript函数的优先级。 - Danilo Valente
@DaniloValente,你有任何资源可以确认这个吗? - johnny 5
1
@johnny5 我只能提供我自己作为“资源”的经验,但MDN文档可能会很有用……无论如何,正如Billbad所说的那样,依赖于window.location后面的代码是不安全的。 - Danilo Valente
是的,我正在仔细查看规范,但最终不得不使用一个解决方法。 - johnny 5

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