Sayfayı yenilemeden URL parametrelerini kaldırın


172

"?" İşaretinden sonraki her şeyi kaldırmaya çalışıyorum. tarayıcı url'sinde belge hazır.

İşte denediğim şey:

jQuery(document).ready(function($) {

var url = window.location.href;
    url = url.split('?')[0];
});

Bunu yapabilirim ve aşağıdaki çalıştığını görebilirim:

jQuery(document).ready(function($) {

var url = window.location.href;
    alert(url.split('?')[0]);
});

Bir sayfada iki form bulundurun ve bir form gönderildiğinde, alışveriş sepetine bir ürün ekler ve sayfa yenilendikten sonra url'ye uzun bir parametre ekler. Bu yüzden, belge hazır olduğunda ve bir? İle başladığında bu parametreyi kaldırabilmek istiyorum.
Derek

1
Sayfayı yenilemek istiyorsanız, neden bekleyesiniz .ready()? Yeni bir URL'ye yönlendirmek için beklemenize veya sadece .pushState()Joraid'in önerdiği şekilde kullanmanıza gerek yoktur.
jfriend00

Yanıtlar:


255

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";//the new URL
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://domain.tld/some/randome/url/which/will/be/deleted/

Olmak:

https://domain.tld/my-new-url.php

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://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john

Olacak:

http://www.someDomain.com/keepThisLastOne.php

Bunun gibi bir şey onu çalıştıracak:

 //fetch new URL
 //refineURL() gives you the freedom to alter the URL string based on your needs. 
var myNewURL = refineURL();

//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced. 
window.history.pushState("object or string", "Title", "/" + myNewURL );


//Helper function to extract the URL between the last '/' and before '?' 
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php' 
 //pseudo code: edit to match your URL settings  

   function refineURL()
{
    //get full URL
    var currURL= window.location.href; //get current address
    
    //Get the URL between what's after '/' and befor '?' 
    //1- get URL after'/'
    var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
    //2- get the part before '?'
    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://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103

İçin

http://stackoverflow.com/22753103#22753103

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]; //"http://www.newurl.com";

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.


3
Bunun yalnızca bir HTML5 özelliği olduğunu söylemeyi unuttunuz. developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Samuel Liew

Son bölü işaretini neden çıkarıyorsun? Bunun OP'nin sorusuyla ne alakası var? Sadece sorgu dizesinden kurtulmak istiyorlar. İlk soru işareti, sorgu dizesinin başlangıcını tanımlar.
jfriend00

6
replaceStatedaha uygun görünüyor, ancak aynı pushStatezamanda işe yarayacaktır, ta ki tarayıcıdaki geri ve ileri düğmelerine tıklamaya başlayana ve History API ile çalışmak için tüm kitaplıkların olduğunu fark edene kadar.
adeneo

@ jfriend00, işlevin davranışına bağlı olarak, üçüncü parametreye eklediğiniz şey, alan adından sonra yani www.example.com/'deki gibi URL'ye yerleştirilecektir. OP'nin alan adı ile? Arasında birden fazla / olması ihtimali vardır. web sitesi bir alt dizinde ise, bu nedenle, soru url'nin nasıl değiştirileceği, şimdi nasıl doğru bir şekilde alınacağıyla ilgili olduğundan, daha iyi bir url ayrıntılandırması yapmak ve yapmak ona kalmıştır.
Muhammed Joraid

Sadece buna hiç ihtiyacın olmadığını söylüyorum url.substring(url.lastIndexOf('/') + 1);. url.split("?")[0]OP'nin tek istediğini düşündüğüm ilk soru işaretinden önceki kısmı alacağım. OP'nin sorusu şu soruyu sorar: "Tarayıcı url'sinde"? "İşaretinden sonraki her şeyi kaldırmaya çalışıyorum".
jfriend00

173

Bunların hepsi yanıltıcıdır, tek bir sayfalık uygulamada farklı bir sayfaya gitmek istemediğiniz sürece tarayıcı geçmişine asla eklemek istemezsiniz. Sayfada değişiklik yapmadan parametreleri kaldırmak istiyorsanız, şunları kullanmalısınız:

window.history.replaceState(null, null, window.location.pathname);

5
KISS (Keep aptalca ve basittir). OP,? ve bu, onun istediği şey için alabileceğiniz en basit cevap!
Warface

Firefox üzerinde çalışmadı. Yenileme sırasında get parametreleri görünmeye devam eder. Hem it hem de değiştir kullanarak çalışır. window.history.replaceState ({sayfa: konum.pathname}, document.title, window.location.pathname); window.history.pushState ({sayfa: konum.pathname}, document.title, window.location.pathname);
Ajay Singh

1
history.replaceState (null, null, location.pathname + location.hash) - bu bölümü kaldırmak istemiyorsanız location.hash ekleyin
eselk

29

bunu yapmanın basit bir yolu, herhangi bir sayfada çalışır, HTML 5 gerektirir

// get the string following the ?
var query = window.location.search.substring(1)

// is there anything there ?
if(query.length) {
   // are the new history methods available ?
   if(window.history != undefined && window.history.pushState != undefined) {
        // if pushstate exists, add a new state to the history, this changes the url without reloading the page

        window.history.pushState({}, document.title, window.location.pathname);
   }
}

Bu inanılmaz derecede iyi çalışıyor. Ne yazık ki neden işe yaradığına dair ilk ipucuna sahip değilim. Yine de minnettarım.
Matt Cremeens

1
ilk iki satır,? işaretinden sonra bir şey olup olmadığını kontrol eder. (alt dizgi sadece '?' karakterini kaldırır) sonra tarayıcının yeni pushstate çağrısını destekleyip desteklemediğini kontrol ediyorum ve son olarak url yığınına bir durum eklemek için pushstate kullanıyorum (bu yığın üzerinde url'leri itip açabilirsiniz), window.location .pathname yerel bir url eksi sorgu ve eksi alan adı ve önek ( domain.com/THIS?notthis )
Martijn Scheffer


24

Bunun için en iyi ve en basit yöntemin olduğuna inanıyorum:

var newURL = location.href.split("?")[0];
window.history.pushState('object', document.title, newURL);

11

URL’min sonunda şu gibi özel bir etiketim varsa: http://domain.com/?tag=12345 URL’de her sunulduğunda bu etiketi kaldırmak için aşağıdaki kod:

<script>
// Remove URL Tag Parameter from Address Bar
if (window.parent.location.href.match(/tag=/)){
    if (typeof (history.pushState) != "undefined") {
        var obj = { Title: document.title, Url: window.parent.location.pathname };
        history.pushState(obj, obj.Title, obj.Url);
    } else {
        window.parent.location = window.parent.location.pathname;
    }
}
</script>

Bu, bir veya daha fazla (veya tüm) parametrenin URL'den kaldırılması fikrini verir.

Window.location.pathname ile temelde her şeyi '?' url'de.

var yol adı = pencere.konum.pathname; // Yalnızca yolu döndürür

var url = window.location.href; // Tam URL'yi döndürür


Bunun soruyu yanıtladığından emin değilim, ancak sorunun kendisi net değil :)
Martijn Scheffer

@MartijnScheffer doğru, orijinal soruyu yanıtlamak için cevabı geliştirdim, not için teşekkürler.
Tarık

11

Yalnızca bir parametreyi kaldırmak istedim success. Bunu şu şekilde yapabilirsiniz:

let params = new URLSearchParams(location.search)
params.delete('success')
history.replaceState(null, '', '?' + params + location.hash)

Bu da devam ediyor #hash.


URLSearchParamsIE üzerinde çalışmayacak, ancak Edge için çalışılıyor . Şunları yapabilirsiniz Bir polyfill kullanmak veya IE-destek için bir naif yardımcı işlevi kullanabilirsiniz:

function take_param(key) {
    var params = new Map(location.search.slice(1).split('&')
        .map(function(p) { return p.split(/=(.*)/) }))   
    var value = params.get(key)
    params.delete(key)
    var search = Array.from(params.entries()).map(
        function(v){ return v[0]+'='+v[1] }).join('&')
    return {search: search ? '?' + search : '', value: value}
}

Bu şu şekilde kullanılabilir:

history.replaceState(
    null, '', take_param('success').search + location.hash)

Harika çözüm, '?' Eklememenin bir yolu var mı? hiçbir parametre geçilmezse?
ricks

2
Tabii @RickS, take_paramzaten bu yapıyor, ancak yapabilir URLSearchParamsyaparak aynı şeyi: history.replaceState(null, '', (params ? '?' + params : '') + location.hash). Ya da nasıl isterseniz.
odinho - Velmont

10

Daha iyi çözüm:

window.history.pushState(null, null, window.location.pathname);

6

Bu çözümlerden hiçbiri benim için gerçekten işe yaramadı, işte birden fazla parametreyi de kaldırabilen IE11 uyumlu bir işlev:

/**
* Removes URL parameters
* @param removeParams - param array
*/
function removeURLParameters(removeParams) {
  const deleteRegex = new RegExp(removeParams.join('=|') + '=')

  const params = location.search.slice(1).split('&')
  let search = []
  for (let i = 0; i < params.length; i++) if (deleteRegex.test(params[i]) === false) search.push(params[i])

  window.history.replaceState({}, document.title, location.pathname + (search.length ? '?' + search.join('&') : '') + location.hash)
}

removeURLParameters(['param1', 'param2'])

2
//Joraid code is working but i altered as below. it will work if your URL contain "?" mark or not
//replace URL in browser
if(window.location.href.indexOf("?") > -1) {
    var newUrl = refineUrl();
    window.history.pushState("object or string", "Title", "/"+newUrl );
}

function refineUrl()
{
    //get full url
    var url = window.location.href;
    //get url after/  
    var value = url = url.slice( 0, url.indexOf('?') );
    //get the part after before ?
    value  = value.replace('@System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"]','');  
    return value;     
}

1

Sayfayı yenilemeden tüm parametreleri temizlemek için VE HTML5 kullanıyorsanız, bunu yapabilirsiniz:

history.pushState({}, '', 'index.html' ); //replace 'index.html' with whatever your page name is

Bu, tarayıcı geçmişine bir giriş ekleyecektir. replaceStateYeni bir giriş eklemek istemeyeceğinizi ve yalnızca eski girişi değiştirmek isteyip istemediğinizi de düşünebilirsiniz .


0

Jquery'de <

window.location.href =  window.location.href.split("?")[0]

6
Bununla ilgili jQuery hiçbir şey yok
j08691

0

Burada, konum karmasını koruyan ve aşağıdakileri kullanarak tarayıcı geçmişini kirletmeyen bir ES6 tek astarı replaceState:

(l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location)

Bununla ilgili biraz daha bilgi ekleyebilir misiniz, bunun ne yaptığını anlamak zor.
ricks

2
@RickS Bu bir IIFE'dir (hemen çağrılan işlev ifadesi) bu yüzden parantez () (konum) içine sarılır, ilk parantez anonim bir işlev olarak kendi başına kalmasını sağlar, sondaki (konum) hemen onu geçen işlevi çağırır küresel locationaka window.locationfonksiyon globalsin erişimi vardır böylece nesne, locationolarak lkalan diğer tüm yanıtlar gibi temel replaceState, o yeni url olarak yol adı ve karma (example.com/#hash) bitiştirme ediyor. Bana bildirin değilse o 😉, sindirilebilir Umarım
Can Rau

@ Neden sadece kullanmayalım window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Fabian von Ellerts

@FabianvonEllerts Aslında güzel bir soru, gerçekten emin değilim, tek şey location2 kez yazmak zorunda değilsin 😁 ama onu bir değişkene atamana gerek yok 😉 yoksa daha fazlası mı Joey?
Can Rau

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.