2012-05-25 17 views
12

Küçük bir sitede pjax kullanarak çalışmak için bir geri tarayıcı düğmeleri yönlendirmeye çalışıyorum ve sınıf değişikliklerini işlemek ve içeri ve dışarı atmak için aşağıdaki kodla geldim çeşitli bindirmeleri.Popstat ilk yükünü yok sayma, pjax ile çalışma nasıl yapılır

Ancak Chrome ve Safari'nin ilk sayfa yükünü bir popstate olarak ele aldığını ve bu nedenle bana üzülüyor olduğunu öğrendim. Bunu durdurmanın bir yolu var mı? Eğer pushState() çağırdığınızda

$(window).on("popstate", function() { 
    if ($('body').hasClass('info')) { 
    $('body').removeClass("info").addClass("work"); 
    $('.info_overlay').fadeOut(duration); 
    alert('popstate'); 

    } else if ($('body').hasClass('work')) { 
    $('body').removeClass("work").addClass("info"); 
    $('.info_overlay').fadeIn(duration);  

    } else { 
    $('body').removeClass("project").addClass("work"); 
    $('.project_overlay').fadeOut(duration); 
    } 
}); 

cevap

3

Aslında bu çözümü pjax'un kendisinde buldum. Yerine yapmanın

: benim yaptığım ilk sayfa yüklemesinde popstate ateş

$(window).on('popstate', function() { ... 

:

$(window).on('pjax:popstate', function() {... 
+0

Chrome'da benim için çalışmaz 39 – s29

29

Etiket devlet, sonra etiketi olmayan tüm popstate olayları görmezden. Örneğin.

history.pushState({ myTag: true }, ...) 

$(window).on("popstate", function(e) { 
    if (!e.originalEvent.state.myTag) return; // not my problem 
    // rest of your popstate handler goes here 
} 

geri başlangıçtaki sayfa yükleme geldiğinizde popstate işleyebilir böylece Sayfanın yüklendiği replaceState aramaya unutma.

$(function() { history.replaceState({ myTag: true }); }); 
+0

Aslında çözümün pjax içinde olduğunu buldum. Bu yüzden, –

+0

yapmamak yerine, bir sayfanın ilk çağrısından sonra, bir yeniden yükleme sonrasında ve gecko/webkit/trident uygulamasında çalışan tek çözüm budur. Artı popstate çağrısı davranış tarayıcılarını değiştirmeden! Harika çözüm. Teşekkürler! – griffla

+0

Bugün benim testlerimde, herhangi bir geçerli tarayıcıda 'event.originalEvent' mevcut değil. Bunun bir varyasyonu ('event.state' kullanılarak), Chrome ve Firefox'un mevcut sürümlerinde çalışıyor gibi görünürken, Safari (8.0.6), 'event.state' için 'null' değerini alır ve _any_ öğesini bulamıyorum. Daha sonra başvurmak için "pushState" ile itilen veriler. Safari, yeni IE6'dır. –

2

en iyi uzun vadeli düzeltme etmektir yukarı oylama Google düzeltmek için almak için https://code.google.com/p/chromium/issues/detail?id=63040 bu. Yaklaşık iki yıldır HTML5 özelliklerine uyumsuz olduklarını biliyorlar. Safari ve krom tarayıcılarda bir popstate olarak ilk sayfa yükü çözmek için

+1

“Durum: Sabit” ve orada bir yorum var: “Chrome 32'de kararlı, Chrome Canary 34'de sabitlenmiş değil.” - 10 Şubat 2014. – MMachinegun

0
var StateHelper = { 

    pushState: function(url) { 
     if(window.history.pushState) { 
      window.history.pushState({"popstate": true}, '', url); 
     } 
    }, 

    updateStateData: function(stateData) { 
     if(window.history.replaceState) { 
      window.history.replaceState(stateData, '', window.location.href); 
     } 
    } 
}; 

/** 
* NOTE: Webkit fires popstate event initial. So we modify the current state, but in the 
* event we still get null. So we can differentiate. 
*/ 
StateHelper.updateStateData({"popstate": true}); 
window.addEvent('popstate', function(e) { 
    if(e.event.state && e.event.state.popstate) { 
     window.fireEvent('pophistory', e); 
    } 
}); 

(bir Mootools çözelti)

+2

Taşma Yığına Hoşgeldiniz! Lütfen kodunuzun ne yaptığını ve sorunu neden çözeceğini açıklayın. Sadece kod içeren bir cevap (çalışsa bile) genellikle OP'nin problemlerini anlamasına yardımcı olmayacaktır. – SuperBiasedMan

1

biz SetTimeout işlevi kullanabilir.

Bu sadece çalışır!

setTimeout(function() { 
     window.addEventListener('popstate', myFunction, false); 
    }, 500);