¿Hay alguna forma sin complemento de recuperar la cadena de consulta valores de través de jQuery (o sin)?
¿Si es así, cómo? Si no, ¿hay un complemento que pueda hacerlo?
javascript
url
plugins
query-string
Ripounet
fuente
fuente
Respuestas:
Actualización: Sep-2018
Puede usar URLSearchParams, que es simple y tiene un soporte de navegador decente (pero no completo) .
Original
No necesitas jQuery para ese propósito. Puede usar solo JavaScript puro:
Uso:
Nota: Si un parámetro está presente varias veces (
?foo=lorem&foo=ipsum
), obtendrá el primer valor (lorem
). No hay un estándar sobre esto y los usos varían, consulte, por ejemplo, esta pregunta: Posición autorizada de claves de consulta HTTP GET duplicadas .NOTA: La función distingue entre mayúsculas y minúsculas. Si prefiere el nombre del parámetro que no distingue entre mayúsculas y minúsculas, agregue el modificador 'i' a RegExp
Esta es una actualización basada en las nuevas especificaciones URLSearchParams para lograr el mismo resultado de manera más sucinta. Consulte la respuesta titulada " URLSearchParams " a continuación.
fuente
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
El valor del campox
es ambiguo.?mykey=0&m.+key=1
,getParameterByName("m.+key")
volvería a llamar en0
lugar de1
. Debe escapar de los metacaracteres de la expresión regularname
antes de construir su expresión regular. Y solo necesita llamar.replace()
una vez usando la bandera global y usando"\\$&"
como expresión de reemplazo. Deberías buscar enlocation.search
lugar delocation.href
. Una respuesta con más de 400 votos a favor debería tener en cuenta estos detalles.Algunas de las soluciones publicadas aquí son ineficientes. Repetir la búsqueda de expresiones regulares cada vez que el script necesita acceder a un parámetro es completamente innecesario, una sola función para dividir los parámetros en un objeto de estilo de matriz asociativa es suficiente. Si no está trabajando con la API de historial de HTML 5, esto solo es necesario una vez por carga de página. Las otras sugerencias aquí también fallan al decodificar la URL correctamente.
Ejemplo de cadena de consulta:
Resultado:
Esto podría mejorarse fácilmente para manejar cadenas de consulta de estilo matriz también. Aquí hay un ejemplo de esto , pero como los parámetros de estilo de matriz no están definidos en RFC 3986 , no contaminaré esta respuesta con el código fuente.Para aquellos interesados en una versión "contaminada", mire la respuesta de Campbeln a continuación .
Además, como se señala en los comentarios,
;
es un delimitador legal parakey=value
pares. Se requeriría una expresión regular más complicada para manejar;
o&
, lo que creo que es innecesario porque es raro que;
se use y diría que es aún más improbable que se usen ambos. Si necesita soporte en;
lugar de&
, simplemente cámbielos en la expresión regular.Si está utilizando un lenguaje de preprocesamiento del lado del servidor, es posible que desee utilizar sus funciones JSON nativas para hacer el trabajo pesado por usted. Por ejemplo, en PHP puedes escribir:
Mucho más simple!
ACTUALIZADO
Entonces, este es el enfoque para administrarlo:
fuente
window.location.hash
propiedad, que está separada de lawindow.location.search
propiedad. Si el hash cambia, no afecta en absoluto la cadena de consulta.;
es un delimitador legal parakey=value
pares GET . Es raro, pero lleva 5 segundos implementarlo.?a=b&c=d
es convencional y una recomendación del W3C para formularios web, pero la especificación de URI simplemente definequery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
conwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Sin jQuery
Con una URL como
?topic=123&name=query+string
, volverá lo siguiente:Método de Google
Al romper el código de Google, encontré el método que usan:
getUrlParameters
Está ofuscado, pero es comprensible. No funciona porque algunas variables no están definidas.
Comienzan a buscar parámetros en la url desde
?
y también desde el hash#
. Luego, para cada parámetro, se dividen en el signo igualb[f][p]("=")
(que pareceindexOf
, usan la posición del carácter para obtener la clave / valor). Al dividirlo, comprueban si el parámetro tiene un valor o no, si lo tiene, almacenan el valord
, de lo contrario simplemente continúan.Al final
d
se devuelve el objeto , manejando el escape y el+
signo. Este objeto es como el mío, tiene el mismo comportamiento.Mi método como un complemento jQuery
Uso
Prueba de rendimiento (método dividido contra método regex) ( jsPerf )
Código de preparación: declaración de métodos
Código de prueba dividido
Código de prueba Regex
Prueba en Firefox 4.0 x86 en Windows Server 2008 R2 / 7 x64
fuente
unescape
es una función obsoleta y se reemplaza pordecodeURIComponent()
, tenga en cuenta que ninguna de estas funciones decodificará correctamente+
un carácter de espacio. 2. Debe declarar el resultado como un objeto, en lugar de una matriz, ya que JavaScript no tiene matrices asociativas, per se, y la matriz que declara se trata como un objeto asignándole propiedades con nombre de todos modos.window.location
hace que cualquier problema de rendimiento sea discutible, dado que el cliente que navega a la URL es mucho, mucho más costoso.Versión mejorada de la respuesta de Artem Barger :
Para obtener más información sobre mejoras, consulte: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
fuente
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
si el parámetro no es seguido de '='. Podría anteponerseif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
para que regreseboolean false
si el parámetro no está allí en absoluto.new
Usaría el prefijo al crear la expresión regular:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ y Chrome 49+ admiten la API URLSearchParams :
Hay un polyfill URLSearchParams sugerido por Google para las versiones estables de IE.
No está estandarizado por W3C , pero es un estándar de vida de WhatWG .
Puedes usarlo en
location
:o
O, por supuesto, en cualquier URL:
También puede obtener parámetros utilizando una
.searchParams
propiedad abreviada en el objeto URL, como esta:Uno lee / parámetros establecidos a través de la
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. También puedes iterar sobre todos los valoresfor (let p of params) {}
.Una implementación de referencia y una página de muestra están disponibles para auditoría y pruebas.
fuente
.get
lugar de solo.
slice(1)
en.search
, puede utilizar directamente. URLSearchParams puede manejar los principales?
.URLSearchParams
no es bueno porque no devuelve los valores reales de los parámetros de una URL.new URL('https://example.com?foo=1&bar=2')
no funciona para la url de Androidfile:///android_asset/...
Solo otra recomendación. El complemento Purl permite recuperar todas las partes de la URL, incluido el ancla, el host, etc.
Se puede usar con o sin jQuery.
El uso es muy simple y genial:
Sin embargo, a partir del 11 de noviembre de 2014, Purl ya no se mantiene y el autor recomienda usar URI.js en su lugar. El complemento jQuery es diferente porque se enfoca en elementos: para usar con cadenas, solo use
URI
directamente, con o sin jQuery. Un código similar se vería como tal, documentos más completos aquí :fuente
tl; dr
Una solución rápida y completa , que maneja claves multivalor y caracteres codificados .
Multi-forrado:¿Qué es todo este código ...
Ejemplo:"fusión nula" , evaluación de cortocircuito
ES6 Destrucción de asignaciones , funciones de flecha , cadenas de plantillas
Leer más ... sobre la solución JavaScript de Vanilla.
Para acceder a diferentes partes de una URL use
location.(search|hash)
La solución más fácil (ficticia)
Claves de valores múltiples
Verificación simple de teclas
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
oqd[key][index]
Personajes codificados?
Úselo
Ejemplo:decodeURIComponent()
para la segunda o ambas divisiones.De comentarios
* !!! Tenga en cuenta que eso
decodeURIComponent(undefined)
devuelve una cadena"undefined"
. La solución radica en un uso simple de&&
, que garantiza quedecodeURIComponent()
no se invoque en valores indefinidos. (Consulte la "solución completa" en la parte superior).Si la cadena de consulta está vacía (
location.search == ""
), el resultado es algo engañosoqd == {"": undefined}
. Se sugiere verificar la cadena de consulta antes de iniciar la función de análisis likeso:fuente
array.forEach()
inyectando cierto código al comienzo de su script. ver Polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] })
Roshambo en snipplr.com tiene un script simple para lograr esto descrito en Obtener parámetros de URL con jQuery | Mejora . Con su script, también puede extraer fácilmente los parámetros que desee.
Aquí está la esencia:
Luego solo obtenga sus parámetros de la cadena de consulta.
Entonces, si la cadena URL / consulta era
xyz.com/index.html?lang=de
.Solo llama
var langval = $.urlParam('lang');
, y lo tienes.UZBEKJON también tiene una gran publicación de blog sobre esto, obtenga parámetros y valores de URL con jQuery .
fuente
0
? Claro, podría usar un estricto control de igualdad, pero ¿no debería ser asínull
?Si está usando jQuery, puede usar una biblioteca, como jQuery BBQ: Botón de retroceso y Biblioteca de consultas .
Editar: Agregar Deparam Ejemplo:
Si solo quieres usar JavaScript simple, puedes usar ...
Debido a la nueva API Historia de HTML y, específicamente,
history.pushState()
yhistory.replaceState()
, la URL puede cambiar lo que invalida la memoria caché de parámetros y sus valores.Esta versión actualizará su caché interna de parámetros cada vez que cambie el historial.
fuente
Solo usa dos divisiones :
Estaba leyendo todas las respuestas anteriores y más completas. Pero creo que ese es el método más simple y rápido. Puede consultar este punto de referencia jsPerf
Para resolver el problema en el comentario de Rup, agregue una división condicional cambiando la primera línea a las dos siguientes. Pero la precisión absoluta significa que ahora es más lento que regexp (ver jsPerf ).
Entonces, si sabe que no se encontrará con el contra-caso de Rup, esto gana. De lo contrario, regexp.
fuente
get('value')
enhttp://the-url?oldvalue=1&value=2
.half
es verdadero, esto devuelve nulo para un parámetro vacío como?param=
. Debería devolver la cadena vacía en este caso, y la comprobación lohalf !== undefined
resuelve.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
que funcioneAquí está mi intento de convertir la excelente solución de Andy E en un complemento jQuery completo:
La sintaxis es:
¡Lo mejor de ambos mundos!
fuente
Si está haciendo más manipulación de URL que simplemente analizar la cadena de consulta, puede encontrar útil URI.js. Es una biblioteca para manipular URL, y viene con todas las campanas y silbatos. (Perdón por la publicidad propia aquí)
para convertir su cadena de consulta en un mapa:
(URI.js también "correcciones" malas cadenas de consulta gusta
?&foo&&bar=baz&
a?foo&bar=baz
)fuente
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
por el mismo resultado ( docs ).Me gusta la solución de Ryan Phelan . ¿Pero no veo ningún punto de extender jQuery para eso? No se utiliza la funcionalidad jQuery.
Por otro lado, me gusta la función incorporada en Google Chrome: window.location.getParameter.
Entonces, ¿por qué no usar esto? De acuerdo, otros navegadores no tienen. Entonces, creemos esta función si no existe:
Esta función es más o menos de Ryan Phelan, pero está envuelta de manera diferente: nombre claro y sin dependencias de otras bibliotecas javascript. Más sobre esta función en mi blog .
fuente
Aquí hay una forma rápida de obtener un objeto similar a la matriz PHP $ _GET :
Uso:
Para la cadena de consulta,
x=5&y&z=hello&x=6
esto devuelve el objeto:fuente
(function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery);
y úselo así:$.get_query()
location.href
tendría que ser reemplazado porlocation.search
.Mantenlo simple en código JavaScript simple:
Llámalo desde cualquier lugar del código JavaScript:
fuente
window.location.search
.Estas son todas excelentes respuestas, pero necesitaba algo un poco más robusto, y pensé que a todos les gustaría tener lo que creé.
Es un método de biblioteca simple que hace disección y manipulación de parámetros de URL. El método estático tiene los siguientes submétodos que se pueden invocar en la URL del asunto:
Ejemplo:
fuente
De la MDN :
fuente
Código de golf:
¡Muéstralo!
En mi Mac:
test.htm?i=can&has=cheezburger
muestrafuente
Uso muchas expresiones regulares, pero no para eso.
Me parece más fácil y más eficiente leer la cadena de consulta una vez en mi aplicación, y construir un objeto a partir de todos los pares clave / valor como:
Para una URL como
http://domain.com?param1=val1¶m2=val2
usted puede obtener su valor más adelante en su código comosearch.param1
ysearch.param2
.fuente
fuente
El método jQuery de Roshambo no se ocupaba de decodificar la URL
Acabo de agregar esa capacidad también al agregar en la declaración de devolución
Ahora puedes encontrar la esencia actualizada:
fuente
Me gusta este (tomado de jquery-howto.blogspot.co.uk):
Funciona muy bien para mi.
fuente
Aquí está mi edición de esta excelente respuesta , con la capacidad adicional de analizar cadenas de consulta con claves sin valores.
¡IMPORTANTE! El parámetro para esa función en la última línea es diferente. Es solo un ejemplo de cómo se le puede pasar una URL arbitraria. Puede usar la última línea de la respuesta de Bruno para analizar la URL actual.
Entonces, ¿qué cambió exactamente? Con url los
http://sb.com/reg/step1?param=
resultados serán los mismos. Pero con url,http://sb.com/reg/step1?param
la solución de Bruno devuelve un objeto sin claves, mientras que la mía devuelve un objeto con claveparam
yundefined
valor.fuente
Necesitaba un objeto de la cadena de consulta y odio mucho código. Puede que no sea el más robusto del universo, pero solo son unas pocas líneas de código.
Se
this.htm?hello=world&foo=bar
creará una URL como :fuente
decodeURIComponent
el valor a medida que lo almacena, y posiblemente también la clave, pero es menos probable que use cadenas impares en eso.?a&b&c
pero esto es realmente muy legible (y por cierto similar a mi primera idea). Tambiénsplit
es redundante, pero tengo más rendimiento para freír que dividir una cadena de 10 caracteres dos veces.location.search.substr(1)
lugar delocation.href.split('?')[1]
evitar recoger hash (#anchor
) junto con el último parámetro de consulta.location.search
!Aquí hay una versión extendida de la versión vinculada "Manejar cadenas de consulta de estilo de matriz" de Andy E. Corregido error (
?key=1&key[]=2&key[]=3
;1
se pierde y se sustituye por[2,3]
), hecho algunas mejoras en el rendimiento menor (re-decodificación de los valores, recalculando "[" posición, etc.) y se añadió una serie de mejoras (funcionalizado, el soporte para?key=1&key=2
, el apoyo a;
delimitadores) . Dejé las variables molestamente cortas, pero agregué comentarios en abundancia para que fueran legibles (oh, y reutilicév
dentro de las funciones locales, perdón si eso es confuso;).Manejará la siguiente cadena de consulta ...
... convirtiéndolo en un objeto que se parece a ...
Como puede ver arriba, esta versión maneja algunas medidas de arreglos "malformados", es decir,
person=neek&person[]=jeff&person[]=jim
operson=neek&person=jeff&person=jim
como la clave es identificable y válida (al menos en dotNet's NameValueCollection.Add ):Parece que el jurado está un poco interesado en las teclas repetidas, ya que no hay especificaciones. En este caso, se almacenan varias claves como una matriz (falsa). Pero tenga en cuenta que no proceso valores basados en comas en matrices.
El código:
fuente
q = decodeURIComponent(window.location.search.substring(1)),
ayuda a hacer eso también.Esta es una función que creé hace un tiempo y estoy bastante contento. No distingue entre mayúsculas y minúsculas, lo cual es útil. Además, si el QS solicitado no existe, solo devuelve una cadena vacía.
Yo uso una versión comprimida de esto. Estoy publicando sin comprimir para los tipos novatos para explicar mejor lo que está sucediendo.
Estoy seguro de que esto podría optimizarse o hacerse de manera diferente para trabajar más rápido, pero siempre funcionó muy bien para lo que necesito.
Disfrutar.
fuente
Acabamos de lanzar arg.js , un proyecto destinado a resolver este problema de una vez por todas. Tradicionalmente ha sido muy difícil, pero ahora puedes hacer:
o conseguir todo el lote:
y si te importa la diferencia entre
?query=true
y#hash=true
puedes usar los métodosArg.query()
yArg.hash()
.fuente
El problema con la respuesta principal a esa pregunta es que no se admiten parámetros colocados después de #, pero a veces también es necesario para obtener este valor.
Modifiqué la respuesta para permitirle analizar una cadena de consulta completa con un signo hash también:
fuente
Y así es como puede usar esta función suponiendo que la URL es
fuente
?stringtext&stringword=foo
.Si está usando Browserify, puede usar el
url
módulo de Node.js :Lecturas adicionales: URL Node.js v0.12.2 Manual y documentación
EDITAR: puede usar la interfaz URL , está bastante ampliamente adoptada en casi todos los navegadores nuevos y si el código se va a ejecutar en un navegador antiguo, puede usar un polyfill como este . Aquí hay un ejemplo de código sobre cómo usar la interfaz URL para obtener parámetros de consulta (también conocidos como parámetros de búsqueda)
También puede usar URLSearchParams para ello, aquí hay un ejemplo de MDN para hacerlo con URLSearchParams:
fuente
url
API del módulo está aquí: nodejs.org/api/url.html