Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   window.onpopstate только на обработку "вперед/назад" браузера (https://javascript.ru/forum/events/40096-window-onpopstate-tolko-na-obrabotku-vpered-nazad-brauzera.html)

rockerror 23.07.2013 18:21

window.onpopstate только на обработку "вперед/назад" браузера
 
Всем привет. Сейчас имею интимные отношения с задачкой по переводу одного проекта в формат SingePageApplication. Т.е. чтобы весь контент абсолютно доставлялся клиенту без перезагрузки страницы. Учитывая, что проект довольно большой и с сложившейся структурой и функционалом, особенно на бэкэнде, некоторые проблемы приходится решать раком. В частности столкнулся вот с какими граблями и никак не могу их обойти:

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

window.onpopstate = function( e ) {
    e.preventDefault();
    var returnLocation = history.location || document.location;
    singlePage.switchToPage( returnLocation.pathname );
}


Проблема в том, что он срабатывает не только при переходе вперед/назад, но и при первой загрузке по прямой ссылке. Т.е. если мы тупо переходим в новой вкладке на какой-то адрес проекта, этот код все-равно отрабатывает. Вот сижу и пытаюсь придумать как от этой ненужности избавиться. Может кто подскажет что-нибудь дельное?

rockerror 23.07.2013 18:32

http://habrahabr.ru/post/123106/#comment_4035036

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

devote 23.07.2013 18:40

Цитата:

Сообщение от rockerror
на хабре говорят, что грешит этим только хром

верно говорят, этим недугом обладает хром и сафари вроде, хотя точно не помню... обходил данный косяк таким образом:
window.onload = function() {
    setTimeout(function() {
        window.onpopstate = function() {
            // ...
        }
    }, 0);
}
вот тут можно более подробно изучить код https://github.com/devote/HTML5-Hist...y.js#L726-L741

rockerror 23.07.2013 18:54

Спасибо!) Помогло)) Думал будет косяк с тем, что на popstate завязано еще однин функционал, который писал не я, но взлетело и с ним тоже))


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