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.
}
};
});