Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript navigator.cookieEnabled浏览器兼容性_Javascript_Cookies - Fatal编程技术网

Javascript navigator.cookieEnabled浏览器兼容性

Javascript navigator.cookieEnabled浏览器兼容性,javascript,cookies,Javascript,Cookies,navigator.cookieEnabled的支持程度如何?我可以安全地在所有浏览器中使用它吗?我知道它存在于中,Dottoro报告说确实存在。但是,它不是任何DOM规范的一部分,因此不能保证在所有浏览器中可用或由所有浏览器正确实现(例如,具有有限DOM实现的移动浏览器) 正如一些人所发现的,IE对于navigator.cookieEnabled返回true,即使当前站点的cookie被阻止。这意味着您目前根本无法依赖该属性,您应该完全避免它 要进行完整的跨浏览器cookie支持检查,您可能需

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

我知道它存在于中,Dottoro报告说确实存在。但是,它不是任何DOM规范的一部分,因此不能保证在所有浏览器中可用或由所有浏览器正确实现(例如,具有有限DOM实现的移动浏览器)

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

要进行完整的跨浏览器cookie支持检查,您可能需要执行以下操作:

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

在禁用cookie或不支持DOM level 2属性
document.cookie的浏览器中,这将返回
false
,这在JS中几乎是你能做的。

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

换句话说,cookies是启用的,但不适用于您所在的特定页面

因此,您需要在设置cookie时测试cookie是否实际工作。正确的代码应该是(根据Andy E的答案修改):


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

我喜欢这个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.
}
//返回1或0,而不是true或false。如果不确定,则返回null。
函数cookiesEnabled(){
变量i,j,cookies,发现;
document.cookie='testcookiesenabled=1';

对于(i=0;i可能是@epascarello的副本,我不这么认为。我知道尝试cookie只是为了看看它是否有效,但我想看看cookieEnabled有多可靠。对于我正在开发的应用程序,我可以保留的代码越小越好。FWIW,我只是在使用
导航器。cookieEnabled
@dtbarne:是的,就像我说的
cookieEnabled
不是规范的一部分,因此我的答案中的代码只针对超级偏执狂:-)嗨,安迪,你能解释一下条件的第二和第三个从句吗?@Cupidvogel:事实上,条件只有两个从句。我的代码格式有点掩盖了这一点,因为我对显示水平滚动条的小代码块有点着迷。
(document.cookie.length>0 | |(document.cookie=“test”).indexOf.call(document.cookie,“test”)>-1)
是一个单独的语句,它1)检查cookie属性是否存在,然后断言2a)其长度非零(cookie已存在);或2b)我们可以设置cookie,然后验证它是否已设置。@Cupidvogel:是的,我编写的代码会这样做,但您编写的代码不会:-)您的代码检查字符串“test”是否包含字符串“test”。如果我向您展示一个类似上下文中的差异示例,可能会更好:+1。这是真的。如果您没有阅读其他内容,请阅读以下内容:
检查navigator.cookieEnabled确实没有意义。
可以确认
navigator.cookieEnabled
在阻止Cookie时在IE11上返回true。不幸的是,此解决方案不适用em继续工作。在Facebook嵌入式浏览器上试用,禁用第三方Cookie后改名。如果你已经有jQuery,这只是一行代码,否则它是1行+100KB。:)哈哈,收到你的权利。我认为随着AJAX成为未来,jQuery最终将成为标准。你能想到我的解决方案在交叉兼容性方面有什么问题吗ion?2014年,jQuery正在逐步淘汰…:(
// 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.
}