Совместимость браузера Javascript navigator.cookieEnabled

Насколько хорошо поддерживается navigator.cookieEnabled? Могу ли я надежно полагаться на него для всех браузеров?

Ответ 1

Я знаю, что он присутствует в не менее IE 6 и более поздних версиях, Firefox 1 и более поздних версий и Dottoro сообщает, что он поддерживается всеми основными браузерами. Однако он не является частью какой-либо спецификации DOM и, следовательно, не гарантируется, что он будет доступен или правильно реализован всеми браузерами (например, мобильные браузеры с ограниченными реализациями DOM).

Как выяснили некоторые, IE возвращает true для navigator.cookieEnabled, даже если файлы cookie заблокированы для текущего сайта. Это означает, что вы не можете в настоящее время полагаться на свойство вообще, и вы должны полностью его избегать.

Для проверки поддержки кросс-браузера cookie вам может понадобиться что-то вроде этого:

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

Демо: http://codetester.org/31011785

Это вернет false в браузерах, у которых отключены файлы cookie или они не поддерживают свойство уровня 2 DOM document.cookie, которое находится примерно так же, как вы можете перейти в JS.

Ответ 2

В быстром тестировании только сейчас (с использованием IE9), похоже, что navigator.cookieEnabled по-прежнему возвращает true, когда браузер блокирует файлы cookie для этого сайта.

Другими словами, файлы cookie включены, но не для той конкретной страницы, на которой вы находитесь.

Поэтому вам нужно проверить, действительно ли файлы cookie работают, когда вы их устанавливаете. Правильный код должен быть (изменен из ответа Andy E):

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

В проверке navigator.cookieEnabled действительно нет смысла.

Ответ 3

Мне нравится эта 1 функция линейки:

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

Ответ 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.
}