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)