Existe uma maneira sem plug-in de recuperar valores de string de consulta via jQuery (ou sem)?
Se sim, como? Caso contrário, existe um plugin que pode fazer isso?
javascript
url
plugins
query-string
Ripounet
fonte
fonte
Respostas:
Atualização: Sep-2018
Você pode usar URLSearchParams, que é simples e tem suporte decente (mas não completo) ao navegador .
Original
Você não precisa do jQuery para esse fim. Você pode usar apenas algum JavaScript puro:
Uso:
Nota: Se um parâmetro estiver presente várias vezes (
?foo=lorem&foo=ipsum
), você obterá o primeiro valor (lorem
). Não há um padrão sobre isso e os usos variam. Consulte, por exemplo, esta pergunta: Posição autoritativa de chaves de consulta HTTP GET duplicadas .NOTA: A função diferencia maiúsculas de minúsculas. Se você preferir o nome do parâmetro que não diferencia maiúsculas de minúsculas, adicione o modificador 'i' ao RegExp
Esta é uma atualização baseada nas novas especificações de URLSearchParams para obter o mesmo resultado de forma mais sucinta. Veja a resposta intitulada " URLSearchParams " abaixo.
fonte
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
o valor do campox
é ambíguo.?mykey=0&m.+key=1
consulta de , a chamadagetParameterByName("m.+key")
retornaria em0
vez de1
. Você precisa escapar dos metacaracteres da expressão regularname
antes de criar sua expressão regular. E você só precisa chamar.replace()
uma vez usando o sinalizador global e usando"\\$&"
como expressão de substituição. Você deve procurar emlocation.search
vez delocation.href
. Uma resposta com mais de 400 votos positivos deve levar em conta esses detalhes.Algumas das soluções postadas aqui são ineficientes. Repetir a pesquisa de expressão regular toda vez que o script precisar acessar um parâmetro é completamente desnecessário, basta uma única função para dividir os parâmetros em um objeto de estilo de matriz associativa. Se você não estiver trabalhando com a API de histórico do HTML 5, isso será necessário apenas uma vez por carregamento da página. As outras sugestões aqui também falham ao decodificar o URL corretamente.
Exemplo de string de consulta:
Resultado:
Isso poderia ser facilmente aprimorado para lidar também com cadeias de consulta no estilo de matriz. Um exemplo disso está aqui , mas como os parâmetros de estilo de matriz não estão definidos no RFC 3986 , não poluirei esta resposta com o código-fonte. Para os interessados em uma versão "poluída", veja a resposta da campbeln abaixo .
Além disso, como apontado nos comentários,
;
é um delimitador legal parakey=value
pares. Seria necessário um regex mais complicado para manipular;
ou&
, o que eu acho desnecessário, porque é raro o;
uso e eu diria ainda mais improvável que ambos sejam usados. Se você precisar dar suporte ao;
invés de&
, basta trocá-los na regex.Se você estiver usando uma linguagem de pré-processamento do servidor, convém usar suas funções JSON nativas para fazer o trabalho pesado para você. Por exemplo, em PHP, você pode escrever:
Muito mais simples!
ATUALIZADA
Portanto, esta é a abordagem para gerenciá-lo:
fonte
window.location.hash
propriedade, que é separada dawindow.location.search
propriedade. Se o hash for alterado, não afetará a string de consulta.;
é um delimitador legal parakey=value
pares GET . É raro, mas leva 5 segundos para implementar.?a=b&c=d
é convencional e uma recomendação do W3C para formulários da Web, mas a especificação do URI apenas definequery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
comwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Sem jQuery
Com um URL como
?topic=123&name=query+string
, o seguinte retornará:Método do Google
Rasgando o código do Google, encontrei o método que eles usam:
getUrlParameters
É ofuscado, mas é compreensível. Não funciona porque algumas variáveis são indefinidas.
Eles começam a procurar parâmetros no URL
?
e também no hash#
. Em seguida, para cada parâmetro, eles se dividem no sinal de igualb[f][p]("=")
(que pareceindexOf
, eles usam a posição do caractere para obter a chave / valor). Com a divisão, eles verificam se o parâmetro tem um valor ou não; se tiver, eles armazenam o valor ded
; caso contrário, eles continuam.No final, o objeto
d
é retornado, manipulando escape e o+
sinal. Este objeto é como o meu, tem o mesmo comportamento.Meu método como um plugin jQuery
Uso
Teste de desempenho (método de divisão contra o método regex) ( jsPerf )
Código de preparação: declaração de métodos
Código de teste dividido
Código de teste Regex
Testando no Firefox 4.0 x86 no Windows Server 2008 R2 / 7 x64
fonte
unescape
seja uma função obsoleta e substituída pordecodeURIComponent()
, observe que nenhuma dessas funções decodificará corretamente+
um caractere de espaço. 2. Você deve declarar o resultado como um objeto, em vez de uma matriz, porque o JavaScript não possui matrizes associativas, por si só, e a matriz que você declara é tratada como um objeto, atribuindo propriedades nomeadas a ele de qualquer maneira.window.location
faz com que qualquer desempenho se preocupe, já que o cliente que navega para o URL é muito, muito mais caro.Versão aprimorada da resposta de Artem Barger :
Para obter mais informações sobre melhoria, consulte: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
fonte
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
se o parâmetro não for seguido por '='. Você podeif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
fazer um prefixo para fazê-lo retornarboolean false
se o parâmetro não estiver lá.new
prefixo ao criar o regex:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ e Chrome 49+ são compatíveis com a API URLSearchParams :
Existe um polyfill URLSearchParams sugerido pelo Google para as versões estáveis do IE.
Não é padronizado pelo W3C , mas é um padrão de vida do WhatWG .
Você pode usá-lo em
location
:ou
Ou, é claro, em qualquer URL:
Você pode obter parâmetros também usando uma
.searchParams
propriedade abreviada no objeto URL, assim:Você lê / parâmetros definidos pelo
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. Você também pode iterar sobre todos os valoresfor (let p of params) {}
.Uma implementação de referência e uma página de amostra estão disponíveis para auditoria e teste.
fonte
.get
em vez de apenas.
slice(1)
de.search
, você pode usá-lo diretamente. URLSearchParams pode lidar com os principais?
.URLSearchParams
não é bom porque não retorna os valores reais dos parâmetros de um URL.new URL('https://example.com?foo=1&bar=2')
não está funcionando para url androidfile:///android_asset/...
Apenas outra recomendação. O plugin Purl permite recuperar todas as partes da URL, incluindo âncora, host, etc.
Pode ser usado com ou sem jQuery.
O uso é muito simples e interessante:
No entanto, a partir de 11 novembro de 2014, Purl há mantida durante mais tempo e o autor recomenda o uso URI.js vez. O plugin jQuery é diferente, pois se concentra nos elementos - para uso com strings, basta usar
URI
diretamente, com ou sem jQuery. Código semelhante seria assim, documentos mais completos aqui :fonte
tl; dr
Uma solução rápida e completa , que lida com chaves de vários valores e caracteres codificados .
Multi-alinhado:O que é todo esse código ...
Exemplo:"coalescência nula" , avaliação de curto-circuito
ES6 Atribuições de reestruturação , funções de seta , seqüências de caracteres de modelo
Leia mais ... sobre a solução Vanilla JavaScript.
Para acessar diferentes partes de um URL, use
location.(search|hash)
Solução mais fácil (fictícia)
Chaves com vários valores
Verificação de chave simples
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
ouqd[key][index]
Caracteres codificados?
Use
Exemplo:decodeURIComponent()
para a segunda ou ambas as divisões.Dos comentários
* !!! Observe que isso
decodeURIComponent(undefined)
retorna string"undefined"
. A solução está no uso simples de&&
, o que garante quedecodeURIComponent()
não sejam chamados valores indefinidos. (Veja a "solução completa" na parte superior.)Se a string de consulta estiver vazia (
location.search == ""
), o resultado será um pouco enganadorqd == {"": undefined}
. Sugere-se verificar a sequência de consultas antes de iniciar a função de análise como:fonte
array.forEach()
injetando certo código no início do seu script. consulte Polyfill developer.mozilla.org/pt-BR/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] })
O Roshambo no snipplr.com possui um script simples para conseguir isso descrito em Obter parâmetros de URL com jQuery | Melhorado . Com o script dele, você também obtém facilmente os parâmetros que deseja.
Aqui está a essência:
Em seguida, basta obter seus parâmetros na string de consulta.
Portanto, se a URL / consulta for
xyz.com/index.html?lang=de
.Basta ligar
var langval = $.urlParam('lang');
e você já conseguiu.O UZBEKJON também tem um ótimo post no blog, Obter parâmetros e valores de URL com o jQuery .
fonte
0
? Claro, eu poderia usar rigorosa verificação de igualdade, mas não deverianull
?Se você estiver usando o jQuery, poderá usar uma biblioteca, como o jQuery BBQ: botão Voltar e biblioteca de consultas .
Edit: Adicionando Deparam Exemplo:
Se você quiser usar apenas JavaScript simples, poderá usar ...
Por causa da nova API de histórico de HTML e, especificamente ,
history.pushState()
ehistory.replaceState()
, a URL pode mudar, o que invalidará o cache de parâmetros e seus valores.Esta versão atualizará seu cache interno de parâmetros sempre que o histórico for alterado.
fonte
Basta usar duas divisões :
Eu estava lendo todas as respostas anteriores e mais completas. Mas acho que esse é o método mais simples e rápido. Você pode verificar este benchmark jsPerf
Para resolver o problema no comentário do Rup, adicione uma divisão condicional alterando a primeira linha para as duas abaixo. Mas a precisão absoluta significa que agora é mais lento que o regexp (consulte jsPerf ).
Portanto, se você sabe que não encontrará o contra-argumento de Rup, isso vence. Caso contrário, regexp.
fonte
get('value')
emhttp://the-url?oldvalue=1&value=2
.half
verdade, isso retornará nulo para um parâmetro vazio como?param=
. Nesse caso, ele deve retornar a cadeia vazia e a verificaçãohalf !== undefined
resolve isso.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
obtê-lo para o trabalhoAqui está minha tentativa de transformar a excelente solução de Andy E em um completo plug-in jQuery:
A sintaxe é:
Melhor dos dois mundos!
fonte
Se você está fazendo mais URL manipulação do que simplesmente analisar a querystring, você pode encontrar URI.js útil. É uma biblioteca para manipular URLs - e vem com todos os sinos e assobios. (Desculpe por auto-publicidade aqui)
para converter sua string de consulta em um mapa:
(URI.js também "correções" querystrings mau gosto
?&foo&&bar=baz&
a?foo&bar=baz
)fonte
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
mesmo resultado ( documentos ).Eu gosto da solução de Ryan Phelan . Mas não vejo sentido em estender o jQuery para isso? Não há uso da funcionalidade jQuery.
Por outro lado, gosto da função incorporada no Google Chrome: window.location.getParameter.
Então, por que não usar isso? Ok, outros navegadores não têm. Então, vamos criar esta função se ela não existir:
Essa função é mais ou menos de Ryan Phelan, mas é diferente: nome claro e sem dependências de outras bibliotecas javascript. Mais sobre esta função no meu blog .
fonte
Aqui está uma maneira rápida de obter um objeto semelhante ao array PHP $ _GET :
Uso:
Para a string de consulta,
x=5&y&z=hello&x=6
isso retorna o objeto:fonte
(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);
e use assim:$.get_query()
location.href
teria que ser substituído porlocation.search
.Mantenha-o simples no código JavaScript simples:
Chame-o de qualquer lugar no código JavaScript:
fonte
window.location.search
!Todas essas são ótimas respostas, mas eu precisava de algo um pouco mais robusto e pensei que todos vocês gostariam de ter o que eu criei.
É um método simples de biblioteca que disseca e manipula parâmetros de URL. O método estático possui os seguintes sub-métodos que podem ser chamados no URL do assunto:
Exemplo:
fonte
Do MDN :
fonte
Código golf:
Mostre!
No meu Mac:
test.htm?i=can&has=cheezburger
exibefonte
Eu uso muito expressões regulares, mas não para isso.
Parece-me mais fácil e eficiente ler a string de consulta uma vez no meu aplicativo e criar um objeto a partir de todos os pares de chave / valor, como:
Para um URL como
http://domain.com?param1=val1¶m2=val2
você pode obter o valor mais tarde no seu código comosearch.param1
esearch.param2
.fonte
fonte
O método jQuery da Roshambo não estava cuidando da URL de decodificação
Apenas adicionei esse recurso ao adicionar a declaração de retorno
Agora você pode encontrar a essência atualizada:
fonte
Eu gosto deste (retirado de jquery-howto.blogspot.co.uk):
Funciona muito bem para mim.
fonte
Aqui está minha edição desta excelente resposta - com capacidade adicional de analisar cadeias de caracteres de consulta com chaves sem valores.
IMPORTANTE! O parâmetro para essa função na última linha é diferente. É apenas um exemplo de como alguém pode passar um URL arbitrário para ele. Você pode usar a última linha da resposta de Bruno para analisar o URL atual.
Então, o que exatamente mudou? Com os
http://sb.com/reg/step1?param=
resultados da URL , será o mesmo. Mas, com o URL,http://sb.com/reg/step1?param
a solução de Bruno retorna um objeto sem chaves, enquanto a minha retorna um objeto com chaveparam
eundefined
valor.fonte
Eu precisava de um objeto da string de consulta e odeio muito código. Pode não ser o mais robusto do universo, mas são apenas algumas linhas de código.
Um URL como
this.htm?hello=world&foo=bar
criará:fonte
decodeURIComponent
o valor à medida que você a armazena - e provavelmente a chave também, mas é menos provável que você use seqüências estranhas nisso.?a&b&c
mas isso é realmente muito legível (e aliás semelhante à minha primeira ideia). Tambémsplit
é redundante, mas eu tenho peixes de maior desempenho para fritar do que dividir uma sequência de 10 caracteres duas vezes.location.search.substr(1)
vez delocation.href.split('?')[1]
evitar pegar hash (#anchor
) junto com o último parâmetro de consulta.location.search
!Aqui está uma versão estendida da versão "Manipular cadeias de consulta no estilo de matriz" de Andy E. Corrigido um bug (
?key=1&key[]=2&key[]=3
;1
é perdido e substituído por[2,3]
), fazia algumas pequenas melhorias no desempenho (recodificação de valores, recalculando a posição "[" etc.)) e adicionava várias melhorias (funcionalizado, suporte para?key=1&key=2
, suporte para;
delimitadores) . Eu deixei as variáveis irritantemente curtas, mas adicionei muitos comentários para torná-las legíveis (ah, e eu reutilizeiv
nas funções locais, desculpe se isso é confuso;).Ele manipulará a seguinte querystring ...
... transformando-o em um objeto que se parece com ...
Como você pode ver acima, esta versão lida com algumas medidas de matrizes "malformadas", ou seja, -
person=neek&person[]=jeff&person[]=jim
ouperson=neek&person=jeff&person=jim
como a chave é identificável e válida (pelo menos no NameValueCollection.Add da dotNet ):Parece que o júri está de certa forma pressionado, pois não há especificações. Nesse caso, várias chaves são armazenadas como uma matriz (falsa). Mas observe que eu não processo valores baseados em vírgulas em matrizes.
O código:
fonte
q = decodeURIComponent(window.location.search.substring(1)),
ajuda a fazer isso também.Esta é uma função que criei há um tempo e estou muito feliz com isso. Não diferencia maiúsculas de minúsculas - o que é útil. Além disso, se o QS solicitado não existir, ele retornará uma string vazia.
Eu uso uma versão compactada disso. Estou postando descompactado para os tipos iniciantes para explicar melhor o que está acontecendo.
Tenho certeza de que isso pode ser otimizado ou feito de maneira diferente para funcionar mais rapidamente, mas sempre funcionou muito bem para o que eu preciso.
Aproveitar.
fonte
Acabamos de lançar o arg.js , um projeto que visa solucionar esse problema de uma vez por todas. Tradicionalmente, tem sido tão difícil, mas agora você pode fazer:
ou obter todo o lote:
e se você se importa com a diferença entre
?query=true
e#hash=true
então pode usar os métodosArg.query()
eArg.hash()
.fonte
O problema com a principal resposta dessa pergunta é que não há parâmetros suportados depois de #, mas às vezes é necessário obter esse valor também.
Modifiquei a resposta para permitir que ele analise também uma string de consulta completa com um sinal de hash:
fonte
E é assim que você pode usar esta função assumindo que a URL seja
fonte
?stringtext&stringword=foo
.Se você estiver usando o Browserify, poderá usar o
url
módulo no Node.js :Leitura adicional: URL Node.js v0.12.2 Manual e documentação
EDIT: Você pode usar a interface de URL , que é amplamente adotada em quase todo o novo navegador e, se o código for executado em um navegador antigo, você pode usar um polyfill como este . Aqui está um exemplo de código sobre como usar a interface de URL para obter parâmetros de consulta (também conhecidos como parâmetros de pesquisa)
Você também pode usar URLSearchParams para isso, aqui está um exemplo do MDN para fazer isso com URLSearchParams:
fonte
url
API do módulo está aqui: nodejs.org/api/url.html