2010-11-05 18 views
44

İçeriği dinamik olarak yüklemek için karma kullanıyorum. Geri düğmesini çalıştırmak için karma değişiklikleri ele geçiriyorum. Ancak bazen hash değiştirilmiş fonksiyonunu tetiklemeden hash değerini değiştirmem gerekiyor (ör., Sayfa sunucu tarafına yönlendirildiğinde ve içerik geri döndüğünde karma güncellemeye ihtiyacım olduğunda.)Karma bir hashchange olayı tetiklemeden hash değerini değiştir

En iyi çözüm hashchange olayını açmak, değişikliği yapmak ve sonra yeniden adlandırmaktır. Ancak, bu zaman uyumsuz olarak gerçekleştiğinden, çok hızlı bir şekilde yeniden ispat ettiğini ve hala karma değişimin yakalandığını görüyorum. Şu anda

Benim çözümüm çok kötü: Bir setTimeout içinde yeniden bağlantı kurma. Daha iyi bir fikri olan var mı?


$(window).unbind('hashchange', hashChanged); 
    window.location.hash = "!" + url; 
    setTimeout(function(){ 
     $(window).bind('hashchange', hashChanged); 
    }, 100); 

Düzenleme:
Amir Raminfar önerisi bir zaman aşımı gerektirmeyen bir çözüm beni istenir.

function hashChanged(event){ 
    if(_ignoreHashChange === false){ 
     url = window.location.hash.slice(2); 
     fetchContent(url); 
    } 
    _ignoreHashChange = false; 
} 
+4

güzel, basit bir çözüm, ister yapmalıdır bir cevap – Peter

+1

tek şey, yeni hash'ın _ignoreHashChange = true değerini belirlemeden önceki eski değere eşit olmadığını kontrol etmektir; – Kasheftin

+1

Tüm şeyler üzerinde iyi kontrol sağlayan Cowboy's BBQ kütüphanesine göz atmak isteyebilirsiniz Geri ve Hashchange: http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js. html – hybernaut

cevap

5

Sen sahip olabilir:

_ignoreHashChange = true; 
window.location.hash = "!" + url; 

ve karma etkinlik yapar değiştirdi: Ben bu do sessizce karma değiştirmek istediğinizde

_ignoreHashChange = false; 

değişken bir sınıf ekledi böyle bir işlevi:

function updateHash(newHash){ 
    ... 
    oldHash = newHash 
} 

sonra setTimeout size el güncelleme karma çağırabilir ve olayın tetiklediği olmayacak Şimdi

function(){ 
    if(oldHash != currenHash){ 
    updateHash(currenHash); 
    } 
} 

yapmak gerekir. Başka şeyler yapmak için updateHash'ta daha fazla parametreniz de olabilir.

Bu arada, jQuery history eklentisine baktınız mı? http://tkyk.github.com/jquery-history-plugin/

+0

Ayarlanmış bir aralık olmalı, ama evet, prensipte işe yarayacaktı. Teşekkürler. – SystemicPlural

+1

Evet Çeşitli eklentilere baktım. İhtiyaçlarım için hepsi çok şişirilmiş ya da buggy. – SystemicPlural

+0

Bir zaman aşımı gerektirmeyen daha iyi bir çözüm sunmamı istediniz. Ayrıntılar için ana sayfamdaki düzenlemeye bakın. Yardımınız için teşekkürler. – SystemicPlural

5

Sen hashchange olayı tetiklemeden cari URI yerine, karma history.replaceState kullanıp ekleme olabilir:

var newHash = 'test'; 

history.replaceState(null, null, document.location.pathname + '#' + newHash); 

JSFiddle example

+0

'history.replaceState 'de hashchange'i tarihe de zorlamıyor, ancak isterseniz' geçmişini kullanabilirsiniz.pushState';) – qdev

+0

@qdev Evet, ama QA'nın sorduğu şey bu değildi ... – Tim

İlgili konular