Geçmişi etkilemeden hash navigasyonu kullanabilir misiniz?


100

Korkarım bu imkansız olabilir , ancak tarayıcının geçmişinde bir giriş bırakmadan ve yeniden yüklemeden bir URL'nin karma değerini değiştirmenin bir yolu var mı? Yoksa eşdeğeri mi?

Ayrıntılara gelince, şu satırlar boyunca bazı temel hash navigasyonu geliştiriyordum:

//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
    //set js-tab according to hash
    newHash = newHash.replace('#'+hashPref, '');
    $("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
    //set hash according to js-tab
    window.location.hash = hashPref + newHash;

    //THIS IS WHERE I would like to REPLACE the location.hash
    //without a history entry

}
    // ... a lot of irrelavent tabs js and then....

    //make tabs work
    $("#tabs.js-tabs a").live("click", function() {
        var showMe = $(this).attr("href");
        $(showMe).show();
        setHash(showMe);
        return false;
    });
    //hash nav on ready .. if hash exists, execute
    if ( getHash ){
        useHash(getHash);
    }

Tabii ki jQuery kullanmak. Buradaki fikir, bu belirli durumda 1) kullanıcının her sekme değişikliğine geri dönmesini sağlamak, gereksiz referansları biriktirerek etkili bir şekilde 'geri düğmesini kırabilir' ve 2) yenilemeye basarlarsa o anda hangi sekmede bulunduklarını korumamaktır. bir sıkıntı.


Geçmişi takip etmek istemiyorsanız neden karmayı değiştirmek istiyorsunuz? : |
Ionuț Staicu

10
Yenileme sırasında kullanıcıya üzerinde bulundukları sekmeyi sunmak en iyisidir, ancak sekmeler arasında gidip gelebilecekleri için, geçmişlerini gereksiz yere girişlerle doldurarak geri düğmesini daha az kullanışlı hale getirir. Yine de bu sadece bir örnektir - herhangi bir zaman için geçici bir durumu kaydetmeniz gerekebilir, ancak çerezlere güvenmek veya kullanıcının geçici dosyasını bunlarla doldurmak istemezsiniz. Yenilediğinizde js içeriği bıraktığınız gibidir - sayfadan ayrılmamışsınızdır ve bu bir atlama noktası veya bir psuedo sayfası değildir, bu nedenle geçmiş girişi yalnızca standart gezinmeyi engelleyebilir.

Yanıtlar:


95

location.replace("#hash_value_here");IOS Chrome'da çalışmadığını bulana kadar benim için iyi çalıştı. Bu durumda şunları kullanın:

history.replaceState(undefined, undefined, "#hash_value")

history.replaceState () , tam olarak history.pushState () gibi çalışır, tek farkı, replaceState () öğesinin yeni bir giriş oluşturmak yerine geçerli geçmiş girişini değiştirmesidir.

URL'nin #veya son kısmının değiştirilmesini sağlamayı unutmayın .


3
Tamamen modern tarayıcılar için gitmenin yolu; Yine de kısmi destek oturumu geçmişi yönetiminin farkında olun .
Matt

Bunu nasıl kullanacağım konusunda kafam karıştı. Yine de window.location.hash = 'my-hash';ardından kullanmalı mıyım history.replaceState(undefined, undefined, "#my-hash")?
Bram Vanroy

2
@BramVanroy Hayır, ikincisini kullanmak yeterlidir.
Lucia

2
Kullanmadığınız sürece: hedef seçiciler ... o zaman geçmiş işlevleri işe yaramaz, çünkü spesifikasyonun bu kısmı (geçmiş işlemleriyle css etkileşimi) şu anda tanımlanmamış gibi görünüyor ve stil geçmişte çoğu / tüm tarayıcı tarafından değiştirilmiyor.
morphles

@Luxiyalu, history.replaceStatefarkı location.replacenedir?
Pacerier

99
location.replace("#hash_value_here"); 

Yukarıdakiler peşinde olduğunuz şeyi yapıyor gibi görünüyor.


4
Budur. Ve uri segmentleriniz varsa, location.replace (window.location + "#hash") onları koruyacaktır.
otlaklar

7
Bu yöntemi ikinci kez kullanmak, daha temiz, doğru cevap olarak işaretlenmesini diliyorum.
joeellis

14
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);hash'i güncellemek için
johnstorm

1
Windows 8 altında Chrome 30'da test ediyorum, Chrome Geçmişine gidip test urlimin altında "Bu siteden daha fazlası" nı seçersem, bu yöntemle eklenen tüm karmaları görebilirim.
Alex Vang

1
Location.replace'in ('# hash_value_here') yolu değil, yalnızca karma parçasını değiştirdiğine dikkat edin, bu nedenle sayfa yüklemesini tetiklemez .... Belgenin bir temel etiket içermesi dışında: <base href ="http://example.com/" /> Bir temel etiket içermiyorsa , daha sonra değiştirme yöntemini sadece bir satır aralığı ile kullandığınızda, "#hash_value_here"aslında konum.replace (' example.com/#hash_value_here' ) dediniz gibi olacaktır . Burada okuduğunuzda bu apaçık görünüyor, ancak bir yol parçası olan bir sayfadayken ve temelin belirlendiğini fark etmediğinizde bu çok zor.
Tyler Kasten

6

Düzenleme: Birkaç yıl oldu ve tarayıcılar gelişti.

@ Luxiyalu'nun cevabı gitmenin yolu

- Eski Cevap -

Ben de imkansız olduğunu düşünüyorum (şu anda). Peki kullanmayacaksanız neden hash değerini değiştirmeniz gerekiyor?

Programcılar olarak hash değerini kullanmamızın ana nedeninin, kullanıcının sayfalarımıza yer işareti koymasına veya tarayıcı geçmişindeki bir durumu kaydetmesine izin vermek olduğuna inanıyorum. Bunların hiçbirini yapmak istemiyorsanız, durumu bir değişkene kaydedin ve oradan çalışın.

Bir hash kullanmanın sebebinin kontrolümüz dışındaki bir değerle çalışmak olduğunu düşünüyorum. İhtiyacınız yoksa, muhtemelen her şeyin kontrolünüz altında olduğu anlamına gelir, bu yüzden durumu bir değişkende saklayın ve onunla çalışın. (Kendimi tekrarlamayı seviyorum)

Umarım bu size yardımcı olur. Belki sorununun daha kolay bir çözümü vardır.

GÜNCELLEME: Buna ne dersiniz:

  1. Bir ilk karma ayarlayın ve tarayıcı geçmişine kaydedildiğinden emin olun.
  2. Yeni bir sekme seçildiğinde, yapın window.history.back(1), bu, geçmişin ilk init hash'inizden geri dönmesini sağlar.
  3. Şimdi yeni karmayı ayarladınız, bu nedenle sekme geçmişte yalnızca bir giriş yapacaktır.

Geçerli girişin geri dönülerek "silinip silinemeyeceğini" veya ilk adımı atlayıp atlayamayacağınızı bilmek için muhtemelen bazı işaretler kullanmanız gerekecektir. Ve emin olmak için, "karma" için yükleme yönteminizin history.back,.


Kaçırdığım temel bir şey olması çok olası (tükenme güzel bir bahane, bununla devam edeceğim) ama yeniden yüklemede değişen değerini koruyacak bir değişken ayarlayabileceğimi mi söylüyorsunuz? Bir kurabiye dışında mı? (Kurabiyeler bir şekilde aşırı gözüküyor ..) Belki de net olmayan şey budur. Hash değerini kullanacağım - özellikle yeniden yüklemede. Cevap verdiğiniz için teşekkürler!

Açıklamamı açıklığa kavuşturmak için: kullanıcı yeniden yüklemeyi tıklarsa. Hash bunun için. Hala normal kullanımlarında yeniden yüklemekten kaçınmaya çalışıyorum (sekmeleri değiştirme / tıklama).

Tamam, yeniden yükledikten sonra bilgi için bazı değerler kullanacaksınız. Maalesef, hash değeri bazı tarayıcıların geçmişi tarafından seçilecektir. Bunu söylediğim için üzgünüm ama benim deneyimime göre en iyi bahsiniz kurabiyelerdir. Tarayıcı geçmişinin algılamadığı bir şey istiyorsanız, ancak maalesef çerezleri yeniden yükledikten sonra saklamak istiyorsanız. Kullanıcı bir bağlantıya tıklıyorsa, bağlantıyı bir sorgu ( ?mystate=greatness) olacak şekilde kurabilirdiniz, ajax olması gerekmese de, isteği başlatırken javascript'in okuması için bilgileri kaydedebilirsiniz.
guzart

Evet, hash, yeniden
yüklemeye tıkladıktan

Evet, haklı olduğunu düşünüyorum. Ah peki. (Başka bir yöntemle yanlış kanıtlanmak

-1

Köprü üzerindeki tıklama olaylarını yakalamak için her zaman bir olay dinleyicisi oluşturabilirsiniz ve geri arama işlevinde, tarayıcının bunu geçmişe eklemesini engellemesi gereken e.preventDefault () işlevini koyabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.