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, чтобы найти их.