Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   History.js (используется нативный window.history) (https://javascript.ru/forum/events/56148-history-js-ispolzuetsya-nativnyjj-window-history.html)

acteralex 01.06.2015 16:07

History.js (используется нативный window.history)
 
Привет всем!

У меня есть проблема. Я использую history.js (https://github.com/browserstate/history.js/).

1) я захожу на страницу www.site.ru/employee
2) затем захожу на страницу www.site.ru/employee/id по клику
всплывает модальное окно.
Код:

History.pushState({}, '', '')

3) на событие, которые закрывает модальное окно повешено следующее:
Код:

History.back()

4) В итоге я остаюсь на странице www.site.ru/employee/id, а должен был перейти сюда www.site.ru/employee.

Обычно работает все верно, но, google chrome иногда (как повезет, 1 раз из 1ого, 1 из 10 и даже 1 из 30 раз) зависает и не хочет работать со стэйтами...

После проверки оказалось, что:
1) History.busy() = true
2) событие popstate/statechange не срабатывает
3) History.getState().id == history.state

Может кто сталкивался с этим?
Надеюсь поможете. Спасибо!

kostyanet 01.06.2015 22:26

Я сталкивался и выяснил что спина не работает и не должна в общем-то. Все нужно делать явным образом.

Загрузилась страница (или вызвали инит) - cur={url:location.href,title:D.title}; и следом заменили чтоб спины не было - history.replaceState(cur,cur.title,cur.url);

Надо закрыть модальное окно - history.replaceState(cur,cur.title,cur.url);

Соответственно в онпопстейт либо загрузка по урлу - канонично, либо тот же самый возврат через замену. У меня канонично

onpopstate=function(e){
	location.assign(e.state.url);
},

kostyanet 01.06.2015 22:37

Другими словами не работает такое понимание что в хистори у вас типа стек и вы можете им манипулировать. Бэки и форварды это седьмая вода на киселе. Они были до пушнины и как там браузеры пришили что было к тому что стало - никто толком не знает. Во всех мануалах пишут одно и то же - явное управление адресом.

В другом месте на онпопстейте висит вызов того же самого загрузчика

onpopstate=function(e){
		get_page(e.state.url,false);
    },


Все, больше вариантов нет. Или вы загружаете следующий ресурс по тому же аяксу и продолжаете прикидываться шлангом в урле, или вы перезагружаете страницу на тот урл, с которого все началось. При этом если юзер нажмет F5 когда у вас левый урл - то же самое должно загрузиться как обычно.

То есть смысл в том, что кнопки Back Forward нажимает юзер, а из кодов вы всегда задаете конкретный адрес.

acteralex 02.06.2015 13:15

Цитата:

Сообщение от kostyanet (Сообщение 373521)
onpopstate=function(e){
	location.assign(e.state.url);
},

но
location.assign(url)

перезагружает страницу

Как решить без перезагрузки?

acteralex 05.06.2015 11:39

Не работает onpopstate;
Не работает кнопки вперед/назад в браузере.

devote 05.06.2015 11:59

а как с нативным методом обстоят дела? (без подключения библиотеки от балуптона)?

acteralex 05.06.2015 12:40

Цитата:

Сообщение от devote (Сообщение 373900)
а как с нативным методом обстоят дела? (без подключения библиотеки от балуптона)?

Честно говоря точно сказать не могу, но процентов на 90% уверен, что будет работать хорошо.

Почему я это решил:
поменял History.back() на window.history.go(-1). И логика работы поменялась. Приложение работает, но не меняется URL.
не меняется state и, соответственно, не работает statechange событие.

devote 05.06.2015 13:18

используйте нативные методы.. зачем вы используете глючную библиотеку, которую даже разработчики исправлять не хотят.

acteralex 05.06.2015 13:38

Цитата:

Сообщение от devote (Сообщение 373908)
используйте нативные методы.. зачем вы используете глючную библиотеку, которую даже разработчики исправлять не хотят.

Необходима поддержка IE9, в котором используется навигация через хеши.

devote 05.06.2015 14:56

возьмите мой shim... он просто добавляет поддержу в старые браузеры... Но при этом вы будете работать с нативными методами.


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