AJAX Uygulamasında Adres Çubuğu URL'sini Mevcut Durumla Eşleşecek Şekilde Değiştirin


166

Bir AJAX uygulaması yazıyorum, ancak kullanıcı uygulama içinde hareket ettikçe, sayfa çubuğunun yeniden yüklenmemesine rağmen adres çubuğundaki URL'nin güncellenmesini istiyorum. Temel olarak, herhangi bir noktada yer imi ekleyebilmelerini ve böylece mevcut duruma dönmelerini istiyorum.

AJAX uygulamalarında insanlar RESTfulness'i nasıl idare ediyor?


2
Uygulamalarınızın durumunu maitain etmek için kullanılır, ancak "RESTfulness" ile ilgisi yoktur.
Mohamed

29
window.history.pushState(null,'hi','page1?id=32')
Omu

3
kabul edilen cevap 5 yıl önce yazılmış ve bu arada window.history.pushState gibi, @Omu'nun söylediği gibi. location.hash sayısız sorunları getirdi ve bundan kaçınmak en iyisidir.
pcarvalho

PushState yaklaşımını öne çıkarmak için cevabı düzenledim.
Ocak 2014

Yanıtlar:


116

Bunu yapmanın yolu location.hash, AJAX güncellemeleri, ayrı bir URL'ye sahip olmak istediğiniz bir durum değişikliğiyle sonuçlandığında değişiklik yapmaktır . Örneğin, sayfanızın URL'si:

http://example.com/

Bir istemci tarafı işlevi bu kodu çalıştırdıysa:

// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

Ardından, tarayıcıda görüntülenen URL şu şekilde güncellenir:

http://example.com/#foo

Bu, kullanıcıların sayfanın "foo" durumuna yer işareti koymasına ve durumlar arasında gezinmek için tarayıcı geçmişini kullanmasına olanak tanır.

Bu mekanizma yürürlükte olduğunda, fragman tanımlayıcıları (# 'dan sonraki kısım) sunucusu.

Ben Alman'ın hashchange eklentisi jQuery kullanıyorsanız bunu bir esinti yapar.


Haklı görünüyorsun. Tek yaklaşım bu. Bu, tavsiyelerinizin ayrıntılı ve ayrıntılı bir açıklaması gibi görünüyor: < ajaxpatterns.org/Unique_URLs >
jasonjwwilliams

@buymeasoda Düzenleme için teşekkürler; O kısmı yazarken ne düşündüğümü bilmiyorum.
Dave Ward

1
Vay be, bu cevap çok yardımcı oldu. URL örnekleri biraz kafa karıştırıcı olsa da, SO bağlantıları otomatik olarak başlıklarla değiştiriyor olabilir. URL'lerin tamamını düz metin olarak görebilmemiz için bunları example.com ve example.com/#foo gibi bir şeyle değiştirmeye ne dersiniz?
Neil

4
@Pascal Yalnızca HTML5'in pushState özelliğini destekleyen tarayıcılarda yapabilirsiniz. Bu konuda iyi bilgiler: diveintohtml5.info/history.html
Dave Ward

1
Tarayıcı uyumluluğu için temelleri kapsayacak şekilde history.js'nin büyük bir hayranı oldum github.com/andreasbernhard/history.js
jocull

18

Book.cakephp.org gibi sitelere bakın. Bu site URL'yi karma ve AJAX kullanmadan değiştirir. Tam olarak nasıl yaptığından emin değilim ama anlamaya çalışıyorum. Biri bilirse, bana bildirin.

Ayrıca github.com belirli bir proje içinde bir navigasyona bakarken.


GitHub ile bir hafta kadar önce fark ettim. Bunu nasıl yapıyorlar? Geri dönüp kontrol etmelisin.
Drew Noakes

16
PushState () javascript işlevini kullanıyor gibi görünüyor. Bu, tarayıcınızın geçmişine katkıda bulunur. İçine bak; oldukça ilginç ve havalı.
daniel.wright

Bunun için teşekkürler, tam da aradığım şey buydu. Github'ın bunu nasıl yaptığını merak etmiştim. İlk başta yeniden yüklenmesi gerektiğini düşündüm ama sadece AJAX istekleri vardı. Opera'da sayfayı yeniden yükledi.
kamranicus

Benzer teknik, farklı grupların sayfalarında gezinirken fb tarafından kullanılır. Farklı grupların bahsedildiği sol gezinme sütununuz var. Belirli bir grup adına tıkladığınızda url değişir ve url ile birlikte yalnızca ana içerik bölmesinin içeriği değişir (karma yok). Kullanıcı sayfayı yeniden yüklediğinde, ana sayfaya değil grupların sayfasına yönlendirilir.
Madeyedexter


11

Bu Kevin'in söylediklerine benzer. İstemci durumunuzu bazı javascript nesnesi olarak alabilir ve durumu kaydetmek istediğinizde, nesneyi serileştirebilirsiniz (JSON ve base64 kodlamasını kullanarak). Daha sonra href parçasını bu dizeye ayarlayabilirsiniz.

var encodedState = base64(json(state));
var newLocation = oldLocationWithoutFragment + "#" + encodedState;

document.location = newLocation; // adds new entry in browser history
document.location.replace(newLocation); // replaces current entry in browser history

İlk yol yeni durumu yeni bir konum olarak ele alacaktır (böylece geri düğmesi onları önceki konuma götürecektir). İkincisi değil.


Sayfayı yenilemeden yer işareti geçmişine giriş eklemenin bir yolu var mı? Konumun ayarlanması (ilk örneğinizde olduğu gibi) yenilemeye neden olur, değil mi?
Drew Noakes

document.location.replace yapmak da tarayıcıyı o url'ye yönlendirir (sadece krom konsolunda denedi)
Omu

3

SWFAddress, Flash ve Javascript projelerinde çalışır ve yer imi URL'leri oluşturmanıza (yukarıda belirtilen karma yöntemini kullanarak) ve size geri düğmesi desteği vermenize olanak tanır.

http://www.asual.com/swfaddress/


3

Window.location.hash yöntemi bir şey yapmanın tercih edilen yoludur. Bunun nasıl yapılacağıyla ilgili bir açıklama için Ajax Patterns - Benzersiz URL'ler .

YUI, bu kalıbı bir modül olarak uygular ve geri düğmesinin karma'yı kullanarak adresi yeniden yazmakla birlikte çalışmasını sağlamak için IE'ye özgü çalışmaları içerir. YUI Tarayıcı Geçmişi Yöneticisi .

Diğer çerçeveler de benzer uygulamalara sahiptir. Önemli olan, geçmişin adresin yeniden yazılmasıyla birlikte çalışmasını istiyorsanız, farklı tarayıcıların bu adresleri işlemek için farklı yollara ihtiyacı vardır. (Bu ilk bağlantı makalesinde detaylandırılmıştır.)

IE'nin iframe tabanlı bir saldırıya ihtiyacı var, burada Firefox aynı yöntemi kullanarak çift geçmiş üretecek.


3

OP veya diğerleri hala durumu etkinleştirmek için tarayıcı geçmişini değiştirmenin bir yolunu arıyorsa, IESUS tarafından önerildiği gibi pushState ve replaceState'i kullanmak, bunu yapmanın 'doğru' yoludur. Bu konuma göre ana avantaj. Sadece karma değil, gerçek url'ler oluşturuyor gibi görünüyor. Karma kullanan tarayıcı geçmişi kaydedilip javascript devre dışı bırakıldığında yeniden ziyaret edilirse, karma sunucuya gönderilmediğinden uygulama çalışmaz. Ancak, pushState kullanıldıysa, tüm rota sunucuya gönderilir ve daha sonra rotalara uygun şekilde yanıt vermek için oluşturabilirsiniz. Hem sunucu hem de istemci tarafında aynı bıyık şablonlarının kullanıldığı bir örnek gördüm. İstemcide javascript etkinleştirilmişse, sunucuya gidiş dönüşten kaçınarak hızlı yanıtlar alır, ancak uygulama javascript olmadan mükemmel bir şekilde çalışır. Böylece, uygulama javascript yokluğunda incelikle degrade olabilir.

Ayrıca, history.js gibi bir isimle orada bazı çerçeve olduğuna inanıyorum. HTML5'i destekleyen tarayıcılar için pushState kullanır, ancak tarayıcı bunu desteklemiyorsa otomatik olarak karma kullanmaya geri döner.


2

Kullanıcının sayfada 'içinde' olup olmadığını kontrol edin, url çubuğunu tıkladığınızda javascript sayfanın dışında olduğunuzu söylüyor. URL çubuğunu değiştirir ve içindeki '#' simgesiyle 'ENTER' tuşuna basarsanız, sayfaya fare imleci ile manuel olarak tıklamadan tekrar sayfaya girersiniz, ardından javascript'ten bir keyboad olay komutu (document.onkeypress) yeniden yönlendirme için javascript'in girip girmediğini kontrol edebilir. Kullanıcının window.onfocus ile sayfada olup olmadığını ve window.onblur ile dışarıda olup olmadığını kontrol edebilirsiniz.

Evet, mümkün.

;)


Bu, kullanıcı # simgesiyle URL çubuğunu düzenlediğinde sayfayı değiştirmek için zarif gördüğüm yol.
Marcelo
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.