Existe uma maneira simples, de uma linha, de obter os dados de um formulário como seria se fosse submetido da maneira clássica somente em HTML?
Por exemplo:
<form>
<input type="radio" name="foo" value="1" checked="checked" />
<input type="radio" name="foo" value="0" />
<input name="bar" value="xxx" />
<select name="this">
<option value="hi" selected="selected">Hi</option>
<option value="ho">Ho</option>
</form>
Resultado:
{
"foo": "1",
"bar": "xxx",
"this": "hi"
}
Algo assim é muito simples, pois não inclui (corretamente) áreas de texto, seleções, botões de opção e caixas de seleção:
$("#form input").each(function () {
data[theFieldName] = theFieldValue;
});
javascript
jquery
forms
Bart van Heukelom
fonte
fonte
Respostas:
demonstração
fonte
_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
Use
$('form').serializeArray()
, que retorna uma matriz :Outra opção é
$('form').serialize()
, que retorna uma string :Dê uma olhada nesta demonstração do jsfiddle
fonte
serializeArray
seria muito mais útil se voltou um objeto com pares chave-valorname="multiple[]"
não funcionam. A solução para o método POST é a mesma, basta usar $ ('form'). Serialize (). Além disso, o método POST não possui limite de 2000 caracteres, como o GET na maioria dos navegadores, portanto, pode ser usado mesmo para dados muito grandes.name
atributo.Resposta atualizada para 2014: o HTML5 FormData faz isso
Você pode postar formData exatamente como está - ele contém todos os nomes e valores usados no formulário.
fonte
entries()
método [página MDN ].Com base em
jQuery.serializeArray
, retorna pares de valores-chave.fonte
Esta é uma resposta detalhada, mas deixe-me explicar por que essa é uma solução melhor:
Estamos lidando adequadamente com o envio de um formulário, em vez de pressionar o botão. Algumas pessoas gostam de pressionar enter nos campos. Algumas pessoas usam dispositivos de entrada alternativos, como entrada de fala ou outros dispositivos de acessibilidade. Manipule o envio do formulário e o resolva corretamente para todos.
Estamos investigando os dados do formulário real enviado. Se você alterar o seletor de formulário posteriormente, não precisará alterar os seletores para todos os campos. Além disso, você pode ter vários formulários com os mesmos nomes de entrada. Não há necessidade de desambiguar com IDs excessivos e, caso contrário, basta rastrear as entradas com base no formulário que foi enviado. Isso também permite que você use um único manipulador de eventos para vários formulários, se for apropriado para sua situação.
A interface FormData é relativamente nova, mas é bem suportada pelos navegadores. É uma ótima maneira de criar essa coleta de dados para obter os valores reais do que está no formulário. Sem ele, você terá que percorrer todos os elementos (como com
form.elements
) e descobrir o que está marcado, o que não está, quais são os valores, etc. Totalmente possível se você precisar de suporte antigo ao navegador, mas o FormData interface é mais simples.Estou usando o ES6 aqui ... não é um requisito de forma alguma, portanto, altere-o novamente para ser compatível com o ES5 se você precisar de suporte antigo do navegador.
fonte
formData.entries()
.formData.foo
é indefinido. Como visto na sua resposta,.get()
precisa ser chamado para aquilo que considero inconveniente. Talvez "não exponha" veio do outro lado. Portanto, para gerar algo parecido{ foo: 'bar' }
com umsubmit
evento, você precisa iterá-lo manualmente. Daí o. To get a plain object from it, see [link]
.xhr.send(formData);
JSON.stringify([...formData])
Ou, se você quer suas chaves / valores separar ...[...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
use .serializeArray () para obter os dados no formato de matriz e depois convertê-los em um objeto:
fonte
<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />
. Se ambos estiverem marcados, o objeto conterá apenas o segundo valor da caixa de seleção.someList
deveria estartype="radio"
?name:value
Aqui está um solução realmente simples e curta que nem sequer requer Jquery.
fonte
postData
.É 2019 e há uma maneira melhor de fazer isso:
ou se você quiser um objeto simples
embora observe que isso não funcionará com chaves duplicadas, como você obtém nas caixas de seleção com várias seleções e duplicadas com o mesmo nome.
fonte
document.getElementsByClassName
e um loop for, mas hey, ainda mais agradável do que exigindo jQuery etcdocument.querySelector
vez de apenasquerySelector
.fonte
Eu uso isso:
Plugin jQuery
Formulário HTML
Obtenha os dados
fonte
Array
além disso, você pode querer olhar para serialize () ;
fonte
Aqui está uma implementação de JavaScript que funciona corretamente e que lida corretamente com caixas de seleção, botões de opção e controles deslizantes (provavelmente outros tipos de entrada também, mas eu os testei apenas).
Exemplo de trabalho:
editar:
Se você está procurando uma implementação mais completa, dê uma olhada nesta seção do projeto para a qual eu fiz isso . Eventualmente, atualizarei esta pergunta com a solução completa que me foi apresentada, mas talvez isso seja útil para alguém.
fonte
Se você estiver usando jQuery, aqui está uma pequena função que fará o que você está procurando.
Primeiro, adicione um ID ao seu formulário (a menos que seja o único formulário na página, você poderá usar apenas 'form' como a consulta dom)
A saída seria semelhante a:
fonte
Você também pode usar os objetos FormData ; O objeto FormData permite compilar um conjunto de pares de chave / valor para enviar usando XMLHttpRequest. Destina-se principalmente ao uso no envio de dados de formulários, mas pode ser usado independentemente dos formulários para transmitir dados codificados.
fonte
Isso anexará todos os campos do formulário ao objeto JavaScript "res":
fonte
Incluí a resposta para também devolver o objeto necessário.
fonte
foo[bar][] = 'qux'
deve serializar para{ foo: { bar: [ 'qux' ] } }
.Com base na resposta da neuront, criei um método JQuery simples que obtém os dados do formulário em pares de chave-valor, mas funciona para seleções múltiplas e entradas de matriz com nome = 'exemplo []'.
É assim que é usado:
Você pode encontrar um exemplo abaixo de sua definição e como ele funciona.
fonte
fonte
fonte
você pode usar esta função para ter um objeto ou um JSON do formulário.
para usá-lo:
fonte
Eu escrevi uma biblioteca para resolver esse problema: JSONForms . Ele assume um formulário, passa por cada entrada e cria um objeto JSON que você pode ler facilmente.
Digamos que você tenha o seguinte formulário:
Passar o formulário para o método de codificação JSONForms retorna o seguinte objeto:
Aqui está uma demonstração com seu formulário.
fonte
Codepen
fonte
Para aqueles de vocês que preferem uma
Object
string serializada, ao contrário de uma sequência serializada (como a retornada por$(form).serialize()
, e uma ligeira melhoria$(form).serializeArray()
), fique à vontade para usar o código abaixo:Para executá-lo, basta usar
Form.serialize(form)
e a função retornará umObject
semelhante a este:Como bônus, significa que você não precisa instalar o pacote inteiro do jQuery apenas para uma função de serialização.
fonte
Eu escrevi uma função que cuida de várias caixas de seleção e várias seleções. Nesses casos, ele retorna uma matriz.
fonte
mostrando os campos do elemento de entrada do formulário e o arquivo de entrada para enviar seu formulário sem atualização da página e pegar todos os valores com o arquivo incluído aqui
fonte
Isso corrigirá o problema: não foi possível trabalhar com várias seleções.
fonte
Você não está totalmente correto. Você não pode escrever:
Porque dessa forma, se você tiver uma lista de seleção múltipla - seus valores serão substituídos pelo último, pois é transmitido como: "param1": "value1", "param1": "value2".
Portanto, a abordagem correta é:
fonte
Este método deve fazer isso. Ele serializa os dados do formulário e os converte em um objeto. Também cuida de grupos de caixas de seleção.
fonte
name
atributo.Aqui está uma boa função de baunilha JS que escrevi para extrair dados do formulário como um objeto. Ele também possui opções para inserir adições no objeto e para limpar os campos de entrada do formulário.
Aqui está um exemplo de seu uso com uma solicitação de postagem:
fonte