HTML5 onpopstate при загрузке страницы

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

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

6 ответов


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

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

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

также смотри,

http://www.mail-archive.com/whatwg@lists.whatwg.org/msg19722.html

и

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


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

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

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


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

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


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

Ура.

в действии здесь: 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.
}

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

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

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

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

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

AddEventHandler(window, 'popstate', OnPopState);

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

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

в случае, если кто-то заинтересован, я придумал неплохой шаблон для работы с 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.          

    }
  };

});