【问题标题】:Modify window.history.state add a property修改 window.history.state 添加属性
【发布时间】:2015-12-21 10:24:38
【问题描述】:

我想在 window.history.state 中添加一个名为 html 的属性,以便以后使用。

所以我做到了:

window.history.state.html = 'something';

但是当我回顾历史时,财产似乎并不存在。

我尝试了 window.history.replaceState 并复制了所有状态的属性并添加了我需要的属性,但首先它似乎在进行另一个状态推送,这意味着历史中的重复 url,而且它似乎也不能很好地工作。

是否有使用历史 API 的解决方案,或者我应该创建一个单独的数组并将其链接到每个推送状态(更复杂)?

【问题讨论】:

    标签: javascript html pushstate html5-history


    【解决方案1】:

    根据Mozilla MDN

    pushState() 采用三个参数:状态对象、标题(当前被忽略)和(可选)URL。

    然后

    状态对象是一个 JavaScript 对象,它与 pushState() 创建的新历史条目相关联。每当用户导航到新状态时,都会触发一个 popstate 事件,并且该事件的 state 属性包含历史条目的 state 对象的副本。

    因此,总而言之,要向history.state 对象添加属性,您需要将其传递给history.pushState(),然后您可以通过绑定popstate 事件来恢复它。


    更新

    正如 cmets 中所说,您需要更新您已经推送的状态。正如你所说,

    我尝试了 window.history.replaceState 并复制了所有状态的属性并添加了我需要的属性,但 (...) 似乎效果不佳。

    我不确定似乎不太好用是什么意思,但我很确定这就是你所需要的,所以我将尝试解释它是如何工作的:

    0) 在页面加载时,history.state 为空

    console.log(history.state);
    // Output: null
    

    1) 首先,让我们为popstate 事件设置一个监听器,向我们展示当前状态

    window.onpopstate = function(s) { console.log(s.state); }
    

    2) 然后开始推送一些状态

    history.pushState({first:1}, document.title);
    history.pushState({second:2}, document.title);
    history.pushState({third:3}, document.title);
    
    console.log(history.state);
    // Output: {third:3}
    

    3) 然后通过添加一个新属性来改变(替换)最后一个状态

    var st = history.state;
    st.myNewProp = "testing";
    history.replaceState(st, document.title);
    

    4) 此时,history.state 已更新

    console.log(history.state);
    // Output: {third:3, myNewProp: "testing"}
    

    5) 推送你需要的任何其他状态

    history.pushState({another:4}, document.title);
    

    6) 然后,用户点击返回按钮,popstate 事件被触发。

    // Simulate back button
    history.back();
    
    // Output: {third:3, myNewProp: "testing"}
    

    7) 然后,每次返回时,它都会不断弹出状态,直到达到初始 null 状态。

    history.back();
    // Output: {second:2}
    
    history.back();
    // Output: {first:1}
    
    history.back();
    // Output: null
    

    【讨论】:

    • 是的,问题是我已经创建了pushState,我需要在之后添加一个属性(因为有些东西已经改变了),然后再创建另一个pushState。
    • 你是否尝试过获取状态对象并使用history.replaceState()
    • 是的,我在问题中这么说。
    • 这很好地表明了 pushState 和 replaceState 不需要 url(第三个参数),如果你不打算改变它或改变当前的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2015-07-14
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多