¿Cómo puedo eliminar un parámetro de cadena de consulta en JavaScript?

Resuelto Matthew Lock asked hace 14 años • 31 respuestas

¿Existe una mejor manera de eliminar un parámetro de una cadena de consulta en una cadena URL en JavaScript estándar que no sea mediante una expresión regular?

Esto es lo que se me ocurrió hasta ahora y que parece funcionar en mis pruebas, ¡pero no me gusta reinventar el análisis de cadenas de consulta!

function RemoveParameterFromUrl( url, parameter ) {

    if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );

    url = url.replace( new RegExp( "\\b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "$1" );

    // remove any leftover crud
    url = url.replace( /[&;]$/, "" );

    return url;
}
Matthew Lock avatar Oct 28 '09 08:10 Matthew Lock
Aceptado
"[&;]?" + parameter + "=[^&;]+"

Parece peligroso porque el parámetro 'barra' coincidiría:

?a=b&foobar=c

Además, fallaría si parametercontuviera caracteres especiales en RegExp, como '.'. Y no es una expresión regular global, por lo que solo eliminaría una instancia del parámetro.

No usaría una expresión regular simple para esto, analizaría los parámetros y perdería los que no desea.

function removeURLParameter(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts = url.split('?');   
    if (urlparts.length >= 2) {

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i = pars.length; i-- > 0;) {    
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                pars.splice(i, 1);
            }
        }

        return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
    }
    return url;
}
bobince avatar Oct 28 '2009 02:10 bobince

Los navegadores modernos proporcionan URLSearchParamsuna interfaz para trabajar con parámetros de búsqueda. Que tiene deleteun método que elimina el parámetro por nombre.

if (typeof URLSearchParams !== 'undefined') {
  const params = new URLSearchParams('param1=1&param2=2&param3=3')
  
  console.log(params.toString())
  
  params.delete('param2')
  
  console.log(params.toString())

} else {
  console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}
Expandir fragmento

 avatar Jun 16 '2017 08:06

Puedes cambiar la URL con:

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

De esta manera, puedes sobrescribir la URL sin el parámetro de búsqueda. Yo lo uso para limpiar la URL después de tomar los parámetros GET.

 avatar Jul 04 '2018 08:07