17.05.2012, 20:03
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
load и popstate а Chrome
Как избежать вызов события popstate при загрузке страницы в Хроме? Это можно сделать говнокодом: поставить таймер и смотреть, вызвалось ли одно событие, но как сделать по-человечески, не могу придумать.
|
|
17.05.2012, 20:31
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от FINoM
|
Как избежать вызов события popstate при загрузке страницы в Хроме? Это можно сделать говнокодом: поставить таймер и смотреть, вызвалось ли одно событие, но как сделать по-человечески, не могу придумать.
|
а что, если вешать обработчик события после загрузки?
|
|
21.05.2012, 19:09
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от melky
|
а что, если вешать обработчик события после загрузки?
|
Не катит
$( window ).bind( 'load', function( event ) {
handlers.popstate();
console.log( 'load' )
$( window ).bind( 'popstate', function( event ) {
console.log( 'popstate' )
handlers.popstate();
});
});
|
|
21.05.2012, 19:14
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Я так делал в своей библиотеке
var initialFire = document.location.href;
window.onpopstate = function() {
if ( initialFire === document.location.href ) {
return initialFire = false;
}
initialFire = false;
// some code here
// ...
}
Последний раз редактировалось devote, 21.05.2012 в 19:24.
|
|
21.05.2012, 19:28
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
ах да, еще перед вызовом pushState или replaceState нужно зафалсить переменную initialFire иначе в других браузерах при возврате на предыдущию страницу не сработает событие popstate
|
|
21.05.2012, 19:31
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Меня больше всего удивляет, что popstate срабатывает после load.
|
|
21.05.2012, 19:38
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
что бы не переделывать весь код, то можно сделать так, ну завернуть это куда нить или еще как нить
var
history = window.history,
pushState = history.pushState,
replaceState = history.replaceState,
initialFire = document.location.href;
history.pushState = function() {
initialFire = false;
pushState.apply( history, arguments );
}
history.replaceState = function() {
initialFire = false;
replaceState.apply( history, arguments );
}
window.onpopstate = function(){
if ( initialFire === document.location.href ) {
return initialFire = false;
}
initialFire = false;
// some code here
// ...
}
|
|
21.05.2012, 19:39
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от FINoM
|
Меня больше всего удивляет, что popstate срабатывает после load.
|
Меня больше всего удивляет что Хром и Сафари по сей день не избавились от этого ненужного действия. Оно нужно было тогда когда небыло возможности получить объект state из history но когда исправили спецификацию на эту тему, это нужно было убрать.
|
|
21.05.2012, 21:21
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
devote, melky, спасибо. Но я сделал вот так:
$( window ).bind( 'load', function( event ) {
handlers.popstate();
console.log('load');
setTimeout( function(){
$( window ).bind( 'popstate', function( event ) {
handlers.popstate();
console.log('popstate')
});
},0);
});
Прокатило.
|
|
21.02.2013, 20:37
|
|
Профессор
|
|
Регистрация: 04.10.2011
Сообщений: 357
|
|
Тему продолжу)
В FF TypeError: history is undefined с ссылкой на строку
pushState = history.pushState
|
|
|
|