Uncaught SyntaxError: Unexpected non-whitespace character after JSON at position 5

Рейтинг: -1Ответов: 2Опубликовано: 16.05.2023

Я смотрел 10. Избранное. 01. Скрипт добавления товара в избранное с 11:30-13:30 и смотрел 10. Избранное. 02. Добавление в избранное из карточка товара. Там приведен код добавления и удаления элемента массива (товара в Избранное) в сookie

При щелчках на кнопке В избранное

введите сюда описание изображения

выдает следующие ошибки

введите сюда описание изображения

Первый щелчок на В избранное срабатывает, а другие нет (не удается выделить кнопку)

Файл, в котором создаются cookie имеет вид

$(document).ready(function(){
    
    //слайдер на главной
    $(".index_slider").bxSlider({
        mode: 'fade',
        touchEnabled: false
    });
    
    //стилизация форм
    $(".filter_bl input:checkbox, .filter_bl input:radio, .styler input:radio, .styler input:checkbox, .styler select, .styler input:file").styler();
    
    //табы в детальной
    $('body').on('click', 'ul.tabs li:not(.current)', function() {
        $(this).addClass('current').siblings().removeClass('current')
            .parents('div.section').find('div.box').eq($(this).index()).fadeIn(150).siblings('div.box').hide();             
    });
    
    //слайдер в детальной
    $(".det_slider").bxSlider({
       mode:'fade',
       controls: false,
       pagerCustom: '#det_pager'
    });
    $(".det_pager").bxSlider({
       minSlides: 1,
       maxSlides: 4,
       moveSlides: 1,
       slideWidth: 70,
       slideMargin: 20,
       pager: false,
       infiniteLoop: false
    });
    
    $("body").on('click', '.favor_bt', function() {
        console.log('Вход в click');
        let id = $(this).data('id');
        if ($(this).hasClass('active')) {
            actionFav('del', id);
            $(this).removeClass('active');
        } else {
            actionFav('add', id);
            $(this).addClass('active');         
        };
        
        return false;
    });
    
function actionFav(action, id) 
{
    console.log('Вход');
    console.log(getCookie('favorite'));
    var favorite = JSON.parse(getCookie('favorite'));
    
    console.log(favorite);
    if (favorite == null || !(favorite instanceof Array))
        favorite = [];
    
    console.log(favorite);
    
    var inArr = false;
    // проверим существование товара в массиве избранного
    for (i=0; i<favorite.length; i++) {
        if (favorite[i] == id) {
            if (action == 'del') { favorite.splice(i, 1); };
            inArr = true;
        }
    }
    
    // если товара нет в корзине, то добавим
    if (action == 'add' && (!inArr)) { favorite.push(id); };
    var d = new Date();
    d.setMonth(d.getMonth() + 1);
    setCookie ('favorite', JSON.stringify(favorite), d.toUTCString(), '/');
    
    return favorite;
}


function setCookie (name, value, expires, path, domain, secure) 
{
    document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain" + domain : "") +
        ((secure) ? "; secure" + secure : "");
}

function getCookie(name)
{
    var cookie = " " + document.cookie;
    var search = " " + name + "=";
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
        offset = cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = cookie.indexOf(";", offset);
            if (end != -1) {
                end = cookie.length;
            }
            setStr = unescape(cookie.substring(offset, end));
        }
    }
    
    return setStr;
}   
});

Как устранить ошибку?

Что значит текст этой ошибки я знаю, но не понимаю почему она возникла, как ее устранить.

Я конечно понимаю, что это очень схоже с Ошибка-при-создании-cookie (для тех кто мой вопрос сочтет дублем), но как устранить мою ошибку не понимаю.

Ответы

▲ 1Принят

Опечатка в функции getCookie: вместо

if (end != -1) {
    end = cookie.length;
}

должно быть

if (end == -1) {
    end = cookie.length;
}

Иначе функция getCookie почти всегда будет обрезать cookie не до ближайшего ;, а до конца строки. В итоге к JSON в конец добавляются лишние символы, которые вызывают указанную ошибку.

▲ 1

Дело в том, что в JSON.parse() передаётся лишняя информация, следовательно её надо обрезать. Код ниже должен исправить ошибку. Просто замените переменную favorite в функции actionFav.

var favorite = JSON.parse(getCookie('favorite').match(/{.*}/)?.[0]);