JavaScript重定向何时真正生效

When does a JavaScript redirect actually take effect?

本文关键字:何时真 重定向 JavaScript      更新时间:2024-03-21

如果我在ASP.NET代码中使用服务器端重定向,我知道它会引发ThreadAbortException,因此页面上的所有处理都将立即停止,重定向将立即发生(在"finally"子句之后)。

然而,假设我在JavaScript块内进行重定向(通过设置location.href或使用location.replace),这个重定向什么时候真正生效?

重新加载页面显然会卸载当前脚本块,但根据快速测试,重定向后的警报语句仍然有效。重定向是否只在当前事件处理完成后发生?更重要的是,这种行为是标准化的,还是仅仅是一种事实上的惯例?

好吧,我已经做了更多自己的测试。Jerebear说得很对,如果你有一个直接发生在脚本标记内部的重定向(即当加载脚本标记时执行重定向),那么这将停止在同一页面上加载任何其他脚本标记。所以如果你有这样的东西:

<script> a(); redirect(); b(); </script>
<script> c(); </script>

则执行a和b,但不执行c,因为永远不会加载第二个脚本。

然而,这只是故事的一部分。我真的在想,当你因事件(点击、计时器等)而重定向时会发生什么。答案是,重定向根本不会停止页面上正在处理的事件。这意味着在新页面开始加载之前,所有事件都将继续正常工作。

因此,一般的答案是,在从服务器接收到新页面之前,重定向不会真正生效,尽管它确实有不在当前页面上加载任何脚本标记(可能也不加载其他资源)的副作用。

重定向发生在处理"script"标记集中的所有内容的末尾。这样,DOM可以在处理单个操作时将脚本标记中的所有内容放入内存。

如果在第二组脚本标记中进行处理,则这些指令将被忽略。