javascript - 我可以使用 onpopstate 事件的 target.location.href 来更改页面内容吗?

标签 javascript jquery url-rewriting

我正在尝试更新网址而不刷新页面,同时保留使用后退和前进浏览器按钮的可能性。我正在使用这个逻辑https://stackoverflow.com/a/3354511/6783371但我有一些问题。

当我加载页面时,我立即执行以下代码:

window.onpopstate = function (e) {
    if (e.state) {
        changeStep(e.state.step);
    }
};

changeStep 只是一个根据 url 显示正确内容的函数。

每当我更改页面时,我都会调用此函数:

function updateUrl(step, url){
    window.history.pushState({"step": step}, "", url);
}

现在的问题是,当我按后退按钮时,无法到达第一页。网址会更新,但页面内容不会更新。这就是为什么当处理 onpopstate 事件时,e 事件没有 state 属性。这是因为页面第一次加载时不会推送状态。但是如果我这样做,那么如果我在页面加载时调用 updateUrl ,我就会遇到另一个问题,当我开始向后(通过浏览器后退按钮)测试正确的行为时,第一个页面会加载两次,第一个页面事件内有属性状态的时间,以及第二次也是最后一次没有该属性状态的时间。换句话说,我仍然遇到同样的问题。

但我还注意到另一件事,onpopstate 事件还具有属性 target,该属性又包含 location.href (即 url)目标页面的。根据该网址,我可以了解必须在该确切页面中显示哪些内容。

所以我的问题是,因为我不需要存储在 state 属性内的任何特定数据,但为了更新页面内容,我唯一需要的是目标网址,我可以忽略 onpopstate 事件的属性 state 并直接使用 target.location.href 吗?它有什么复古之处吗?也许在特殊情况下这不起作用?

代码如下所示

window.onpopstate = function (e) {
    if (e.target && e.target.location && e.target.location.href) {
        changeStep(e.target.location.href);
    }
};

我什至不需要在页面第一次加载时设置状态。

最佳答案

您可以使用 history.replaceState() 更新第一个状态当页面加载时。这将使 URL 保持不变,但会向初始页面添加状态

现在您不会再遇到返回两次的问题,一次带有 state 对象,另一次没有。

window.addEventListener('load', function(event) {
  let step = 0;
  history.replaceState({ step }, '');
});

关于javascript - 我可以使用 onpopstate 事件的 target.location.href 来更改页面内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60682106/

相关文章:

javascript - 调用mapStateToProps似乎传递了错误的状态对象

javascript - 修改使用 jQuery 创建的数组

DELPHI win32 中的 jQuery

php - 如何使用 nginx 和 php 进行没有 .php 扩展名的路由

mod-rewrite - 添加文件的斜杠和剪切扩展名(nginx 规则)

javascript - 查找、替换和附加新的 dom 元素

javascript - 即使进程以代码 0 终止,Gulp 任务也不会完成

javascript - MVC - 在ajax调用中操作Jquery插件属性

javascript - 遍历 json 数据并匹配到一个数组

jquery - URL 重写 - 删除哈希值