Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   load и popstate а Chrome (https://javascript.ru/forum/misc/28394-load-i-popstate-chrome.html)

FINoM 17.05.2012 20:03

load и popstate а Chrome
 
Как избежать вызов события popstate при загрузке страницы в Хроме? Это можно сделать говнокодом: поставить таймер и смотреть, вызвалось ли одно событие, но как сделать по-человечески, не могу придумать.

melky 17.05.2012 20:31

Цитата:

Сообщение от FINoM (Сообщение 175043)
Как избежать вызов события popstate при загрузке страницы в Хроме? Это можно сделать говнокодом: поставить таймер и смотреть, вызвалось ли одно событие, но как сделать по-человечески, не могу придумать.

а что, если вешать обработчик события после загрузки?

FINoM 21.05.2012 19:09

Цитата:

Сообщение от melky
а что, если вешать обработчик события после загрузки?

Не катит :(
$( window ).bind( 'load', function( event ) {
		handlers.popstate();
		console.log( 'load' )
		$( window ).bind( 'popstate', function( event ) {
			console.log( 'popstate' )
			handlers.popstate();
		});
	});


devote 21.05.2012 19:14

Я так делал в своей библиотеке
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:28

ах да, еще перед вызовом pushState или replaceState нужно зафалсить переменную initialFire иначе в других браузерах при возврате на предыдущию страницу не сработает событие popstate

FINoM 21.05.2012 19:31

Меня больше всего удивляет, что popstate срабатывает после load.

devote 21.05.2012 19:38

что бы не переделывать весь код, то можно сделать так, ну завернуть это куда нить или еще как нить
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
    // ...
}

devote 21.05.2012 19:39

Цитата:

Сообщение от FINoM
Меня больше всего удивляет, что popstate срабатывает после load.

Меня больше всего удивляет что Хром и Сафари по сей день не избавились от этого ненужного действия. Оно нужно было тогда когда небыло возможности получить объект state из history но когда исправили спецификацию на эту тему, это нужно было убрать.

FINoM 21.05.2012 21:21

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

Прокатило.

KupueIIIKo 21.02.2013 20:37

Тему продолжу)
В FF TypeError: history is undefined с ссылкой на строку
pushState = history.pushState


Часовой пояс GMT +3, время: 23:34.