Dado o seguinte formulário:
<form>
<input name="foo" value="bar">
<input name="hello" value="hello world">
</form>
Eu posso usar a $.param( .. )
construção para serializar o formulário:
$.param( $('form input') )
=> foo=bar&hello=hello+world
Como posso desserializar a String acima com JavaScript e recuperar um hash?
Por exemplo,
$.magicFunction("foo=bar&hello=hello+world")
=> {'foo' : 'bar', 'hello' : 'hello world'}
Referência: jQuery.param( obj )
.
javascript
jquery
seb
fonte
fonte
+
. Agora ele substitui todos eles!QueryString
. Eu criei um, mas ele não aceita parâmetros, apenas lê em window.location.search. Lembro-me de outros que aceitam parâmetros ...Respostas:
Você deve usar jQuery churrasco 's deparam função. É bem testado e documentado.
fonte
Esta é uma versão ligeiramente modificada de uma função que escrevi há algum tempo para fazer algo semelhante.
fonte
Que tal essa abordagem funcional curta?
Exemplo:
fonte
field[][]=a&field[0][]=b&field[0][]=c
é processado comoObject { field[][]: "a", field[0][]: "c" }
deveria estarresultobject.field[0] = Array [ "a", "b", "c" ]
. Esse é o comportamento conforme o esperado do PHP. A solução da @ JackyLi cuida disso.Minha resposta:
fonte
JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)
eu recebo{"2":["2"],"3":["4"],"":"cc"}
e não o[null,null,[2],[3,4],"bb","cc"]
que eu esperava (isso é o que o PHP me daria).Estou usando a resposta de David Dorward e percebi que ela não se comporta como PHP ou Ruby on Rails como eles analisam os parâmetros:
1) uma variável é apenas uma matriz se terminar com
[]
, como?choice[]=1&choice[]=12
, não quando estiver?a=1&a=2
2) quando existem vários parâmetros com o mesmo nome, os últimos substituem os anteriores, como nos servidores PHP (o Ruby on Rails mantém o primeiro e ignora os últimos), como
?a=1&b=2&a=3
Então, modificando a versão de David, tenho:
que é testado com bastante cuidado.
fonte
hash[k.substr(0, k.length-2)] = [v];
ehash[k.substr(0, k.length-2)].push(v);
Eu sei que esse é um tópico antigo, mas talvez ainda haja alguma relevância nele?
Inspirado pela boa solução de Jacky Li, tentei uma pequena variação, com o objetivo de também poder cuidar de combinações arbitrárias de matrizes e objetos como entrada. Eu olhei como o PHP teria feito isso e tentei obter algo "semelhante". Aqui está o meu código:
Se a função for chamada sem o
str
argumento-assumiráwindow.location.search.slice(1)
como entrada.Alguns exemplos:
resulta em
Considerando que a solução de Jacky Li produziria o recipiente externo
a
como um objeto simplesgetargs()
examina o primeiro índice fornecido em busca de qualquer nível para determinar se esse nível será um objeto (índice não numérico) ou uma matriz (numérica ou vazia), resultando assim na saída conforme mostrado na lista acima (nº 6).Se o objeto atual for uma matriz,
null
s serão inseridos sempre que necessário para representar posições vazias. As matrizes são sempre numeradas consecutivamente e com base em 0).Note que no exemplo não. 8 o "incremento automático" para índices vazios ainda funciona, embora estejamos lidando com um objeto agora e não com uma matriz.
Tanto quanto eu testei, meu
getargs()
comportamento se comporta de maneira idêntica ao ótimo$.deparam()
plugin jQuery de Chriss Roger mencionado na resposta aceita. A principal diferença é quegetargs
é executada sem jQuery e que faz autoincrement em objetos enquanto$.deparam()
vai não fazer isso:resulta em
No
$.deparam()
índice[]
é interpretado como umundefined
índice numérico autoincrementado.fonte
o[k]=isNaN(idx[0])?{}:[];
com a intenção de criar uma matriz, sempre que encontro um índice numérico como o primeiro dado para um novo objeto. Caso contrário, farei um objeto genérico. Cabe a você modificar essa parte do código para melhor atender às suas necessidades. I. e. algo comoo[k]={}
deve fazer o truque.Veja como você pode criar uma nova função jQuery:
fonte
true
para que se possa verificarif (params.redirect)
ou similar. Se você quiser diferir entretrue
e outro valor, você usariaif (params.redirect === true)
. Umnull
valor não ajudaria de nenhuma maneira que eu possa pensar. O motivo pelo qual não fiz como David é porque valorizo a consistência sobre a flexibilidade. Com seu método, tenho que verificar se o valor é uma string ou uma matriz para usar seu valor. Na minha opinião, deve sempre ser uma string (otrue
valor é convertido para o'true'
que eu acho bom) ou sempre ser uma matriz. Eu escolhi corda./abc?delete
, eu esperaria que houvesse uma entrada paradelete
. Não vejo como isso é diferente? Eu nem vejo como você pode preferir o outro código por esse motivo, porque esse código definirá o valor para a string'undefined'
que não é melhor. E, quanto a vários valores, é um caso de simplicidade versus flexibilidade. Raramente vejo o uso de vários valores nas cadeias de consulta, mas se você os quiser, sempre retorne uma matriz com 1 ou mais valores. Nunca misture o tipo de retorno; então você terá que gastar tempo para depurar, porque o que geralmente era uma cadeia de repente poderia ser uma matriz.Graças a ele http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
Muito fácil: D
fonte
?something=1¶m2=value2
em uma matriz. O que você quer dizer com "não funciona com caixas de seleção com várias opções"?Aqui está minha implementação JavaScript que eu uso em uma página JScript ASP Classic do lado do servidor ( demo ):
fonte
usa isto :
fonte
Eu vim com esta solução, que se comporta como a função .Net
HttpUtility.ParseQueryString
.No resultado, os parâmetros da string de consulta são armazenados em propriedades como listas de valores, de modo que
qsObj["param"]
serão os mesmos que chamarGetValues("param")
.Net.Espero que você goste. JQuery não é necessário.
Aqui está como usá-lo:
Para visualizar o resultado no console, basta digitar:
Resultado:
fonte
Há um belo artigo em CSS-Tricks (fonte original de Nicholas Ortenzio ):
A parte realmente inteligente é como ela usa o
this
objeto da função anônima , adicionando um par de chave / valor para cada uma das consultas na string. Dito isto, há algum espaço para melhorias. Eu o modifiquei um pouco abaixo, com as seguintes alterações:Adicionado tratamento de cadeias vazias e entrada sem cadeia.
Manipulou cadeias codificadas em URI (
%40
->@
, etc).Removido o uso padrão de
document.location.search
quando a entrada estava vazia.Alterou o nome, tornou-o mais legível, acrescentou comentários.
fonte
Esta é realmente uma pergunta antiga, mas como eu vim - outras pessoas podem vir a este post, e eu quero atualizar um pouco esse tema. Hoje não há necessidade de criar soluções personalizadas - existe a interface URLSearchParams .
A única limitação que eu conheço - esse recurso não é suportado no IE / Edge.
fonte
Esta é a minha versão no Coffeescript. Também funciona para URL como
http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home
fonte
Aqui está um exemplo simples e compacto, se você deseja obter rapidamente os parâmetros de uma solicitação GET:
Converte
em um objeto como
fonte
Cria uma representação serializada de uma matriz ou objeto (pode ser usada como string de consulta de URL para solicitações AJAX).
fonte
As respostas podem usar um pouco de elegância do jQuery :
fork em https://gist.github.com/956897
fonte
Você pode usar a função
.serializeArray()
( Link ) do próprio jQuery. Esta função retorna uma matriz de par de valores-chave. Exemplo de resultado:fonte