【问题标题】:How to capture back button of the browser without using pushstate?如何在不使用 pushstate 的情况下捕获浏览器的后退按钮?
【发布时间】:2018-08-28 19:29:28
【问题描述】:

我曾尝试使用 pushstate 和 popstate 捕获浏览器上的后退按钮操作,但问题是 pushstate 会更改历史记录,从而影响后退按钮的正常功能。

【问题讨论】:

    标签: javascript jquery back-button


    【解决方案1】:

    创建一个数组,用于收集用户对 window.location.lasthash 所做的每次更改时的 window.location.hash。

    const updateHistory = (curr) => {
        window.location.lasthash.push(window.location.hash);
        window.location.hash = curr;
    }
    

    很遗憾,单击浏览器的后退按钮不会触发本机事件。但是,有一个很好的方法可以使用其他本地事件侦听器的组合来伪造它。

    首先,通过侦听onmouseover 事件,设置一个在每次呈现文档时切换的布尔值。

    const onDocRenderHandler = (bool) => {
        window.innerDocClick = bool;
    }
    
    document.onmouseover = onDocRenderHandler(true)
    

    用户点击后退按钮后,文档再次呈现,因此设置布尔标志再次切换;只有这一次监听onmouseleave 事件触发。

    document.onmouseleave = onDocRenderHandler(false)
    

    最后,监听onhashchange 事件在文档渲染之间触发。这模拟了一个伪后退按钮事件,供我们监听和操作。

    const onHashChangeHandler = () => {
        if(!window.innerDocClick) {
            history.pushState("", document.title, window.location.pathname);
            location.reload();
        }
    }
    window.onhashchange = onHashChangeHandler()
    

    【讨论】:

    • 检查我首先列出的updateHistory函数表达式。这是设置哈希的位置。
    【解决方案2】:

    大多数人推荐使用:

    window.onhashchange = function() {
        if (window.innerDocClick) {
            window.innerDocClick = false;
        } else {
            if (window.location.hash != '#undefined') {
                goBack();
            } else {
                history.pushState("", document.title, window.location.pathname);
                location.reload();
            }
        }
    }
    function goBack() {
        window.location.hash = window.location.lasthash[window.location.lasthash.length-1];
        //blah blah blah
        window.location.lasthash.pop();
    }
    

    【讨论】:

    • 我的网址中没有任何哈希值。
    • else部分也可以返回
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2014-11-06
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多