Javascript - извлечение данных из куки как "значение", а не "необработанные данные"

Работа с cookie, созданным плагином "Wordpress Favorites", при извлечении значения из cookie с использованием этой предложенной функции.

    // Read Cookie For Favorites Functionality - simplefavourites
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }

Мы получаем "RAW DATA" обратно... под этим я подразумеваю текст, который вы видите, когда идете в firebug -> cookies -> select cookie -> переключиться в представление "необработанных данных".

Это выглядит так:

%5B%7B%22site_id%22%3A1%2C%22posts%22%3A%5B17411%2C22578%5D%2C%22groups%22%3A%5B%7B%22group_id%22%3A1%2C%22site_id%22%3A1%2C%22group_name%22%3A%22Default+List%22%2C%22posts%22%3A%5B17411%2C22578%5D%7D%5D%7D%5D

Когда то, что мы на самом деле хотим, это текст из "значения", который выглядит следующим образом, для использования в интерфейсе jQuery.

[{"site_id":1,"posts":[17411,22578],"groups":[{"group_id":1,"site_id":1,"group_name":"Default List","posts":[17411,22578]}]}]

Я понимаю, что единственное различие между ними заключается в переводе символов, но мы действительно хотим избежать накладных расходов на перевод символов каждый раз, когда эта функция запускается просто для получения простого массива значений из cookie.

Есть ли в любом случае чтение содержимого куки как "значение", а не "необработанные данные"?

Заранее спасибо за ваш отзыв.

------------ ПРЕДЛАГАЕМОЕ РЕШЕНИЕ --------------- работа с отзывами @Louys Patrice Bessette

    // Read Cookie For Favorites Functionality - simplefavourites
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }
    var cookiecontents = readCookie('simplefavorites');
    cookiecontents = decodeURI(cookiecontents); 
    alert(cookiecontents);

Это возвращает значение cookie как:[{"site_id"%3A1%2C"posts"%3A[17411%2C22578]%2C"groups"%3A[{"group_id"%3A1%2C"site_id"%3A1%2C"group_name"%3A"Default+List"%2C"posts"%3A[17411%2C22578]}]}]

Это очищает некоторые из переводов символов, но не все, выглядит как ":" и "," не получают "расшифровывать"

------------ ПРОБЛЕМА РЕШЕНА --------------- работа с отзывами @Louys Patrice Bessette

    // Read Cookie For Favorites Functionality - simplefavourites
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }
    var cookiecontents = readCookie('simplefavorites');
    cookiecontents = decodeURI(cookiecontents.replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/\+/g, "%20"));
    alert(cookiecontents);

1 ответ

Решение

Это не "необработанные данные", это строка в кодировке URL.

использование decodeURI() на значение, возвращаемое readCookie() если вы ожидаете, что результатом будет объект, массив или строка, содержащая символы, недопустимые в URL.

См. Документацию MDN и пример школы W3C.


РЕДАКТИРОВАТЬ

Похоже, твое печенье было странно закодировано...

Некоторые символы, которые не нужно кодировать, были...
И некоторые из них были не нужны.

В вашей строке я нашел 3.

%3A ==> :
%2C ==> ,
+ ==> %20

Таким образом, способ правильного декодирования вашего куки будет:

var correctlyDecoded = decodeURI(cookieVal.replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/\+/g, "%20"));

Вы должны внимательно посмотреть, как кодируется ваш файл cookie... Потому что может случиться так, что в других файлах cookie произошла ошибка.

Вы сможете использовать этот CodePen, чтобы найти их.

Другие вопросы по тегам