Usuń parametry adresu URL bez odświeżania strony

153

Próbuję usunąć wszystko po znaku „?” w adresie URL przeglądarki, gdy dokument jest gotowy.

Oto, czego próbuję:

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

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

Mogę to zrobić i zobaczyć, jak działa poniżej:

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

var url = window.location.href;
    alert(url.split('?')[0]);
});
Derek
źródło
Miej dwa formularze na jednej stronie, a po przesłaniu jednego z nich dodaje on produkt do koszyka i dodaje długi parametr do adresu URL po odświeżeniu strony. Chcę więc móc usunąć ten parametr, gdy dokument jest gotowy i zaczyna się od?
Derek
1
Jeśli chcesz odświeżyć stronę, po co czekać .ready()? Nie musisz czekać, aby przekierować na nowy adres URL lub po prostu używać go .pushState()zgodnie z zaleceniami Joraid.
jfriend00

Odpowiedzi:

227

TL; DR

1- Aby zmodyfikować aktualny adres URL i dodać / wstawić go (nowy zmodyfikowany adres URL) jako nowy wpis adresu URL do listy historii, użyj pushState:

window.history.pushState({}, document.title, "/" + "my-new-url.html");

2- Aby zamienić aktualny adres URL bez dodawania go do wpisów historii, użyj replaceState:

window.history.replaceState({}, document.title, "/" + "my-new-url.html");

3- W zależności od logiki biznesowej , pushStateprzyda się w takich przypadkach, jak:

  • chcesz obsługiwać przycisk Wstecz w przeglądarce

  • chcesz utworzyć na nowy adres URL, add / insert / popchnąć nowy adres URL do historii zgłoszeń, i sprawiają, że aktualny adres URL

  • umożliwiając użytkownikom dodania zakładek do strony z tymi samymi parametrami (aby wyświetlić te same treści)

  • aby programowo uzyskać dostęp do danych za pośrednictwem stateObjnastępnie analizy z kotwicy


Jak zrozumiałem z twojego komentarza, chcesz wyczyścić swój adres URL bez ponownego przekierowywania.

Pamiętaj, że nie możesz zmienić całego adresu URL. Możesz po prostu zmienić to, co pojawia się po nazwie domeny. Oznacza to, że nie możesz zmienić, www.example.com/ale możesz zmienić to, co nastąpi później.com/

www.example.com/old-page-name => can become =>  www.example.com/myNewPaage20180322.php

tło

Możemy użyć:

1- Metoda pushState (), jeśli chcesz dodać nowy zmodyfikowany adres URL do wpisów historii.

2- Metoda replaceState (), jeśli chcesz zaktualizować / zamienić bieżący wpis historii.

.replaceState()działa dokładnie tak samo, .pushState()z wyjątkiem tego, że .replaceState() modyfikuje bieżący wpis historii zamiast tworzyć nowy. Zwróć uwagę, że nie zapobiega to tworzeniu nowego wpisu w globalnej historii przeglądarki.


.replaceState()jest szczególnie przydatne, gdy chcesz zaktualizować obiekt stanu lub adres URL bieżącego wpisu historii w odpowiedzi na jakąś akcję użytkownika.


Kod

Aby to zrobić, w tym przykładzie użyję metody pushState (), która działa podobnie do następującego formatu:

var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );

Zapraszam do wymiany pushStatezreplaceState zależności od wymagań.

Można zastąpić paramter "object or string"z {}i "Title"z document.titletak ostateczna statment będzie:

window.history.pushState({}, document.title, "/" + myNewURL );

Wyniki

Poprzednie dwa wiersze kodu utworzą adres URL, taki jak:

https://domain.tld/some/randome/url/which/will/be/deleted/

Zostać:

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

Akcja

Teraz spróbujmy innego podejścia. Powiedz, że musisz zachować nazwę pliku. Nazwa pliku pojawia się po ostatnim /i przed ciągiem zapytania ?.

http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john

Będzie:

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

Coś takiego sprawi, że będzie działać:

 //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;     
}

AKTUALIZACJA:

Dla fanów z jednym liniowcem wypróbuj to w konsoli / firebug, a adres URL tej strony ulegnie zmianie:

    window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);

Adres URL tej strony zmieni się z:

http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103

Do

http://stackoverflow.com/22753103#22753103

Uwaga: jak Samuel Liew wskazał w komentarzach poniżej, ta funkcja została wprowadzona tylko dla HTML5.

Alternatywnym podejściem byłoby przekierowanie strony (ale utracisz ciąg zapytania `? ', Czy jest nadal potrzebny, czy dane zostały przetworzone?).

window.location.href =  window.location.href.split("?")[0]; //"http://www.newurl.com";

Mohammed Joraid
źródło
2
Zapomniałeś wspomnieć, że jest to tylko funkcja HTML5. developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/...
Samuel Liew
Dlaczego zrywasz się z ostatniego cięcia? Co to ma wspólnego z pytaniem PO? Chcą tylko pozbyć się ciągu zapytania. Pierwszy znak zapytania określa początek ciągu zapytania.
jfriend00
6
replaceStateWydaje się, że lepiej pasuje, ale również pushStatebędzie działać, dopóki nie zaczniesz klikać przycisków Wstecz i Dalej w przeglądarce i nie zdasz sobie sprawy, że istnieje powód, dla którego istnieją całe biblioteki do pracy z interfejsem History API.
adeneo
@ jfriend00 na podstawie zachowania funkcji, co dodasz w trzecim parametrze zostanie umieszczone w adresie URL po nazwie domeny, czyli tak jak po domenie / jak w www.example.com/. Jest szansa, że ​​OP może mieć kilka / między nazwą domeny a? w przypadku, gdy witryna znajduje się w podkatalogu, to on / ona musi sprawdzić i ulepszyć adres URL, ponieważ pytanie dotyczyło tego, jak zmienić adres URL, a teraz jak go poprawnie uzyskać.
Mohammed Joraid
Mówię tylko, że wcale tego nie potrzebujesz url.substring(url.lastIndexOf('/') + 1);. url.split("?")[0]dostanie część przed pierwszym znakiem zapytania, o co myślę, że OP. Pytanie OP brzmi: „Próbuję usunąć wszystko po znaku„? ”W adresie URL przeglądarki”.
jfriend00
157

To wszystko jest mylące, nigdy nie chcesz dodawać do historii przeglądarki, chyba że chcesz przejść do innej strony w aplikacji z jedną stroną. Jeśli chcesz usunąć parametry bez zmiany strony, musisz użyć:

window.history.replaceState(null, null, window.location.pathname);
evanjmg
źródło
3
KISS (Keep jest głupi i prosty). OP poprosił o usunięcie wszystkich po? i to jest najprostsza odpowiedź, jaką możesz uzyskać za to, o co prosił!
Warface
Nie działa w przeglądarce Firefox. Po odświeżeniu parametry pobierania nadal się pojawiają. Działa zarówno przy użyciu wypychania, jak i wymiany. window.history.replaceState ({page: location.pathname}, document.title, window.location.pathname); window.history.pushState ({page: location.pathname}, document.title, window.location.pathname);
Ajay Singh
1
history.replaceState (null, null, location.pathname + location.hash) - dodaj location.hash, jeśli nie chcesz usuwać tej części
eselk
29

prosty sposób, działa na każdej stronie, wymaga HTML 5

// 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);
   }
}
Martijn Scheffer
źródło
Działa to zadziwiająco dobrze. Niestety nie mam pierwszej wskazówki, dlaczego to działa. Mimo wszystko wdzięczny.
Matt Cremeens,
1
pierwsze dwie linie sprawdzają, czy po znaku? (podłańcuch po prostu usuwa '?'), a następnie sprawdzam, czy przeglądarka obsługuje nowe wywołanie pushstate, a na koniec używam pushstate, aby dodać stan do stosu adresów URL (możesz wypychać i wyświetlać adresy URL na tym stosie), window.location .pathname to lokalny adres URL bez zapytania oraz bez nazwy domeny i prefiksu ( domain.com/THIS?notthis )
Martijn Scheffer
23

Uważam, że najlepszą i najprostszą metodą jest:

var newURL = location.href.split("?")[0];
window.history.pushState('object', document.title, newURL);
ChristianG
źródło
11

jeśli mam specjalny tag na końcu mojego adresu URL, taki jak: http://domain.com/?tag=12345 Oto poniższy kod służący do usuwania tego tagu, gdy pojawia się w adresie URL:

<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>

Daje to pomysł usunięcia jednego lub więcej (lub wszystkich) parametrów z adresu URL

Z window.location.pathname w zasadzie otrzymujesz wszystko przed '?' w adresie URL.

var pathname = window.location.pathname; // Zwraca tylko ścieżkę

var url = window.location.href; // Zwraca pełny adres URL

Tarik
źródło
nie jestem pewien, czy to odpowiada na pytanie, ale samo pytanie jest niejasne :)
Martijn Scheffer
@MartijnScheffer racja, poprawiłem odpowiedź na adres odpowiadający na pierwotne pytanie, dzięki za notatkę.
Tarik
10

Chciałem usunąć tylko jeden parametr success. Oto jak możesz to zrobić:

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

To również pozostaje #hash.


URLSearchParamsnie będzie działać w IE, ale pracuję nad Edge . Możesz użyć polyfill lub możesz użyć naiwnej funkcji pomocniczej do obsługi IE:

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}
}

Można tego użyć na przykład:

history.replaceState(
    null, '', take_param('success').search + location.hash)
odinho - Velmont
źródło
Świetne rozwiązanie, czy istnieje sposób, aby nie dodać znaku „?” jeśli nie zostaną przekazane żadne parametry?
ricks
2
@RickS oczywiście take_paramjuż to robić, ale można zrobić URLSearchParamsto samo, wykonując: history.replaceState(null, '', (params ? '?' + params : '') + location.hash). Albo jak chcesz.
odinho
8

Lepsze rozwiązanie:

window.history.pushState(null, null, window.location.pathname);
Matryca
źródło
6

Żadne z tych rozwiązań naprawdę nie działało dla mnie, oto funkcja zgodna z IE11, która może również usunąć wiele parametrów:

/**
* 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'])
Fabian von Ellerts
źródło
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;     
}
chozha rajan
źródło
1

Aby wyczyścić wszystkie parametry bez odświeżania strony ORAZ jeśli korzystasz z HTML5, możesz to zrobić:

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

Spowoduje to dodanie wpisu do historii przeglądarki. Możesz również rozważyć replaceState, czy nie chcesz dodać nowego wpisu i po prostu chcesz zastąpić stary wpis.

Josh
źródło
0

W jquery użyj <

window.location.href =  window.location.href.split("?")[0]
Partha
źródło
6
Nie ma w tym nic jQuery
j08691
0

Oto jedna linijka ES6, która zachowuje skrót lokalizacji i nie zanieczyszcza historii przeglądarki za pomocą replaceState:

(l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location)
joeyhoer
źródło
Czy mógłbyś dodać więcej informacji na ten temat, trudno zrozumieć, co to robi.
ricks
2
@RickS Jest to IIFE (natychmiast wywołane wyrażenie funkcyjne), dlatego jest zawinięte w nawias () (lokalizacja) pierwszy nawias pozwala pozostać samemu jako funkcja anonimowa, (lokalizacja) na końcu natychmiast wywołuje funkcję przekazującą ją globalny locationaka window.locationobiekt, więc funkcja ma dostęp do globalnych, locationponieważ lreszta jest podstawową replaceState, podobnie jak we wszystkich innych odpowiedziach, łączy on nazwę ścieżki i hash (przykład.com/#hash) jako nowy adres URL. Mam nadzieję, że to strawne, jeśli nie, daj mi znać 😉
Can Rau
@ Może po prostu użyć window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Fabian von Ellerts
@FabianvonEllerts Właściwie dobre pytanie, nie jestem pewien, tylko że nie musisz pisać location2 razy 😁 ale nie musisz przypisywać tego do zmiennej 😉 czy może to coś więcej Joey?
Can Rau