Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.05.2012, 16:10
Интересующийся
Отправить личное сообщение для aphextwin Посмотреть профиль Найти все сообщения от aphextwin
 
Регистрация: 10.04.2012
Сообщений: 11

history.pushState и как получить StateObj
Столкнулся с необходимостью сделать асинхронную загрузку контента с помощью ajax и jquery. Конечно, просто загрузить и отобразить контент средствами jquery - ничего сложного. Спотыкнулся я на моменте добавления записи о переходе по ссылке в историю.
Когда я загружаю с сервера данные и отображаю их в нужном месте на странице, после этих действий я хочу изменить url в браузере, и обрабатывать нажатие на кнопку "назад". Тут мне поможет history.pushState(state, title, url). во всех мануалах утверждается что в кач-ве state могут быть любые данные в json, чем я и решил воспользоваться, чтобы хранить id предидущей страницы.
Окей. При нажатии на кнопку "назад" по идее возникает событие popstate, которому, как говорится в различных источниках, передается значение state. Вот так это выглядит в мануалах:

window.addEventListener("popstate", function(e) {
    currentState = e.state;
}, false);


Но у меня выходит currentState = NULL, я не могу получить сохраненную инфу, и все плохо. МБ кто нибудь сталкивался с таким, и может подсказать, как мне быть, уважаемые знатоки ))))
Ответить с цитированием
  #2 (permalink)  
Старый 14.05.2012, 18:33
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

window.addEventListener("popstate", function(e) {
    currentState = history.state;
}, false);
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 14.05.2012, 18:38
Аватар для crayday
Аспирант
Отправить личное сообщение для crayday Посмотреть профиль Найти все сообщения от crayday
 
Регистрация: 30.08.2011
Сообщений: 61

Как интересно!
Я совсем не знал про это событие, хотя искал информацию о том, как обработать возврат (из-за того, что не нашёл, совсем отказался от pushState и стал использовать replaceState, а теперь смогу сделать по-нормальному).

Потестировал событие popstate в ff и chrome - проблемы не возникло. Возможно такое, что ты делаешь возврат, занеся лишь одну запись в историю? В этом случае e.state передаётся null, так как изначальному состоянию не соответствует ни одна запись в истории. Если из этого состояния продвинуться по истории вперёд, то в e.state должна передаться только что занесённая запись.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2012, 08:43
Интересующийся
Отправить личное сообщение для aphextwin Посмотреть профиль Найти все сообщения от aphextwin
 
Регистрация: 10.04.2012
Сообщений: 11

alert(history.state) Тоже выдает undefined. Видно, я что-то не так делаю.

Сообщение от crayday Посмотреть сообщение
Потестировал событие popstate в ff и chrome - проблемы не возникло. Возможно такое, что ты делаешь возврат, занеся лишь одну запись в историю? В этом случае e.state передаётся null, так как изначальному состоянию не соответствует ни одна запись в истории. Если из этого состояния продвинуться по истории вперёд, то в e.state должна передаться только что занесённая запись.
Да похоже вы правы, при загрузке контента с историей происходит вот что:
history.pushState({pid: id}, null, link);

и нужные данные записываются уже на новую запись в истории )
Добавил редактирование текущей записи истории что-бы при возврате "назад", я их мог получить:
history.replaceState({pid: id}, null, window.location); 
history.pushState({pid: id}, null, link);

Но все равно undefined.
Можно ли как-то при отладке, посмотреть что записывается в историю, firebag такое умеет? Или ещё какие средства..
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2012, 18:46
Аватар для crayday
Аспирант
Отправить личное сообщение для crayday Посмотреть профиль Найти все сообщения от crayday
 
Регистрация: 30.08.2011
Сообщений: 61

Скорее всего, ошибка связана с чем-то, что не упомянуто в теме. Код ниже должен вывести в консоль строчку:
Код:
Object { pid="current"}
window.addEventListener("popstate", function(e) {
	console.log( e.state );
}, false);
history.replaceState( {pid: 'current'} , null , location.href );
history.pushState( {pid: 'new'} , null , location.href );
history.back();

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение TD zsaz jQuery 3 16.11.2011 16:00
как получить загружений урл iframe или frame NOCaut Events/DOM/Window 0 15.11.2011 14:51
Как получить указатель на элемент вызвавший функцию pelayo Общие вопросы Javascript 9 29.06.2010 23:32
Как получить высоту DIV, установленную автоматически YOricH Internet Explorer 4 22.07.2009 17:15
Как получить список всех установленных плагинов VitAngel Internet Explorer 0 15.07.2009 09:13