gpt4 book ai didi

javascript - 如何在 Windows popstate 上显示当前(不是以前)状态

转载 作者:行者123 更新时间:2023-12-01 15:17:49 26 4
gpt4 key购买 nike

我正在抓取 popstate,需要根据历史堆栈中的 current 和 originalEvent 做各种事情。但是,我不知道如何获取当前状态进行比较,但 originalEvent 有效。这是我的 JS 代码。第一个 IF 语句引发了 e.state.id 未定义的异常......

$(window).on("popstate", function(e) {
//check and compare current state
if (e.state.id == 'something') { // throws an exception
*do something*
} else if (e.originalEvent.state !== null) { //previous state exists?
*do something*
} else { //no previous state
*do something*
}
});

仅供引用,推送状态设置为:
history.pushState({id: 'view'}, '', '/view');

最佳答案

扩展历史对象
这是我的来源,您可以从 https://gist.github.com/HasanDelibas/12050fc59d675181ea973d21f882081a 查看完整资源

该库包含:

  • history.states -> 获取状态列表
  • history.stateIndex -> 当前状态索引
  • "historyChange"事件 -> 检测历史变化 (from,to,side="back"|"forward")
  • 重要的! state必须是 history.pushState( **state**, ...) 的对象
  • (function(){
    let stateSymbol = "__state__index__";
    history.stateIndex =-1;
    history.states=[];
    let pushState = history.pushState;
    function add(data,title,url){
    if(data==null) data={};
    if(typeof data!="object") data={data:data};
    data[stateSymbol] = (history.stateIndex+1);
    history.states.splice(history.stateIndex+1,0,[data,title,url])
    history.states.splice(history.stateIndex+2)
    history.stateIndex++;
    }
    history.pushState =function(data,title,url=null){
    add(data,title,url);
    pushState.bind(history)(data,title,url);
    }
    addEventListener("popstate",function(e){
    var eventObject= {};
    var newStateIndex = e.state!=null ? e.state[stateSymbol] : -1;
    eventObject.from = history.states[history.stateIndex];
    eventObject.to = newStateIndex>-1 ? history.states[newStateIndex] : null;
    eventObject.side = history.stateIndex>newStateIndex ? "back" : "forward";
    if( newStateIndex > -1 && !(newStateIndex in history.states) ){
    add(history.state,"",window.location.href);
    }
    window.dispatchEvent(new CustomEvent("historyChange", {detail: eventObject} ))
    history.stateIndex = e.state!=null ? e.state[stateSymbol] : -1;
    });
    })();
    现在您可以使用 history.states 获取所有状态目的,
    并使用 addEventListener("popstate",function(e)) 检测历史变化
    使用
    /**
    * @param e.detail.from [data,title,url]
    * @param e.detail.to [data,title,url]
    * @param e.detail.side "back" | "forward"
    */
    addEventListener("historyChange",function(e){
    var from = e.detail.from; // [ data , title , url ]
    var to = e.detail.to; // [ data , title , url ]
    var side = e.detail.side; // "back" | "forward"
    console.log( `You changed history. Side is ${e.detail.side}.\nFrom:${e.detail.from[2]}\nTo:${e.detail.to[2]}`)
    })


    history.pushState("1", "DENEME-TEST" ,"?1");
    history.pushState("2", "DENEME-TEST" ,"?2");
    // list of history states
    console.log( history.states )
    /*
    [
    [ {...} , "DENEME-TEST" ,"?1" ]
    [ {...} , "DENEME-TEST" ,"?2" ]
    ]
    */
    // get history current state index
    console.log( history.stateIndex )
    /*
    1
    */

    关于javascript - 如何在 Windows popstate 上显示当前(不是以前)状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31031389/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com