Rimuovi i parametri URL senza aggiornare la pagina


153

Sto cercando di rimuovere tutto dopo il "?" nell'URL del browser sul documento pronto.

Ecco cosa sto provando:

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

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

Posso fare questo e vederlo le seguenti opere:

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

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

Hanno due moduli su una pagina e quando viene inviato un modulo aggiunge un prodotto al carrello e aggiunge un parametro lungo all'URL dopo l'aggiornamento della pagina. Quindi voglio essere in grado di rimuovere quel parametro quando il documento è pronto e inizia con un?
Derek,

1
Se vuoi aggiornare la pagina, perché aspettare .ready()? Non è necessario attendere per reindirizzare a un nuovo URL o semplicemente utilizzare .pushState()come raccomandato da Joraid.
jfriend00

Risposte:


228

TL; DR

1- Per modificare URL corrente e aggiungere / Inject esso (il nuovo URL modificato) come nuova voce URL alla lista della storia, l'uso pushState:

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

2- Per sostituire l'URL corrente senza aggiungerlo alle voci della cronologia, utilizzare replaceState:

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

3- A seconda della logica aziendale , pushStatesarà utile in casi come:

  • si desidera supportare il pulsante Indietro del browser

  • vuoi creare un nuovo URL, aggiungere / inserire / spingere il nuovo URL nelle voci della cronologia e renderlo URL corrente

  • consentendo agli utenti di aggiungere la pagina ai segnalibri con gli stessi parametri (per mostrare gli stessi contenuti)

  • a livello di codice accedere ai dati tramite l' stateObjpoi analizzare dal ancoraggio


Come ho capito dal tuo commento, vuoi pulire il tuo URL senza reindirizzare di nuovo.

Tieni presente che non puoi modificare l'intero URL. Puoi semplicemente cambiare ciò che viene dopo il nome del dominio. Ciò significa che non puoi cambiare www.example.com/ma puoi cambiare ciò che viene dopo.com/

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

sfondo

Possiamo usare:

1- Il metodo pushState () se si desidera aggiungere un nuovo URL modificato alle voci della cronologia.

2- Il metodo replaceState () se si desidera aggiornare / sostituire la voce della cronologia corrente .

.replaceState()funziona esattamente come .pushState()tranne che .replaceState() modifica la voce della cronologia corrente invece di crearne una nuova. Si noti che ciò non impedisce la creazione di una nuova voce nella cronologia del browser globale.


.replaceState()è particolarmente utile quando si desidera aggiornare l'oggetto stato o l' URL della voce della cronologia corrente in risposta ad alcune azioni dell'utente.


Codice

Per fare ciò userò il metodo pushState () per questo esempio che funziona in modo simile al seguente formato:

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

Sentitevi liberi di sostituire pushStatecon replaceStatebase alle vostre esigenze.

È possibile sostituire il parametro "object or string"con {}e "Title"con document.titlecosì la dichiarazione finale diventerà:

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

risultati

Le due precedenti righe di codice creeranno un URL come:

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

Diventare:

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

Azione

Ora proviamo un approccio diverso. Di 'che devi conservare il nome del file. Il nome del file viene dopo l'ultimo /e prima della stringa di query ?.

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

Sarà:

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

Qualcosa del genere lo farà funzionare:

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

AGGIORNARE:

Per i fan di un liner, provalo nella tua console / firebug e questo URL della pagina cambierà:

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

L'URL di questa pagina cambierà da:

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

Per

http://stackoverflow.com/22753103#22753103

Nota: come indicato da Samuel Liew nei commenti seguenti, questa funzione è stata introdotta solo per HTML5.

Un approccio alternativo sarebbe effettivamente reindirizzare la tua pagina (ma perderai la stringa di query `? ', È ancora necessaria o i dati sono stati elaborati?).

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


2
Hai dimenticato di dire che questa è solo una funzione HTML5. developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Samuel Liew

Perché ti stai togliendo dall'ultima barra? Che cosa ha a che fare con la domanda del PO? Vogliono solo sbarazzarsi della stringa di query. Il primo punto interrogativo definisce l'inizio della stringa di query.
jfriend00

6
replaceStatesembra una soluzione migliore, ma pushStatefunzionerà anche, fino a quando non inizi a fare clic sui pulsanti avanti e indietro nel browser e ti rendi conto che c'è una ragione per cui ci sono intere librerie per lavorare con l'API Cronologia.
adeneo,

@ jfriend00 in base al comportamento della funzione, ciò che aggiungi nel terzo parametro verrà inserito nell'URL dopo il nome del dominio, in media dopo il dominio / come in www.example.com/. È possibile che l'OP abbia diversi / tra il nome di dominio e? nel caso in cui il sito Web si trovi in ​​una sottodirectory, quindi, spetta a lui / lei fare delle migliori e perfezionare l'URL poiché la domanda era su come castigare l'url, ora come ottenerlo correttamente.
Mohammed Joraid,

Sto solo dicendo che non ti serve url.substring(url.lastIndexOf('/') + 1);affatto. url.split("?")[0]otterrà la parte prima del primo punto interrogativo che è tutto ciò che penso l'OP abbia richiesto. La domanda del PO chiede: "Sto cercando di rimuovere tutto dopo il"? "Nell'URL del browser".
jfriend00

158

Sono tutti fuorvianti, non si desidera mai aggiungere alla cronologia del browser a meno che non si desideri passare a una pagina diversa in un'unica app. Se si desidera rimuovere i parametri senza modificare la pagina, è necessario utilizzare:

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

3
BACIO (Keep è stupido e semplice). L'OP ha chiesto di rimuovere tutto dopo il? e questa è la risposta più semplice che puoi ottenere per quello che ha chiesto!
Warface,

Non ha funzionato su Firefox. All'aggiornamento, vengono ancora visualizzati i parametri. Funziona usando sia push che sostituisci. 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) - aggiungi location.hash se non vuoi rimuovere quella parte
eselk

29

un modo semplice per farlo, funziona su qualsiasi pagina, richiede 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);
   }
}

Funziona incredibilmente bene. Sfortunatamente, non ho il primo indizio sul perché funzioni. Grato lo stesso.
Matt Cremeens,

1
le prime due righe controllano se c'è qualcosa dopo il? (la sottostringa rimuove solo '?') quindi controllo se il browser supporta la nuova chiamata pushstate e infine uso pushstate per aggiungere uno stato alla pila di URL (puoi spingere e far apparire gli URL su quello stack), window.location .pathname è un URL locale meno la query e meno il nome dominio e il prefisso ( domain.com/THIS?notthis )
Martijn Scheffer


23

Credo che il metodo migliore e più semplice per questo sia:

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

11

se ho un tag speciale alla fine del mio URL come: http://domain.com/?tag=12345 Ecco il codice seguente per rimuovere quel tag ogni volta che si presenta nell'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>

Questo dà l'idea di rimuovere uno o più (o tutti) parametri dall'URL

Con window.location.pathname ottieni praticamente tutto prima di '?' nell'URL.

var pathname = window.location.pathname; // Restituisce solo il percorso

var url = window.location.href; // Restituisce l'URL completo


non sono sicuro che questo stia rispondendo alla domanda, ma la domanda stessa non è chiara :)
Martijn Scheffer,

@MartijnScheffer, ho migliorato la risposta per rispondere alla domanda originale, grazie per la nota.
Tarik,

10

Volevo rimuovere solo un parametro success. Ecco come puoi farlo:

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

Anche questo mantiene #hash.


URLSearchParamsnon funzionerà su IE, ma per Edge . È possibile utilizzare un polyfill o utilizzare una funzione di supporto naïve per il supporto 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}
}

Questo può essere usato come:

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

Ottima soluzione, c'è un modo per non aggiungere il '?' se non vengono passati parametri?
Ricks

2
@RickS Naturalmente, la take_paramsta già facendo, ma si può fare la URLSearchParamsfanno lo stesso facendo: history.replaceState(null, '', (params ? '?' + params : '') + location.hash). O comunque ti piace.
odinho - Velmont,

8

Soluzione migliore:

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

6

Nessuna di queste soluzioni ha funzionato davvero per me, ecco una funzione compatibile con IE11 che può anche rimuovere più parametri:

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

Per cancellare tutti i parametri, senza fare un aggiornamento della pagina, E se stai usando HTML5, puoi farlo:

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

Ciò aggiungerà una voce nella cronologia del browser. Puoi anche considerare replaceStatese non vuoi aggiungere una nuova voce e vuoi solo sostituire la vecchia voce.


0

In jquery usa <

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

6
Non c'è nulla di jQuery al riguardo
j08691,

0

Ecco un ES6 one liner che conserva l'hash della posizione e non inquina la cronologia del browser usando replaceState:

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

Potresti aggiungere qualche informazione in più su questo, è difficile capire cosa stia facendo.
ricks

2
@RickS È un IIFE (espressione di funzione immediatamente richiamata) ecco perché è racchiuso tra parentesi () (posizione) la prima parentesi la rende in grado di rimanere da sola come funzione anonima, la (posizione) alla fine invoca immediatamente la funzione che la passa l' oggetto globale locationaka window.location, quindi la funzione ha accesso ai globali locationpoiché lil resto è di base sostituisciStato come in tutte le altre risposte, sta concatenando il percorso e l'hash (esempio.com/#hash) come nuovo url. Spero che sia digeribile, se non fammi sapere 😉
Can Rau

@Can perché non usare solo window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Fabian von Ellerts,

@FabianvonEllerts In realtà una buona domanda, non proprio certo l'unica cosa è che non devi scrivere location2 volte 😁 ma non hai bisogno di assegnarlo a una variabile 😉 o c'è dell'altro Joey?
Can Rau,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.