【发布时间】:2011-09-01 18:59:51
【问题描述】:
navigator.cookieEnabled 的支持程度如何?我可以在所有浏览器上安全地依赖它吗?
【问题讨论】:
-
@epascarello 我不这么认为。我知道尝试 cookie 只是为了看看它是否有效的概念,但我想看看 cookieEnabled 有多可靠。对于我正在开发的应用程序,我可以保留的代码越小越好。
标签: javascript cookies
navigator.cookieEnabled 的支持程度如何?我可以在所有浏览器上安全地依赖它吗?
【问题讨论】:
标签: javascript cookies
我知道它存在于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 中所能达到的程度。
【讨论】:
navigator.cookieEnabled。
cookieEnabled 不是规范的一部分,所以我的答案中的代码仅适用于超级偏执狂:-)
(document.cookie.length > 0 || (document.cookie = "test").indexOf.call(document.cookie, "test") > -1) 是一个单独的语句,1) 检查 cookie 属性是否存在,然后断言 2a) 它的长度非零(cookie 已经存在);或 2b) 我们可以设置一个 cookie,然后验证它是否已设置。
在刚才的快速测试中(使用 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 确实没有意义。
【讨论】:
There is really no point in checking navigator.cookieEnabled.
navigator.cookieEnabled 在 IE11 上返回 true,此时 cookie 被阻止。
我喜欢这个 1 线性函数:
function cookiesEnabled() {
return $.cookie('check', 'valid', { expires: 1 }) && $.cookie('check') == 'valid';
}
【讨论】:
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.
}
【讨论】: