TL; DR
1- Mevcut URL'yi değiştirmek ve onu (yeni değiştirilmiş URL) geçmiş listesine yeni bir URL girişi olarak eklemek / enjekte etmek için kullanın :pushState
window.history.pushState({}, document.title, "/" + "my-new-url.html");
2- Mevcut URL'yi geçmiş girişlerine eklemeden değiştirmek için şunu kullanın :replaceState
window.history.replaceState({}, document.title, "/" + "my-new-url.html");
3- bağlı sizin üzerinde iş mantığı , pushStategibi durumlarda yararlı olacaktır:
tarayıcının geri düğmesini desteklemek istiyorsunuz
Eğer istediğiniz oluşturmak bir yeni , URL eklemek / insert / itme yeni URL'yi için tarih girdileri ve geçerli URL yapmak
kullanıcıların sayfayı aynı parametrelerle işaretlemesine izin verme (aynı içeriği göstermek için)
programlı için erişmek verileri ile stateObjdaha sonra çapa gelen ayrıştırmak
Yorumunuzdan anladığım gibi, tekrar yönlendirme yapmadan URL'nizi temizlemek istiyorsunuz.
Tüm URL'yi değiştiremeyeceğinizi unutmayın. Alan adından sonra gelenleri değiştirebilirsiniz. Bu, değiştiremeyeceğiniz anlamına gelir, www.example.com/ancak sonra gelenleri değiştirebilirsiniz.com/
www.example.com/old-page-name => can become => www.example.com/myNewPaage20180322.php
Arka fon
Kullanabiliriz:
1- Geçmiş girişlerine yeni bir değiştirilmiş URL eklemek istiyorsanız pushState () yöntemi .
2- Geçerli geçmiş girişini güncellemek / değiştirmek istiyorsanız replaceState () yöntemi .
.replaceState()yeni bir giriş oluşturmak yerine geçerli geçmiş girişini değiştirmesi.pushState() dışında tam olarak aynı şekilde çalışır . Bunun, genel tarayıcı geçmişinde yeni bir girişin oluşturulmasını engellemediğini unutmayın..replaceState()
> ".replaceState ()", bazı> kullanıcı eylemlerine yanıt olarak geçerli geçmiş girişinin> durum nesnesini veya ** URL'sini ** ** güncellemek ** istediğinizde özellikle yararlıdır.
Kodu
Bunu yapmak için, bu örnek için aşağıdaki biçime benzer şekilde çalışan pushState () yöntemini kullanacağım :
var myNewURL = "my-new-URL.php";
window.history.pushState("object or string", "Title", "/" + myNewURL );
Yerine çekinmeyin pushStateile replaceStategereksinimlere dayalı.
Sen Paramtre yerini alabilir "object or string"ile {}ve "Title"ile document.titlenihai statment olacak böylece:
window.history.pushState({}, document.title, "/" + myNewURL );
Sonuçlar
Önceki iki kod satırı aşağıdaki gibi bir URL oluşturacaktır:
https:
Olmak:
https:
Aksiyon
Şimdi farklı bir yaklaşım deneyelim. Dosyanın adını tutman gerektiğini söyle. Dosya adı sondan sonra /ve sorgu dizesinden önce gelir ?.
http:
Olacak:
http:
Bunun gibi bir şey onu çalıştıracak:
var myNewURL = refineURL();
window.history.pushState("object or string", "Title", "/" + myNewURL );
function refineURL()
{
var currURL= window.location.href;
var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
var beforeQueryString= afterDomain.split("?")[0];
return beforeQueryString;
}
GÜNCELLEME:
Bir astar hayranı için bunu konsolunuzda / firebug'ınızda deneyin ve bu sayfanın URL'si değişecektir:
window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);
Bu sayfanın URL'si şundan değişecek:
http:
İçin
http:
Not: olarak Samuel Liew Aşağıdaki açıklamalarda gösterilmiş, bu özellik yalnızca tanıtıldı HTML5.
Alternatif bir yaklaşım, sayfanızı gerçekten yeniden yönlendirmektir (ancak "?" Sorgu dizesini kaybedeceksiniz, yine de gerekli mi veya veriler işlendi mi?).
window.location.href = window.location.href.split("?")[0];
Not 2:
Firefox window.history.pushState({}, document.title, '');, son bağımsız değişken boş bir dize olduğunda görmezden geliyor gibi görünüyor . Eğik çizgi ( '/') eklemek beklendiği gibi çalıştı ve url dizesinin tüm sorgu bölümünü kaldırdı. Chrome, boş bir dizeyle iyi görünüyor.