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

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

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

Ответ 1

Событие 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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Приветствия.

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

Ответ 5

Браузеры, как правило, обрабатывают событие popstate по-разному при загрузке страницы. Chrome и Safari всегда генерируют событие popstate при загрузке страницы, но 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));

Ответ 6

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

    }
  };

});