Con javascript, ¿cómo puedo agregar un parámetro de cadena de consulta a la url si no está presente o si está presente, actualizar el valor actual? Estoy usando jquery para mi desarrollo del lado del cliente.
javascript
jquery
query-string
aficionado
fuente
fuente
String#split
toma un segundo parámetro para divisiones máximas. jQuerymap
también será útil.Respuestas:
Escribí la siguiente función que logra lo que quiero lograr:
fuente
[?|&]
debería ser[?&]
var
justo antes de la declaración del separador.value = encodeURIComponent(value);
la primera línea, de lo contrario, los saltos de línea no se escaparán correctamente.He expandido la solución y la combiné con otra que encontré para reemplazar / actualizar / eliminar los parámetros de la cadena de consulta en función de la entrada de los usuarios y teniendo en cuenta el ancla de las URL.
Si no se proporciona un valor, se eliminará el parámetro; si se proporciona uno, se agregará / actualizará el parámetro. Si no se proporciona ninguna URL, se tomará de window.location
Actualizar
Hubo un error al eliminar el primer parámetro en la cadena de consulta, he reelaborado la expresión regular y la prueba para incluir una solución.
Segunda actualización
Según lo sugerido por @ JarónBarends: ajuste la verificación del valor para verificar los valores indefinidos y nulos para permitir establecer valores 0
Tercera actualización
Hubo un error en el que eliminar una variable de cadena de consulta directamente antes de que un hashtag perdiera el símbolo de hashtag que se ha solucionado
Cuarta actualización
Gracias @rooby por señalar una optimización de expresiones regulares en el primer objeto RegExp. Establezca la expresión regular inicial en ([? &]) Debido a un problema con el uso de (\? | &) Encontrado por @YonatanKarni
Quinta actualización
Eliminar la declaración de hash var en la instrucción if / else
fuente
value
hará que esto elimine las variables de la cadena de consulta cuando establezca su valor en 0. por lo tanto, en lugar deif (value) {}
usarloif (typeOf value !== 'undefined' && value !== null) {}
hash
se declara dos veces;)La utilidad URLSearchParams puede ser útil para esto en combinación con
window.location.search
. Por ejemplo:Ahora
foo
se ha configuradobar
independientemente de si ya existía o no.Sin embargo, la asignación anterior
window.location.search
causará una carga de página, por lo que si eso no es conveniente, use la API de historial de la siguiente manera:Ahora no necesita escribir su propia expresión regular o lógica para manejar la posible existencia de cadenas de consulta.
Sin embargo, el soporte del navegador es deficiente ya que actualmente es experimental y solo se usa en versiones recientes de Chrome, Firefox, Safari, iOS Safari, navegador de Android, Android Chrome y Opera. Úselo con un polyfill si decide usarlo.
Actualización: el soporte del navegador ha mejorado desde mi respuesta original.
fuente
Unable to set property '__URLSearchParams__:0.8503766759030615' of undefined or null reference
en ie11 obtienes ese error. no es un pollyfill si no funciona como alternativa.newRelativePathQuery
hace el truco:var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + window.location.hash;
Basado en la respuesta de @ amateur (y ahora incorporando la solución del comentario de @j_walker_dev), pero teniendo en cuenta el comentario sobre las etiquetas hash en la url, uso lo siguiente:
Editado para corregir
[?|&]
en expresiones regulares, que por supuesto debería ser[?&]
como se señala en los comentariosEditar: versión alternativa para admitir la eliminación de parámetros de URL también. He utilizado
value === undefined
como la forma de indicar la eliminación. Podría usarvalue === false
o incluso un parámetro de entrada por separado según lo deseado.Véalo en acción en https://jsfiddle.net/bp3tmuxh/1/
fuente
var separator
línea a la derecha sobre el retorno corrige un error con "/ app # / cool? Fun = true". Esto elegiría un "&" como separador aunque todavía no haya parámetros de cadena de consulta reales. Solo clientes.[?|&]
debe ser justo[?&]
(de lo contrario coincidirá|
)."([?|&])"
no es bueno Por favor arregle esto comovar re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
ovar re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
(¡una buena extensión de otras maneras!)var re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
no funciona, el segundo síAquí está mi biblioteca para hacer eso: https://github.com/Mikhus/jsurl
fuente
Me doy cuenta de que esta pregunta es antigua y ha sido respondida a muerte, pero aquí está mi puñalada. Estoy tratando de reinventar la rueda aquí porque estaba usando la respuesta actualmente aceptada y el mal manejo de los fragmentos de URL recientemente me mordió en un proyecto.
La función está abajo. Es bastante largo, pero fue hecho para ser lo más resistente posible. Me encantaría sugerencias para acortarlo / mejorarlo. Preparé un pequeño conjunto de pruebas jsFiddle para él (u otras funciones similares). Si una función puede pasar cada una de las pruebas allí, digo que probablemente sea bueno ir.
Actualización: Encontré una función genial para usar el DOM para analizar URL , así que incorporé esa técnica aquí. Hace que la función sea más corta y más confiable. Apoyos para el autor de esa función.
fuente
window.location.search es de lectura / escritura.
Sin embargo, la modificación de la cadena de consulta redirigirá la página en la que se encuentra y generará una actualización del servidor.
Si lo que está intentando hacer es mantener el estado del lado del cliente (y potencialmente hacer que sea compatible con marcadores), querrá modificar el hash de URL en lugar de la cadena de consulta, lo que lo mantiene en la misma página (ventana.ubicación. hash es de lectura / escritura). Así es como los sitios web como twitter.com hacen esto.
También querrá que funcione el botón Atrás, deberá vincular los eventos de JavaScript al evento de cambio de hash, un buen complemento para eso es http://benalman.com/projects/jquery-hashchange-plugin/
fuente
Si no está configurado o desea actualizar con un nuevo valor, puede usar:
Esto está en Javascript simple, por cierto.
EDITAR
Es posible que desee intentar usar el complemento jquery query-object
fuente
Este es mi enfoque: la
location.params()
función (que se muestra a continuación) se puede usar como getter o setter. Ejemplos:Dada la URL es
http://example.com/?foo=bar&baz#some-hash
,location.params()
devolverá un objeto con todos los parámetros de consulta:{foo: 'bar', baz: true}
.location.params('foo')
volverá'bar'
.location.params({foo: undefined, hello: 'world', test: true})
cambiará la URL ahttp://example.com/?baz&hello=world&test#some-hash
.Aquí está la
params()
función, que opcionalmente se puede asignar alwindow.location
objeto.fuente
Esta es mi preferencia y cubre los casos que se me ocurren. ¿Alguien puede pensar en una forma de reducirlo a un solo reemplazo?
fuente
Sé que esto es bastante antiguo, pero quiero disparar mi versión de trabajo aquí.
NOTA Esta es una versión modificada de @elreimundo
fuente
Mi opinión desde aquí (compatible con "use estricto"; en realidad no usa jQuery):
Ejemplo de uso:
fuente
Basado en la respuesta que dio @ellemayo, se me ocurrió la siguiente solución que permite deshabilitar la etiqueta hash si lo desea:
Llámalo así:
Resultados en:
fuente
typeof value !== 'undefined' && value !== null
es más explícito, perovalue != null
significa lo mismo y es más conciso.Aquí hay una versión más corta que se encarga de
Código:
La descripción de expresiones regulares se puede encontrar aquí .
NOTA : Esta solución se basa en la respuesta @amateur, pero con muchas mejoras.
fuente
Código que agrega una lista de parámetros a una url existente usando ES6 y jQuery:
Donde listOfParams es como
Ejemplo de uso:
Pruebas rápidas:
fuente
Un enfoque diferente sin usar expresiones regulares . Admite anclajes 'hash' al final de la url, así como múltiples caracteres de signo de interrogación (?). Debería ser un poco más rápido que el enfoque de expresión regular.
fuente
Use esta función para agregar, eliminar y modificar el parámetro de cadena de consulta de la URL basada en jquery
Agregar nuevo y modificar el parámetro existente a la URL
Eliminar existente
fuente
Al usar
jQuery
podemos hacer lo siguienteEn variable
new_url
tendremos nuevos parámetros de consulta.Referencia: http://api.jquery.com/jquery.param/
fuente
Para dar un código de ejemplo para modificar
window.location.search
como lo sugieren Gal y tradyblix:fuente
Código de script Java para encontrar una cadena de consulta específica y reemplazar su valor *
fuente
Sí, tuve un problema en el que mi cadena de consulta se desbordaría y duplicaría, pero esto se debió a mi propia lentitud. así que jugué un poco y trabajé un poco de js jquery (realmente chisporroteo) y magia de C #.
Entonces me di cuenta de que después de que el servidor haya terminado con los valores pasados, los valores ya no importan, no hay reutilización, si el cliente quería hacer lo mismo, evidentemente, siempre será una nueva solicitud, incluso si es el Se pasan los mismos parámetros. Y eso es todo del lado del cliente, por lo que algunos caché / cookies, etc. podrían ser geniales en ese sentido.
JS:
HTML:
C#:
Sin duplicados, cada solicitud es tan única como la modificó, y debido a cómo está estructurada, es fácil agregar más consultas dinámicamente desde el dom.
fuente
Aquí hay un método alternativo que utiliza las propiedades incorporadas del elemento HTML de anclaje:
fuente
si desea establecer múltiples parámetros a la vez:
misma función que la de @ amateur
si jslint le da un error, agregue esto después del ciclo for
fuente
http://abc.def/?a&b&c
).Hay muchas respuestas incómodas e innecesariamente complicadas en esta página. El mejor clasificado, @ amateur's, es bastante bueno, aunque tiene un poco de pelusa innecesaria en el RegExp. Aquí hay una solución un poco más óptima con RegExp más limpio y una
replace
llamada más limpia :Como una ventaja adicional, si
uri
no es una cadena, no recibirá errores por intentar llamarmatch
oreplace
por algo que puede no implementar esos métodos.Y si desea manejar el caso de un hash (y ya ha realizado una verificación para HTML correctamente formateado), puede aprovechar la función existente en lugar de escribir una nueva función que contenga la misma lógica:
O puede hacer algunos cambios leves a la excelente respuesta de @ Adam:
fuente
separator
no está definido enupdateQueryStringParamsNoHash
. EnupdateQueryStringParameter
, todo se descompone si el parámetro que está reemplazando no tiene asignado un valor (por ejemplohttp://abc.def/?a&b&c
).Esto debería servir para el propósito:
fuente