如何检查用户是否可以返回浏览器历史记录

IT技术 javascript
2021-01-16 22:37:08

我想使用 JavaScript 来查看是否有历史记录,我的意思是浏览器上的后退按钮是否可用。

6个回答

简短的回答:你不能。

从技术上讲,有一种准确的方法,即检查属性:

history.previous

但是,它不会起作用。这样做的问题是,在大多数浏览器中,这被视为违反安全性,通常只返回undefined

history.length

是一个属性,其他人已经建议......
但是,长度不完全,因为它并不表示工作地方在历史上你。此外,它并不总是从相同的数字开始。例如,一个没有设置登陆页面的浏览器从 0 开始,而另一个使用登陆页面的浏览器将从 1 开始。

替代文字

大多数情况下,会添加一个链接,调用:

history.back();

或者

 history.go(-1);

如果您无法返回,那么单击该链接将无济于事。

这是很好的信息,但并不能解决问题。这将是详细说明一些实际适用于任何浏览器的代码。也许是首先检查您使用的浏览器的代码。
2021-03-25 22:37:08
网站不应该能够知道可能包含间接个人信息的用户历史记录。一个网站可以使用跟踪/cookies 来了解用户在网站上做什么,但他们不应该,例如,被允许找出我使用的银行,我的孩子上哪所学校等......因此,浏览器不允许访问该属性
2021-03-27 22:37:08
我可以知道您所说的“问题在于在大多数浏览器中这被视为违反安全性”是什么意思另一个线程中的另一位用户也指出能够获取客户端的浏览器历史记录违反了安全性,但没有解释这是为什么。任何人都可以举一些例子,什么是安全威胁?
2021-03-31 22:37:08
我想说的是,没有一个确定的答案。您是在说每种方法的优缺点,而不是如何获得一个脚本来检查您正在使用的浏览器并有条件地执行一个或另一个代码段。
2021-04-10 22:37:08

还有另一种检查方法 - 检查推荐人。第一个页面通常会有一个空的引用...

if (document.referrer == "") {
    window.close()
} else {
    history.back()
}
如果使用 target="_blank" 打开窗口以强制打开新窗口,则不起作用。浏览器上的后退按钮不起作用,但会有一个 document.referrer
2021-03-12 22:37:08
出于隐私原因,推荐人可以隐藏。
2021-03-14 22:37:08
当页面不是通过链接加载而是通过在地址栏中输入 URL 或加载书签时,引用者始终为空。但是,当浏览器选项卡/窗口之前加载过另一个页面时,这些页面肯定有历史记录!
2021-03-15 22:37:08
如果您从安全 (HTTPS) 页面转到不安全页面 (HTTP),这将不起作用,因为这会剥离引用者。
2021-03-27 22:37:08
但适用于跨多页网站导航的解决方案
2021-04-08 22:37:08

我的代码让浏览器返回一页,如果失败,它会加载一个后备 url。它还检测主题标签的变化。

当后退按钮不可用时,回退 url 将在 500 毫秒后加载,因此浏览器有足够的时间加载上一页。立即加载回退 urlwindow.history.go(-1);会导致浏览器使用回退 url,因为 js 脚本还没有停止。

function historyBackWFallback(fallbackUrl) {
    fallbackUrl = fallbackUrl || '/';
    var prevPage = window.location.href;

    window.history.go(-1);

    setTimeout(function(){ 
        if (window.location.href == prevPage) {
            window.location.href = fallbackUrl; 
        }
    }, 500);
}
这是 Chrome 的默认行为。您“访问”了该页面chrome://newtab,因此您可以回到历史中。
2021-03-22 22:37:08
我认为这确实解决了问题的核心,即一个人为什么关心以及可以以可靠和一致的方式实际做些什么。
2021-03-26 22:37:08
这一直有效,直到我获取后退按钮所在的 url 并将其粘贴到 chrome 的新选项卡中。单击后退按钮会导致被发送到一个空选项卡。:(
2021-03-26 22:37:08
小心这一点,因为在网络连接缓慢的情况下,您会经常访问回退 url。
2021-04-01 22:37:08

这是我如何做到的。

我使用'beforeunload' 事件来设置一个布尔值。然后我设置了一个超时来观察“beforeunload”是否被触发。

var $window = $(window),
    $trigger = $('.select_your_link'),
    fallback = 'your_fallback_url';
    hasHistory = false;

$window.on('beforeunload', function(){
    hasHistory = true;
});

$trigger.on('click', function(){

    window.history.go(-1);

    setTimeout(function(){
        if (!hasHistory){
            window.location.href = fallback;
        }
    }, 200);

    return false;
});

似乎适用于主要浏览器(到目前为止已测试 FF、Chrome、IE11)。

到目前为止,这是对问题的最佳答案。您可以轻松替换window.location.href = fallbackwindow.close(),它也可以工作。
2021-03-23 22:37:08

我在我的项目中使用了一个片段:

function back(url) {
    if (history.length > 2) {
        // if history is not empty, go back:
        window.History.back();
    } else if (url) {
        // go to specified fallback url:
        window.History.replaceState(null, null, url);
    } else {
        // go home:
        window.History.replaceState(null, null, '/');
    }
}

仅供参考:我使用History.js来管理浏览器历史记录。


为什么要将 history.length 与数字 2 进行比较?

因为 Chrome 的起始页被视为浏览器历史记录中的第一项。


history.length用户行为的可能性很少

  • 用户在浏览器中打开新的空标签,然后运行一个页面。history.length = 2我们想back()在这种情况下禁用,因为用户将转到空选项卡。
  • 用户通过单击之前某处的链接新选项卡中打开页面history.length = 1我们再次想禁用back()方法。
  • 最后,用户在重新加载几页后登陆当前页面history.length > 2现在back()可以启用了。

注意:当用户在没有target="_blank".

注 2: document.referrer当您通过键入地址打开网站以及网站使用 ajax 加载子页面时为空,因此我在第一种情况下不再检查此值。

这种方法对我很有用。我实际上为我在后备中使用的页面存储了静态后备链接。
2021-03-20 22:37:08
不幸的是,你是对的。我只使用这个带有“一步后退”结构的代码片段......
2021-03-31 22:37:08
但是,如果你回去,history.length 不会改变..所以,它不能正常工作
2021-04-05 22:37:08