Javascript navigator.cookieEnabled 浏览器兼容性

Posted

技术标签:

【中文标题】Javascript navigator.cookieEnabled 浏览器兼容性【英文标题】:Javascript navigator.cookieEnabled Browser Compatibility 【发布时间】:2011-09-01 18:59:51 【问题描述】:

navigator.cookieEnabled 的支持程度如何?我可以在所有浏览器上安全地依赖它吗?

【问题讨论】:

How to detect that javascript and/or Cookies are disabled ?的可能重复 @epascarello 我不这么认为。我知道尝试 cookie 只是为了看看它是否有效的概念,但我想看看 cookieEnabled 有多可靠。对于我正在开发的应用程序,我可以保留的代码越小越好。 【参考方案1】:

我知道它存在于at least IE 6 and later、Firefox 1 and later,并且 Dottoro 报告它是supported by all major browsers。但是,它不是任何 DOM 规范的一部分,因此不能保证在所有浏览器中都可用或正确实现(例如,具有有限 DOM 实现的移动浏览器)。

正如一些人所发现的,即使当前站点的 cookie 被阻止,IE 也会为 navigator.cookieEnabled 返回 true。这意味着您目前根本无法依赖该属性,您应该完全避免它。

对于完整的跨浏览器 cookie 支持检查,您可能希望使用以下内容:

var cookies = ("cookie" in document && (document.cookie.length > 0 ||
        (document.cookie = "test").indexOf.call(document.cookie, "test") > -1));

演示:http://codetester.org/31011785

这将在禁用 cookie 或不支持 DOM 级别 2 属性 document.cookie 的浏览器中返回 false,这大约是您在 JS 中所能达到的程度。

【讨论】:

FWIW,我只是在使用navigator.cookieEnabled @dtbarne:是的,就像我说的 cookieEnabled 不是规范的一部分,所以我的答案中的代码仅适用于超级偏执狂:-) 嗨,Andy,你能解释一下条件句的第 2 和第 3 条吗? @Cupidvogel:实际上,条件句只有两个。我的代码格式有点掩饰它,因为当涉及到显示水平滚动条的小代码块时,我有点着迷。 (document.cookie.length > 0 || (document.cookie = "test").indexOf.call(document.cookie, "test") > -1) 是一个单独的语句,1) 检查 cookie 属性是否存在,然后断言 2a) 它的长度非零(cookie 已经存在);或 2b) 我们可以设置一个 cookie,然后验证它是否已设置。 @Cupidvogel:是的,我写的代码可以做到这一点,但你写的代码没有:-) 你的代码检查字符串“test”是否包含字符串“test”。如果我向您展示在类似情况下的差异示例可能会更好:jsfiddle.net/ctRcB【参考方案2】:

在刚才的快速测试中(使用 IE9),当浏览器阻止该站点的 cookie 时,navigator.cookieEnabled 似乎仍然返回 true。

换句话说,cookie 已启用,但不适用于您所在的特定页面。

因此,您需要在设置 cookie 时测试它们是否真的有效。正确的代码应该是(根据 Andy E 的回答修改):

var cookies = 
    ("cookie" in document && (document.cookie.length > 0 ||
    (document.cookie = "test").indexOf.call(document.cookie, "test") > -1))

检查 navigator.cookieEnabled 确实没有意义。

【讨论】:

+1。这是真的。如果您没有阅读其他内容,请阅读以下内容:There is really no point in checking navigator.cookieEnabled. 可以确认navigator.cookieEnabled 在 IE11 上返回 true,此时 cookie 被阻止。 不幸的是,这个解决方案似乎不再起作用了。尝试在 Facebook 嵌入式浏览器和隐身模式下禁用 3rd 方 cookie。【参考方案3】:

我喜欢这个 1 线性函数:

function cookiesEnabled() 
    return $.cookie('check', 'valid',  expires: 1 ) && $.cookie('check') == 'valid';

【讨论】:

如果你已经有 jQuery,那只是一个行,否则它是 1 行 + 100KB。 :) 大声笑,你的权利。我认为 AJAX 是未来,jquery 最终将成为规范。你能想到我的解决方案的交叉兼容性问题吗?谢谢 即使在 2014 年 jQuery 也在逐步淘汰...... :(【参考方案4】:

navigator.cookieEnabled 并不总是可靠的,并且在旧浏览器上根本不起作用。

此答案适用于所有支持 JavaScript 的浏览器。此外,这不需要 jQuery,它会在测试完成后删除测试 cookie。

// returns 1 or 0 instead of true or false. Returns null if inconclusive.
function cookiesEnabled() 
    var i, j, cookies, found;
    document.cookie = 'testcookiesenabled=1';
    for (i=0; i<2; i++) 
        found = false;
        cookies = document.cookie.split(';');
        j = cookies.length;
        while(j--) 
            while (cookies[j].charAt(0)==' ') // trim spaces
                cookies[j] = cookies[j].substring(1);
            
            if (cookies[j].indexOf('testcookiesenabled=')==0) 
                found = true;
                break;
            
        
        if (!found) 
            return i;
        
        // Delete test cookie.
        document.cookie = 'testcookiesenabled=; expires=Thu, 01 Jan 1970 00:00:01 GMT';
    
    // Results inconclusive.

【讨论】:

以上是关于Javascript navigator.cookieEnabled 浏览器兼容性的主要内容,如果未能解决你的问题,请参考以下文章

javascript JavaScript isset()等效: - JavaScript

JavaScript 使用JavaScript更改CSS(JavaScript)

JavaScript之基础-1 JavaScript(概述基础语法)

前端基础-JavaScript的基本概述和语法

JavaScript

JavaScript