¿Cómo puedo eliminar un parámetro de cadena de consulta en JavaScript?
¿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;
}
"[&;]?" + parameter + "=[^&;]+"
Parece peligroso porque el parámetro 'barra' coincidiría:
?a=b&foobar=c
Además, fallaría si parameter
contuviera 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;
}
Los navegadores modernos proporcionan URLSearchParams
una interfaz para trabajar con parámetros de búsqueda. Que tiene delete
un método que elimina el parámetro por nombre.
if (typeof URLSearchParams !== 'undefined') {
const params = new URLSearchParams('param1=1¶m2=2¶m3=3')
console.log(params.toString())
params.delete('param2')
console.log(params.toString())
} else {
console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}
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.