【问题标题】:Is there a way to have an onload callback after changing window.location.href?有没有办法在更改 window.location.href 后进行 onload 回调?
【发布时间】:2021-11-28 06:59:31
【问题描述】:

基本上我想做的事情是这样的:

window.location.href = "some_location";
window.onload = function() {
  alert("I'm the new location and I'm loaded!");
};

在加载窗口的新位置时有什么方法可以进行回调吗? (上面的代码不起作用。)

【问题讨论】:

  • 更改 location.href 会导致当前页面关闭并打开新页面,因此在加载新页面时无法触发旧页面上的任何事件

标签: javascript onload window.location


【解决方案1】:

不,你不能按照你想要的方式去做。加载新页面会关闭当前文档并开始加载新文档。当新页面开始加载时,您当前文档中的任何代码都将不再有效。

要在新文档加载时有一个事件处理程序,您需要将代码插入到新页面的文档中,或者将新文档加载到 iframe 中并监控当前文档中 iframe 的加载情况。

【讨论】:

  • 如果窗口是新窗口怎么办: var w = window.open(""); w.location.href = "some_location"; w.onload = function() {alert("Hi!");};假设我需要使用重定向而不是直接打开 URL 是有实际原因的,例如我需要重定向请求的响应或其他内容。那有什么办法吗?
  • @Lukas - 如果您正在打开一个新窗口(与框架相同),如果窗口位于不同的域中并且您无法在该窗口中设置事件处理程序,则存在安全限制。如果你的窗口在同一个域上,你应该可以为它设置一个 onload 处理程序。
  • 嗯...查看jsfiddle.net/42hKC - 我正在同一个域中打开一个新窗口,将一个 onload 附加到新窗口,但它永远不会触发。
  • 开个玩笑...更新后的小提琴可以通过将 window.open("jsfiddle.net/") 更改为 window.open("/"):见 jsfiddle.net/42hKC/4
  • @RTF - 目前使用的所有浏览器都支持window.onload
【解决方案2】:

将 window.location.href 设置为新值会告诉浏览器直接转到下一页。

像这样:

window.location.href = "http://www.google.com/";

一旦浏览器访问 google.com,就是这样,您的 Javascript 将不再执行,并且您无法进行任何形式的回调,因为浏览器不再运行您的页面。

所以,答案是否定的。

【讨论】:

  • 错了。我的 Javascript 仍在运行——在控制更新窗口的原始窗口中。
  • @7vujy0f0hy 什么原始窗口?考虑到问题的上下文,这个答案是正确的。
【解决方案3】:

关于新上下文中的回调和 js 执行 - 否(根据原始答案),但有一些方法可以在没有回调的情况下访问加载的元素。例如scrollIntoView 在加载的元素上,您可以附加选择器:

const href = '#someElem'
if(window.location.pathname  !== '/') window.location.href = `/${href}`
else document.querySelector(href).scrollIntoView() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2014-02-21
    • 2020-03-25
    • 1970-01-01
    • 2020-05-17
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多