Eliminar parámetros de URL sin actualizar la página

153

Estoy tratando de eliminar todo después del "?" en la URL del navegador en el documento listo.

Esto es lo que estoy intentando:

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

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

Puedo hacer esto y ver que funciona a continuación:

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

var url = window.location.href;
    alert(url.split('?')[0]);
});
Derek
fuente
Tiene dos formularios en una página y cuando se envía un formulario, agrega un producto al carrito y agrega un parámetro largo a la URL después de que la página se actualiza. Así que quiero poder eliminar ese parámetro cuando el documento esté listo y comience con un?
Derek
1
Si desea actualizar la página, ¿por qué esperar .ready()? No necesita esperar para redirigir a una nueva URL o simplemente usar .pushState()como lo recomendó Joraid.
jfriend00

Respuestas:

228

TL; DR

1- Para modificar la URL actual y añadir / inyección que (el nuevo URL modificada) como una nueva entrada a la lista de URL de la historia, el uso pushState:

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

2- Para reemplazar la URL actual sin agregarla a las entradas del historial, use replaceState:

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

3- Dependiendo de su lógica de negocio , pushStateserá útil en casos como:

  • desea apoyar el botón de retroceso del navegador

  • desea crear una nueva URL, agregar / insertar / insertar la nueva URL en las entradas del historial y convertirla en la URL actual

  • permitiendo a los usuarios marcar la página con los mismos parámetros (para mostrar el mismo contenido)

  • para acceder mediante programación a los datos a través del stateObjanálisis luego desde el ancla


Como entendí por su comentario, desea limpiar su URL sin redirigir nuevamente.

Tenga en cuenta que no puede cambiar la URL completa. Simplemente puede cambiar lo que viene después del nombre del dominio. Esto significa que no puedes cambiar www.example.com/pero puedes cambiar lo que viene después.com/

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

Antecedentes

Nosotros podemos usar:

1- El método pushState () si desea agregar una nueva URL modificada a las entradas del historial.

2- El método replaceState () si desea actualizar / reemplazar la entrada del historial actual .

.replaceState()funciona exactamente igual, .pushState()excepto que .replaceState() modifica la entrada del historial actual en lugar de crear una nueva. Tenga en cuenta que esto no impide la creación de una nueva entrada en el historial global del navegador.


.replaceState()es particularmente útil cuando desea actualizar el objeto de estado o URL de la entrada del historial actual en respuesta a alguna acción del usuario.


Código

Para hacerlo, usaré el método pushState () para este ejemplo, que funciona de manera similar al siguiente formato:

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

Siéntase libre para sustituir pushStatecon replaceStatebase en sus necesidades.

Puede sustituir el parámetro "object or string"con {}y "Title"con document.titlepara que la declaración final se convierta en:

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

Resultados

Las dos líneas de código anteriores crearán una URL como:

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

Convertirse:

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

Acción

Ahora intentemos un enfoque diferente. Digamos que necesita mantener el nombre del archivo. El nombre del archivo viene después del último /y antes de la cadena de consulta ?.

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

Estarán:

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

Algo como esto lo hará funcionar:

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

ACTUALIZAR:

Para los fanáticos de una línea, intente esto en su consola / firebug y la URL de esta página cambiará:

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

La URL de esta página cambiará de:

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

A

http://stackoverflow.com/22753103#22753103

Nota: como Samuel Liew indicó en los comentarios a continuación, esta característica se ha introducido solo para HTML5.

Un enfoque alternativo sería redirigir realmente su página (pero perderá la cadena de consulta `? ', ¿Sigue siendo necesaria o los datos se han procesado?).

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

Mohammed Joraid
fuente
2
Olvidó mencionar que esta es solo una función HTML5. developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Samuel Liew
¿Por qué te desnudas del último corte? ¿Qué tiene que ver eso con la pregunta del OP? Solo quieren deshacerse de la cadena de consulta. El primer signo de interrogación define el comienzo de la cadena de consulta.
jfriend00
66
replaceStateparece encajar mejor, pero pushStatetambién funcionará, hasta que comiences a hacer clic en los botones Atrás y Adelante en el navegador y te des cuenta de que hay una razón por la que hay bibliotecas completas para trabajar con la API de historial.
adeneo
@ jfriend00 según el comportamiento de la función, lo que agregue en el tercer parámetro se colocará en la URL después del nombre de dominio, es decir, después del dominio / como en www.example.com/. Existe la posibilidad de que el OP pueda tener varios / entre el nombre de dominio y? en caso de que el sitio web se encuentre en un subdirectorio, por lo tanto, depende de él / ella ejercitarse y hacer un mejor refinamiento de la URL, ya que la pregunta era cómo cambiar la URL, ahora cómo obtenerla correctamente.
Mohammed Joraid
Solo digo que no necesitas esto url.substring(url.lastIndexOf('/') + 1);en absoluto. url.split("?")[0]obtendrá la parte anterior al primer signo de interrogación, que es todo lo que creo que solicitó el OP. La pregunta del OP es: "Estoy tratando de eliminar todo después de"? "En la URL del navegador".
jfriend00
158

Todo esto es engañoso, nunca querrás agregarlo al historial del navegador a menos que quieras ir a una página diferente en una aplicación de una sola página. Si desea eliminar los parámetros sin un cambio en la página, debe usar:

window.history.replaceState(null, null, window.location.pathname);
evanjmg
fuente
3
BESO (Keep es estúpido y simple). El OP pidió eliminar todo después de? ¡y esta es la respuesta más simple que puede obtener por lo que pidió!
Warface
No funcionó en Firefox. Al actualizar, aún aparecen los parámetros. Funciona con empuje y reemplazo. window.history.replaceState ({página: location.pathname}, document.title, window.location.pathname); window.history.pushState ({página: location.pathname}, document.title, window.location.pathname);
Ajay Singh
1
history.replaceState (null, null, location.pathname + location.hash) - agregue location.hash si no desea eliminar esa parte
mire
29

Una forma sencilla de hacerlo, funciona en cualquier página, requiere 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
fuente
Esto funciona asombrosamente bien. Desafortunadamente, no tengo la primera pista de por qué funciona. Agradecido de todos modos.
Matt Cremeens
1
Las dos primeras líneas comprueban si hay algo después de? (la subcadena simplemente elimina el '?'), luego verifico si el navegador admite la nueva llamada pushstate, y finalmente uso pushstate para agregar un estado a la pila de URL (puede presionar y hacer estallar las URL en esa pila), window.location .pathname es una url local menos la consulta y menos el nombre de dominio y el prefijo ( domain.com/THIS?notthis )
Martijn Scheffer
23

Creo que el mejor y más simple método para esto es:

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

si tengo una etiqueta especial al final de mi URL como: http://dominio.com/?tag=12345 Aquí está el siguiente código para eliminar esa etiqueta siempre que se presente en la 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>

Esto da la idea de eliminar uno o más (o todos) parámetros de la URL

Con window.location.pathname básicamente obtienes todo antes de '?' en la url.

var pathname = window.location.pathname; // Solo devuelve la ruta

var url = window.location.href; // Devuelve la URL completa

Tarik
fuente
No estoy seguro de que esto responda la pregunta, pero la pregunta en sí no está clara :)
Martijn Scheffer
@MartijnScheffer bien, mejoré la respuesta a la dirección respondiendo la pregunta original, gracias por la nota.
Tarik
10

Quería eliminar solo un parámetro success. Así es como puedes hacer esto:

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

Esto también se conserva #hash.


URLSearchParamsno funcionará en IE, pero se está trabajando para Edge . Puede usar un polyfill o podría usar una función de ayuda ingenua para el soporte de 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}
}

Esto se puede usar como:

history.replaceState(
    null, '', take_param('success').search + location.hash)
odinho - Velmont
fuente
Gran solución, ¿hay alguna forma de no agregar el '?' si no se pasan params?
ricks
2
@RickS Por supuesto, el take_paramque ya está haciendo eso, sino que pueden hacer que la URLSearchParamshacen lo mismo haciendo: history.replaceState(null, '', (params ? '?' + params : '') + location.hash). O como quieras.
Odinho - Velmont
8

Mejor solucion:

window.history.pushState(null, null, window.location.pathname);
Matriz
fuente
6

Ninguna de estas soluciones realmente funcionó para mí, aquí hay una función compatible con IE11 que también puede eliminar múltiples parámetros:

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

Para borrar todos los parámetros, sin actualizar la página, Y si está usando HTML5, puede hacer esto:

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

Esto agregará una entrada en el historial del navegador. También podría considerar replaceStatesi no desea agregar una nueva entrada y solo desea reemplazar la entrada anterior.

Josh
fuente
0

En jquery use <

window.location.href =  window.location.href.split("?")[0]
Partha
fuente
66
No hay nada de jQuery sobre eso
j08691
0

Aquí hay un ES6 one liner que preserva el hash de ubicación y no contamina el historial del navegador al usar replaceState:

(l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location)
joeyhoer
fuente
¿Podría agregar algo más de información sobre esto? Es difícil entender lo que está haciendo.
ricks
2
@RickS Es un IIFE (expresión de función invocada inmediatamente) por eso está envuelto en paréntesis () (ubicación), el primer paréntesis hace que pueda permanecer solo como función anónima, la (ubicación) al final invoca inmediatamente la función que lo pasa el objeto global locationaka window.location, por lo que la función tiene acceso a los globales locationcomo lel resto es básico replaceState como en todas las otras respuestas, está concatenando el nombre de ruta y el hash (example.com/#hash) como la nueva url. Espero que sea digerible, si no, hágamelo saber 😉
Can Rau
@ ¿Por qué no solo usar window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Fabian von Ellerts
@FabianvonEllerts Buena pregunta en realidad, no estoy realmente seguro de que lo único es que no tienes que escribir location2 veces 😁 pero no necesitas asignarlo a una variable 😉 o ¿hay más que hacer, Joey?
Can Rau