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

Rya*_*yan 136 javascript

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

McA*_*den 105

简答:你做不到.

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

history.previous
Run Code Online (Sandbox Code Playgroud)

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

history.length
Run Code Online (Sandbox Code Playgroud)

那是其他人所说的属性......
然而,长度不完全,因为它并不表示工作的地方在你的历史.此外,它并不总是以相同的数字开头.例如,未设置为具有登录页面的浏览器从0开始,而使用朗读页面的另一浏览器将从1开始.

替代文字

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

history.back();
Run Code Online (Sandbox Code Playgroud)

要么

 history.go(-1);
Run Code Online (Sandbox Code Playgroud)

并且只是期望如果你不能回去,那么点击链接什么都不做.

  • 我所说的是没有确定的答案.您说的是每种方法的优缺点,而不是如何获取一个脚本来检查您正在使用的浏览器并有条件地执行一个或另一个代码段. (5认同)
  • 网站不应该知道用户的历史记录,其中可能包括间接的个人信息。网站可以使用跟踪/cookie 来了解用户在网站本身上做了什么,但他们不应该被允许知道我使用哪家银行、我的孩子去哪所学校等等……因此,浏览器不允许访问该属性 (3认同)

Ron*_*ter 76

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

if (document.referrer == "") {
    window.close()
} else {
    history.back()
}
Run Code Online (Sandbox Code Playgroud)

  • 如果使用target ="_ blank"打开窗口以强制新窗口,则不起作用.浏览器上的后退按钮不起作用,但会有一个document.referrer (35认同)
  • 当页面未通过链接加载但是通过在地址栏中输入URL或加载书签时,引用者始终为空.当浏览器选项卡/窗口之前加载了另一个页面时,这些页面肯定会有历史记录! (11认同)
  • 不适用于散列标记网址(ajax应用程序). (9认同)
  • 如果您从安全(HTTPS)页面到不安全页面(HTTP),这将无效,因为这将剥离引用者. (3认同)
  • 出于隐私原因,可以隐藏推荐人. (2认同)
  • 但适用于跨多页面网站导航的解决方案 (2认同)

red*_*aap 49

我的代码让浏览器返回一页,如果失败则加载一个后备网址.它还检测主题标签的更改.

当后退按钮不可用时,后退网址将在500毫秒后加载,因此浏览器有足够的时间加载上一页.之后加载后备网址window.history.go(-1);会导致浏览器使用后备网址,因为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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这真正指出了问题的核心,一个人关心的原因,以及以可靠的方式和一致的方式实际采取的措施. (4认同)
  • 这是 Chrome 的默认行为。您“访问”了页面`chrome://newtab`,因此您可以回到历史。 (4认同)
  • 直到我获取后退按钮所在的 url 并将其粘贴到 Chrome 中的新选项卡中为止,此操作一直有效。单击后退按钮会导致被发送到一个空选项卡。:( (3认同)
  • 对此要小心,因为网络连接速度较慢时,您会经常访问后备网址。 (2认同)

xtr*_*com 11

这似乎可以解决问题:

function goBackOrClose() {  

    window.history.back();
    window.close(); 

    //or if you are not interested in closing the window, do something else here
    //e.g. 
    theBrowserCantGoBack();

}
Run Code Online (Sandbox Code Playgroud)

调用history.back()然后调用window.close().如果浏览器能够返回历史记录,则无法进入下一个语句.如果它无法返回,它将关闭窗口.

但请注意,如果通过键入URL来访问页面,则firefox不会允许脚本关闭窗口.

  • 我发现这不起作用,除非我在尝试运行下一个语句之前使用延迟几百毫秒左右的setTimeout,否则它会在运行history.back()之后运行 (3认同)
  • `window.close()`被许多现代浏览器视为安全风险.有些人不会让你这样做. (2认同)

bob*_*nce 9

您无法直接检查后退按钮是否可用.您可以查看history.length>0,但如果当前页面前面还有页面,则会成立.您只能确定后退按钮何时无法使用history.length===0.

如果这还不够好,那么您可以做的就是打电话history.back(),如果之后仍然加载了您的页面,则后退按钮不可用!当然,这意味着如果后退按钮可用的,你刚刚导航离开页面.你不能取消导航onunload,所以你要做的就是停止实际发生的事情就是从中返回一些东西onbeforeunload,这会导致出现一个很大的烦人提示.这不值得.

事实上,对历史做任何事情通常都是一个非常糟糕的想法.历史导航适用于浏览器镶边,而不适用于网页.添加"返回"链接通常会导致更多用户混淆而不是值得.

  • 关于长度 - 甚至在所有浏览器中都没有.有些浏览器会将当前页面计为历史记录项,并从1开始.您必须包含浏览器检测. (2认同)

Ton*_*uer 9

我是怎么做到的.

我使用'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;
});
Run Code Online (Sandbox Code Playgroud)

似乎在主流浏览器中工作(到目前为止测试过FF,Chrome,IE11).

  • 到目前为止,这是对问题的最佳答案。你可以很容易地用 `window.close()` 替换 `window.location.href = fallback`,它也可以工作。 (3认同)

gre*_*tys 9

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

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, '/');
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:我使用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加载子页面时,它是空的,所以我在第一种情况下停止检查此值.

  • 但是,如果你回去,history.length 不会改变..所以,它不能正常工作 (3认同)

小智 7

请注意,window.history.length因为它还包含window.history.forward()

因此,您可能有window.history.length多个条目,但没有历史记录后退条目。这意味着如果您开火,什么也不会发生window.history.back()


Gro*_*omo 5

history.length是没用的,因为它没有显示用户是否可以回溯历史.不同的浏览器也使用初始值0或1 - 它取决于浏览器.

工作解决方案是使用$(window).on('beforeunload'事件,但我不确定如果通过ajax加载页面并使用pushState更改窗口历史记录它将起作用.

所以我使用了下一个解决方案:

var currentUrl = window.location.href;
window.history.back();
setTimeout(function(){
    // if location was not changed in 100 ms, then there is no history back
    if(currentUrl === window.location.href){
        // redirect to site root
        window.location.href = '/';
    }
}, 100);
Run Code Online (Sandbox Code Playgroud)