Сменить location.hash на unbeforeunload
У меня есть страница, которая генерируется с помощью JavaScript. Я хочу хранить $(window).scrollTop()
значение в хэше (например, #position=xxx
) поэтому, когда страница обновляется и элементы генерируются снова, пользователь может продолжить прокрутку с того места, где он остановился.
Я пытаюсь изменить хэш beforeunload
, который, кажется, не работает. Первая часть функции ниже пытается изменить хеш, а вторая часть занимается модификацией scrollTop при загрузке страницы. Вторая часть работает нормально, я застрял только с первой частью.
$(window).on('beforeunload',function(){
window.location.hash = "position="+$(window).scrollTop();
}).on('load hashchange',function(){
var scrollregex = /^position=(\d+)$/,
hash = window.location.hash.substring(1);
if (scrollregex.test(hash)) $(window).scrollTop(parseInt(hash.match(scrollregex)[1]));
});
Есть ли для этого другое событие или как я могу изменить хэш, когда пользователь запускает обновление?
2 ответа
Я закончил тем, что отказался от идеи хэша и пошел с sessionStorage
основанный подход. Я написал свою собственную оболочку для сессии / локального хранилища, которую я использую в следующем примере.
$(window).on('beforeunload',function(){
var scrltop = $(window).scrollTop();
if (scrltop > 0) SStorage.set('position',scrltop);
else SStorage.del('position');
}).on('load',function(){
if (SStorage.has('position')){
var pos = parseInt(SStorage.get('position'));
if (!isNaN(pos) && $(window).scrollTop() === 0) $(window).scrollTop(pos);
}
});
Похоже, что Chrome не позволяет обновлять хэш в событии onbeforeunload. У меня была похожая проблема. Я переместил свой код в событие unload, которое работало, но создало другие проблемы. Чтобы решить их, я вынужден перезагрузить, заметьте, перезагрузка не будет работать без setTimeout.
$(window).on('unload', function(){
/* Do hash change here */
setTimeout(function () { window.location.reload(true); }, 0);
});