Я использую новое событие onpopstate HTML5. Используя Firefox 4, событие window.onpopstate запускается при загрузке страницы, в то время как в Webkit это, похоже, не так.
Какое правильное поведение?
Я использую новое событие onpopstate HTML5. Используя Firefox 4, событие window.onpopstate запускается при загрузке страницы, в то время как в Webkit это, похоже, не так.
Какое правильное поведение?
Событие 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
Увольнение onpopstate на загрузке страницы верное, и WebKit будет иметь это поведение в ближайшее время. WebKit 534.7 (Chrome 7.0517.44) теперь ведет себя таким образом.
Я подал на него ошибку Chrome, но, оказывается, это желаемое поведение; это необходимо для правильной обработки определенных действий кнопки назад/вперед. См. этот отчет об ошибках на code.google.com для более подробного обсуждения и ссылок.
Я все еще пытаюсь найти хороший шаблон кода для обработчика события onpopstate.
Я не знаю, если это то, о чем вы просите, но мое решение для обработчика событий onpopstate ajax-only - установить true
переменную refreshed
на window.onload
и установить ее в false
на вызовах history.pushState
; то в обработчике onpopstate
просто делайте что-либо, если refreshed
- false
.
Выглядит глупо, и это так, но я не мог сделать лучше.
Просто решил эту проблему, и исправление на самом деле довольно простое. 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.
}
Браузеры, как правило, обрабатывают событие 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));
В случае, если кто-то заинтересован, я придумал достойный шаблон для работы с 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.
}
};
});