2010-09-13 3 views
10

Я использую новое событие HTML5 onpopstate. Используя Firefox 4, событие window.onpopstate запускается при загрузке страницы, в то время как в Webkit это, похоже, не так.HTML5 onpopstate на странице load

Какое правильное поведение?

+1

В настоящее время это исправлено в Chrome Canary и, предположительно, оно будет исправлено в следующей версии (или двух) Chrome. – Agamemnus

+0

@Agamemnus, странно, не срабатывает для загрузки страницы. – Pacerier

+0

При каких условиях? – Agamemnus

ответ

10

Событие popstate запускается в некоторых случаях при навигации к записи истории сеанса.

http://www.whatwg.org/specs/web-apps/current-work/#event-popstate

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

Также см,

http://www.mail-archive.com/[email protected]/msg19722.html

и,

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

+1

Кажется, что существует такая двусмысленность между Firefox и Webkit на этом. В настоящее время Webkit не запускает onpopstate во время загрузки страницы. – epoch

+6

** Для разработчиков, посетивших эту страницу после 2011 года ** Спецификации HTML5 были изменены таким образом, что «popstate» никогда не запускается при загрузке начальной страницы. FireFox, IE10 и т. Д. Все демонстрируют правильное поведение; Chrome (и, вероятно, Safari) этого не делают. ** Пожалуйста, подтвердите https://code.google.com/p/chromium/issues/detail?id=63040, чтобы вернуть Chrome в соответствие со стандартом **. – Dave

+2

@Dave: Safari Mobile по-прежнему (август 2014 года) запускает это при начальной загрузке страницы. –

4

розжига onpopstate на странице загрузки правильно, и WebKit будет иметь такое поведение в ближайшее время. Теперь WebKit 534.7 (Chrome 7.0517.44) ведет себя так.

Я подал на него ошибку Chrome, но, оказывается, это желаемое поведение; это необходимо для правильной обработки определенных действий кнопки назад/вперед. См. this bug report at code.google.com для более подробного обсуждения и ссылок.

Я все еще пытаюсь найти хороший шаблон кода для обработчика события onpopstate.

+0

У этой проблемы тоже (onpopstate стрельба для webkit, дающая двойную загрузку страницы при первой загрузке). Я обошел это, добавив некоторую логику - например, только добавление слушателя onpopstate после первого запроса ajax. – benbyford

3

Я не знаю, если это то, что вы просите, но мое решение для Ajax-только onpopstate обработчика событий является установка до true переменной refreshed на window.onload и установить его на falsehistory.pushState вызовов; то на обработчике onpopstate просто делайте что-нибудь, если refreshed - false.

Выглядит глупо, и это так, но я не мог сделать ничего лучше.

+0

В Firefox «window.onload» также запускается при нажатии кнопки «Назад» на кнопке браузера, поэтому, вероятно, лучше инициализировать 'refreshed' в некотором месте. – jamix

1

Браузеры, как правило, обрабатывают событие popstate по-разному при загрузке страницы. Chrome и Safari всегда генерируют всплывающее событие при загрузке страницы, но Firefox этого не делает.

Эта цитата была взята из документации в Mozilla: https://developer.mozilla.org/en-US/docs/DOM/window.onpopstate

Я склонен согласиться с системой Mozilla. Загрузка страницы не является действием, требующим запуска дополнительного экстренного всплывающего события, поскольку состояние не выставляется, оно загружается в первый раз.

Я угадываю, что Webkit делает это для удобства ... во всех моих реализациях постоянно неудобно откладывать загрузку моего обработчика до тех пор, пока не начнется начальная всплывающая подсказка.

Вместо этого (с использованием псевдо-функции):

AddEventHandler(window, 'popstate', OnPopState); 

Я должен сделать что-то вроде этого:

AddLoadEvent(window.setTimeout(function() 
    { 
     AddEventHandler(window, 'popstate', OnPopState); 
    },0)); 
3

Просто решить эту проблему, и исправить это на самом деле довольно просто. Firefox не запускает onpopstate при начальной загрузке страницы. После того, как вы запустили popstate, верните false или запретите по умолчанию действие page.load, и вы золотисто.

Cheers.

в действии здесь: www.thecoffeeshopnyc.com

// Write in a new handler for Firefox, which does not fire popstate on load. 
// Modern Webkit browsers fire popstate on load. The event handler below fires the controller 
$(window).load(function() { 
    if ($.browser.mozilla) { 
     // Your func. 
    } 
}) 

// Add the event listener. If the above is false, it will still run as intended in normal browsers. 
window.onpopstate = function() { 
    // Your func. 
} 
+0

Это сломается, когда Chrome решит исправить эту проблему. Обнаружение браузера - это быстрый способ исправить ситуацию, но функция обнаружения должна использоваться, чтобы избежать труднодоступных ошибок. – Agamemnus

1

В случае, если кто-то интересно, я придумал с приличным рисунком для работы с onpopstate (этот код предполагает, Jquery, проверяет функцию обнаружения раздеты для ясности):

$(function() { 

    // 1. Add initial state to current history record on page load. 
    var href = location.href; 
    history.replaceState({"href": href}, null, href); 

    // 2. Now attach the popstate handler. 
    window.onpopstate = function(ev) { 

    // Raised on page load this event will still contain no state. 
    var state = ev.state; 
    if (state && state.href) { 

     // 3. Add your logic, use `state` and `state.href` as you see fit.   

    } 
    }; 

}); 
Смежные вопросы