Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Некорректная запись первых ячеек в cookie (https://javascript.ru/forum/misc/84801-nekorrektnaya-zapis-pervykh-yacheek-v-cookie.html)

dasha862 27.12.2022 11:32

Некорректная запись первых ячеек в cookie
 
Вложений: 3
Здравствуйте.

Скрипт последних просмотренных пользователем страниц. Добавляет id страниц в куки.

<script>
$(document).ready(function() {
	var pageid = {%$page%};
    var view = $.cookie('lastpage');
    $.cookie('lastpage', view, { expires: 60, path: '/' });
    if (!view){
		view = [];
	} else {
		view = view.replace(/(^,)|(,$)/g, '');
		var idArray = view.split(',');
		if(idArray.length > 10){
			idArray.shift();
			view = idArray.toString();
		}
	}
	if (view.indexOf(pageid) === -1) {
        if (view) {
            view += ',' + pageid;
        } else {
            view = '' + pageid;
        }
        $.cookie('lastpage', view, { expires: 60, path: '/' });
    }
});
</script>


Суть проблемы, первые 2 просмотренные страницы некорректно записываются в ячейки (46 - id первой просмотренной страницы, 29 - второй, 5 - третьей):
lastpage:Object
:"46"
lastpage:Object
46:"29"

И только начиная с 3 страницы ячейки начинают записываться корректно:
lastpage:Array
1:"46"
2:"29"
3:"5"
length:3

Из-за некорректной записи первых двух ячеек, некоторые страницы с id: 4,6,2,9 в куки не записываеются, т.к. браузер считает что они уже записаны(просмотрены).
Подскажите, пожалуйста, где я ошиблась и как исправить.

voraa 27.12.2022 12:36

Вы определитесь, что у вас view - массив или строка?
Строки 17-21. В каком случае else сработает?
Да и не знаем мы, что такое {%$page%} и как оно вычисляется

рони 27.12.2022 13:07

dasha862,
строка 17 всегда true. попробуйте
if (view.length)

рони 27.12.2022 13:15

dasha862,
как вариант ...
$(document).ready(function() {
            var pageid = {%$page%};
            var view = $.cookie('lastpage');
            if (!view) {
                view = [+pageid];
            } else {
                view = JSON.parse(view);
                if (view.indexOf(+pageid) === -1) {
                    view.push(+pageid);
                    if (view.length > 10) view.shift();
                }
            }
            view = JSON.stringify(view);
            $.cookie('lastpage', view, {
                expires: 60,
                path: '/'
            });
        });

dasha862 27.12.2022 14:02

Цитата:

Сообщение от рони (Сообщение 549524)
dasha862,
как вариант ...
$(document).ready(function() {
            var pageid = {%$page%};
            var view = $.cookie('lastpage');
            if (!view) {
                view = [+pageid];
            } else {
                view = JSON.parse(view);
                if (view.indexOf(+pageid) === -1) {
                    view.push(+pageid);
                    if (view.length > 10) view.shift();
                }
            }
            view = JSON.stringify(view);
            $.cookie('lastpage', view, {
                expires: 60,
                path: '/'
            });
        });

В этом случае возникает проблема с %5B и %5D. На выходе значение имеет вид: %5B4%2C%5D - то есть [4,]. Из-за это у меня возникает синтаксическая ошибка в обработчике PHP.
Как удалить скобки [ и ] на выходе из скрипта, чтобы осталось 4, без скобок?

рони 27.12.2022 14:13

dasha862,
не осилил.

dasha862 27.12.2022 14:46

Попробовала реплейсом убрать
view = view.replace(/[[\]]/g, '');


Но это создаёт другую проблему, записывается id только первой страницы, а остальные игнорируются.
Вы правы, простым реплейсом дело не решить:)

dasha862 27.12.2022 15:20

рони,

Решила на стороне php.

Спасибо Вам огромное за готовый скрипт!

рони 27.12.2022 15:22

Цитата:

Сообщение от dasha862
Как удалить скобки [ и ]

можно только гадать с чем у вас проблема.

var view = $.cookie('lastpage');
view = JSON.parse(view) || [];
view = view.toString();

dasha862 27.12.2022 15:53

Ваш код ставить перед:
$.cookie('lastpage', view, {
expires: 60,
path: '/'
});

Верно поняла?


Часовой пояс GMT +3, время: 18:25.