¿Existe una manera simple y de una línea para obtener los datos de un formulario como lo sería si se presentara en la forma clásica de solo HTML?
Por ejemplo:
<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>
Salida:
{
"foo": "1",
"bar": "xxx",
"this": "hi"
}
Algo como esto es demasiado simple, ya que no incluye (correctamente) áreas de texto, selecciones, botones de opción y casillas de verificación:
$("#form input").each(function () {
data[theFieldName] = theFieldValue;
});
javascript
jquery
forms
Bart van Heukelom
fuente
fuente
Respuestas:
manifestación
fuente
_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
Uso
$('form').serializeArray()
, que devuelve una matriz :Otra opción es
$('form').serialize()
, que devuelve una cadena :Echa un vistazo a esta demo jsfiddle
fuente
serializeArray
sería mucho más útil si devolviera un objeto con pares clave-valorname="multiple[]"
no funcionan. La solución para el método POST es la misma, solo use $ ('form'). Serialize (). Además, el método POST no tiene un límite de 2000 caracteres como GET en la mayoría de los navegadores, por lo que puede usarse incluso para datos bastante grandes.name
atributo.Respuesta actualizada para 2014: HTML5 FormData hace esto
Luego puede publicar formData exactamente como es: contiene todos los nombres y valores utilizados en el formulario.
fuente
entries()
método [página MDN ].Basado en
jQuery.serializeArray
, devuelve pares clave-valor.fuente
Esta es una respuesta puntual, pero déjame explicarte por qué esta es una mejor solución:
Estamos manejando adecuadamente el envío de un formulario en lugar de presionar un botón. A algunas personas les gusta presionar enter en los campos. Algunas personas usan dispositivos de entrada alternativos, como entrada de voz u otros dispositivos de accesibilidad. Maneje el envío del formulario y lo resuelve correctamente para todos.
Estamos investigando los datos del formulario para el formulario real que se envió. Si cambia su selector de formulario más adelante, no tiene que cambiar los selectores para todos los campos. Además, puede tener varias formas con los mismos nombres de entrada. No es necesario desambiguar con ID excesivos y lo que no, simplemente haga un seguimiento de las entradas en función del formulario que se envió. Esto también le permite utilizar un único controlador de eventos para múltiples formularios si es apropiado para su situación.
La interfaz FormData es bastante nueva, pero está bien soportada por los navegadores. Es una excelente manera de construir esa recopilación de datos para obtener los valores reales de lo que está en el formulario. Sin él, tendrá que recorrer todos los elementos (como con
form.elements
) y descubrir qué se verifica, qué no, cuáles son los valores, etc. Totalmente posible si necesita soporte antiguo del navegador, pero FormData La interfaz es más simple.Estoy usando ES6 aquí ... no es un requisito de ninguna manera, así que cámbielo de nuevo para que sea compatible con ES5 si necesita soporte de navegador antiguo.
fuente
formData.entries()
.formData.foo
no está definido. Como se ve en su respuesta,.get()
necesita ser llamado para lo que creo que es inconveniente. Tal vez "no expone" se encontró con el camino equivocado. Por lo tanto, para generar algo parecido{ foo: 'bar' }
a unsubmit
evento, debe iterar sobre ellos manualmente. De ahí el. To get a plain object from it, see [link]
.xhr.send(formData);
JSON.stringify([...formData])
O, si quieres que tus claves / valores se separen ...[...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
use .serializeArray () para obtener los datos en formato de matriz y luego convertirlos en un objeto:
fuente
<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />
. Si ambos están marcados, el objeto solo contiene el segundo valor de casilla de verificación.someList
debería estartype="radio"
?name:value
Aquí hay una solución realmente simple y corta que incluso no requiere Jquery.
fuente
postData
.Es 2019 y hay una mejor manera de hacer esto:
o si quieres un objeto simple en su lugar
aunque tenga en cuenta que esto no funcionará con claves duplicadas como las de las casillas de selección múltiple y duplicadas con el mismo nombre.
fuente
document.getElementsByClassName
y un bucle pero bueno, todavía más bonito que requiere jQuery etcdocument.querySelector
lugar de soloquerySelector
.fuente
Aparte de eso, es posible que desee mirar serialize () ;
fuente
Yo uso esto:
Complemento jQuery
Formulario HTML
Obtenga los datos
fuente
Array
Aquí hay una implementación de JavaScript que funciona y que maneja correctamente casillas de verificación, botones de opción y controles deslizantes (probablemente también otros tipos de entrada, pero solo los he probado).
Ejemplo de trabajo:
editar:
Si está buscando una implementación más completa, eche un vistazo a esta sección del proyecto para el que hice esto . Eventualmente actualizaré esta pregunta con la solución completa que se me ocurrió, pero tal vez esto sea útil para alguien.
fuente
Si está utilizando jQuery, aquí hay una pequeña función que hará lo que está buscando.
Primero, agregue una ID a su formulario (a menos que sea el único formulario en la página, luego puede usar 'formulario' como la consulta dom)
La salida se vería así:
fuente
También puede usar los objetos FormData ; El objeto FormData le permite compilar un conjunto de pares clave / valor para enviar utilizando XMLHttpRequest. Está destinado principalmente para su uso en el envío de datos de formularios, pero puede utilizarse independientemente de los formularios para transmitir datos codificados.
fuente
Esto agregará todos los campos de formulario al objeto de JavaScript "res":
fuente
He incluido la respuesta para devolver también el objeto requerido.
fuente
foo[bar][] = 'qux'
debe serializar a{ foo: { bar: [ 'qux' ] } }
.Basado en la respuesta de neuront, creé un método JQuery simple que obtiene los datos del formulario en pares clave-valor, pero funciona para selecciones múltiples y para entradas de matriz con name = 'example []'.
Así es como se usa:
Puede encontrar un ejemplo a continuación de su definición y cómo funciona.
fuente
fuente
fuente
puede usar esta función para tener un objeto o un JSON desde el formulario.
para usarlo:
fuente
Escribí una biblioteca para resolver este mismo problema: JSONForms . Toma una forma, revisa cada entrada y crea un objeto JSON que puede leer fácilmente.
Digamos que tiene el siguiente formulario:
Pasar el formulario al método de codificación de JSONForms le devuelve el siguiente objeto:
Aquí hay una demostración con su formulario.
fuente
Codepen
fuente
Para aquellos de ustedes que preferirían una
Object
cadena en lugar de una cadena serializada (como la que devuelve$(form).serialize()
, y una ligera mejora$(form).serializeArray()
), no dude en usar el siguiente código:Para ejecutarlo, solo use
Form.serialize(form)
y la función devolverá unaObject
similar a esta:Como beneficio adicional, significa que no tiene que instalar todo el paquete de jQuery solo para una función de serialización.
fuente
Escribí una función que se encarga de múltiples casillas de verificación y múltiples selecciones. En esos casos, devuelve una matriz.
fuente
mostrando los campos del elemento de entrada del formulario y el archivo de entrada para enviar su formulario sin actualizar la página y tomar todos los valores con el archivo incluido aquí
fuente
Solucionará el problema: no podría funcionar con multiselecciones.
fuente
Todos ustedes no son completamente correctos. No puedes escribir:
De esta manera, si tiene una lista de selección múltiple, sus valores se sobrescribirán con el último, ya que se transmite como: "param1": "value1", "param1": "value2".
Entonces, el enfoque correcto es:
fuente
Este método debería hacerlo. Serializa los datos del formulario y luego los convierte en un objeto. También se encarga de grupos de casillas de verificación.
fuente
name
atributo.Aquí hay una buena función JS de vainilla que escribí para extraer datos de formulario como un objeto. También tiene opciones para insertar adiciones en el objeto y para borrar los campos de entrada del formulario.
Aquí hay un ejemplo de su uso con una solicitud de publicación:
fuente