У мене форма з багатьма полями введення.
Коли я вловлю подію форми подання за допомогою jQuery, чи можливо отримати всі поля введення цієї форми в асоціативному масиві?
У мене форма з багатьма полями введення.
Коли я вловлю подію форми подання за допомогою jQuery, чи можливо отримати всі поля введення цієї форми в асоціативному масиві?
Відповіді:
$('#myForm').submit(function() {
// get all the inputs into an array.
var $inputs = $('#myForm :input');
// not sure if you wanted this, but I thought I'd add it.
// get an associative array of just the values.
var values = {};
$inputs.each(function() {
values[this.name] = $(this).val();
});
});
Завдяки підказці від Simon_Weaver, ось ще один спосіб, як ви могли це зробити, використовуючи serializeArray:
var values = {};
$.each($('#myForm').serializeArray(), function(i, field) {
values[field.name] = field.value;
});
Зауважте, що цей фрагмент буде невдалим для <select multiple>елементів.
Здається, що нові введення форми HTML 5 не працюють serializeArrayу jQuery версії 1.3. Це працює у версії 1.4+
nameта value. Кращим рішенням може бути обробка результатів з serializeArray в будь-який формат.
<select>елементів? Я спробував, var $inputs = $('#new-ticket :input, :select');але це не працює. Хтось знає правильний спосіб зробити це, тому що я не думаю, що я роблю це правильно.
$("#new-ticket :input, #new-ticket :select"), а ще краще,$(":input, :select", "#new-ticket")
Пізно до партії з цього питання, але це ще простіше:
$('#myForm').submit(function() {
// Get all the forms elements and their values in one step
var values = $(this).serialize();
});
.serialize()( api.jquery.com/serialize ) розміщує всі елементи форми в єдиний рядок, готовий до додавання до URL у рядку запиту, по суті імітуючи запит форми GET. Це не дозволить досягти відповіді нікфа.
.serialize()також працює на елементах просто форми. Так $('form select').serialize()буде серіалізувати дані лише для вибраних.
$('#myForm'), використовуйте $ (це).
Jquery.form плагін може допомогти з тим, що інші шукають , що в кінцевому підсумку на це питання. Я не впевнений, чи це безпосередньо робить те, що ти хочеш чи ні.
Існує також функція serializeArray .
Іноді мені здається, що отримати один за одним корисніше. Для цього є ось що:
var input_name = "firstname";
var input = $("#form_id :input[name='"+input_name+"']");
[0].valueдо цього, тобто $(...)[0].value;дав мені значення вводу безпосередньо, дякую!
Ось ще одне рішення, таким чином ви можете отримати всі дані про форму та використовувати їх у дзвінку на стороні сервера чи щось.
$('.form').on('submit', function( e )){
var form = $( this ), // this will resolve to the form submitted
action = form.attr( 'action' ),
type = form.attr( 'method' ),
data = {};
// Make sure you use the 'name' field on the inputs you want to grab.
form.find( '[name]' ).each( function( i , v ){
var input = $( this ), // resolves to current input element.
name = input.attr( 'name' ),
value = input.val();
data[name] = value;
});
// Code which makes use of 'data'.
e.preventDefault();
}
Потім ви можете використовувати це для дзвінків ajax:
function sendRequest(action, type, data) {
$.ajax({
url: action,
type: type,
data: data
})
.done(function( returnedHtml ) {
$( "#responseDiv" ).append( returnedHtml );
})
.fail(function() {
$( "#responseDiv" ).append( "This failed" );
});
}
Сподіваюсь, це комусь із вас корисно :)
У мене була подібна проблема з невеликим поворотом, і я думав, що я викину це. У мене є функція зворотного виклику, яка отримує форму, тому я вже мав об'єкт форми і не міг прості варіанти $('form:input'). Натомість я придумав:
var dataValues = {};
form.find('input').each(
function(unusedIndex, child) {
dataValues[child.name] = child.value;
});
Схожа, але не тотожна ситуація, але я вважав цю тему дуже корисною, і думав, що я підтягну її до кінця і сподіваюся, що хтось інший знайде її корисною.
Асоціативний? Не обійшлося без певної роботи, але ви можете використовувати загальні селектори:
var items = new Array();
$('#form_id:input').each(function (el) {
items[el.name] = el;
});
jQuery's serializeArrayне включає відключені поля, тому якщо вам вони теж потрібні, спробуйте:
var data = {};
$('form.my-form').find('input, textarea, select').each(function(i, field) {
data[field.name] = field.value;
});
http://api.jquery.com/serializearray/
$('#form').on('submit', function() {
var data = $(this).serializeArray();
});
Це також можна зробити без jQuery, використовуючи об'єкт FormData рівня XMLHttpRequest рівня 2
http://www.w3.org/TR/2010/WD-XMLHttpRequest2-20100907/#the-formdata-interface
var data = new FormData([form])
Не забудьте прапорці та радіо кнопки -
var inputs = $("#myForm :input");
var obj = $.map(inputs, function(n, i) {
var o = {};
if (n.type == "radio" || n.type == "checkbox")
o[n.id] = $(n).attr("checked");
else
o[n.id] = $(n).val();
return o;
});
return obj
Цей фрагмент коду буде працювати замість імені, введіть ім’я полів вашої форми електронною поштою
$(document).ready(function(){
$("#form_id").submit(function(event){
event.preventDefault();
var name = $("input[name='name']",this).val();
var email = $("input[name='email']",this).val();
});
});
Дивно здається, що ніхто не підтримував і не пропонував стислого рішення отримати дані списку. Навряд чи будь-які форми будуть одновимірними об'єктами.
Недоліком цього рішення є, звичайно, те, що вам потрібно буде отримати доступ до ваших одиночних об'єктів за допомогою індексу [0]. Але ІМО - це набагато краще, ніж використання одного із десятків ліній для картографування.
var formData = $('#formId').serializeArray().reduce(function (obj, item) {
if (obj[item.name] == null) {
obj[item.name] = [];
}
obj[item.name].push(item.value);
return obj;
}, {});
Таке ж рішення, що і Nickf , але з врахуванням імен введення масиву, наприклад
<input type="text" name="array[]" />
values = {};
$("#something :input").each(function() {
if (this.name.search(/\[\]/) > 0) //search for [] in name
{
if (typeof values[this.name] != "undefined") {
values[this.name] = values[this.name].concat([$(this).val()])
} else {
values[this.name] = [$(this).val()];
}
} else {
values[this.name] = $(this).val();
}
});
Якщо вам потрібно отримати декілька значень із входів, і ви використовуєте [] для визначення входів з кількома значеннями, ви можете використовувати наступне:
$('#contentform').find('input, textarea, select').each(function(x, field) {
if (field.name) {
if (field.name.indexOf('[]')>0) {
if (!$.isArray(data[field.name])) {
data[field.name]=new Array();
}
data[field.name].push(field.value);
} else {
data[field.name]=field.value;
}
}
});
Натхненний відповідями Ленса Рашінга та Simon_Weaver , це моє улюблене рішення.
$('#myForm').submit( function( event ) {
var values = $(this).serializeArray();
// In my case, I need to fetch these data before custom actions
event.preventDefault();
});
Вихід - це масив об'єктів, наприклад
[{name: "start-time", value: "11:01"}, {name: "end-time", value: "11:11"}]
З наведеним нижче кодом,
var inputs = {};
$.each(values, function(k, v){
inputs[v.name]= v.value;
});
його кінцевий вихід буде
{"start-time":"11:01", "end-time":"11:01"}
Я використовую цей код без кожного циклу:
$('.subscribe-form').submit(function(e){
var arr=$(this).serializeArray();
var values={};
for(i in arr){values[arr[i]['name']]=arr[i]['value']}
console.log(values);
return false;
});
Я сподіваюся, що це корисно, як і найпростіше.
$("#form").submit(function (e) {
e.preventDefault();
input_values = $(this).serializeArray();
});
Коли мені потрібно було здійснити виклик ajax з усіма полями форми, у мене виникли проблеми із : селектором вводу , який повертав усі прапорці, незалежно від того, чи вони були перевірені. Я додав новий селектор, щоб просто отримати елементи форми, які можна подати:
$.extend($.expr[':'],{
submitable: function(a){
if($(a).is(':checkbox:not(:checked)'))
{
return false;
}
else if($(a).is(':input'))
{
return true;
}
else
{
return false;
}
}
});
використання:
$('#form_id :submitable');
Я ще не перевіряв її з декількома полями вибору, але це працює для отримання всіх полів форми таким чином, як стандартне надсилання.
Я використовував це під час налаштування параметрів продукту на сайті OpenCart, щоб включати прапорці та текстові поля, а також стандартний тип вибору.
serialize () - найкращий метод. @ Крістофер Паркер зазначає, що прихильник Нікфа виконує більше, проте він не враховує, що форма може містити текстові області та меню вибору. Набагато краще використовувати serialize (), а потім маніпулювати цим, як потрібно. Дані з serialize () можна використовувати або в публікації в Ajax, або отримувати, тому проблем там немає.
Сподіваюся, це комусь допомагає. :)
// This html:
// <form id="someCoolForm">
// <input type="text" class="form-control" name="username" value="...." />
//
// <input type="text" class="form-control" name="profile.first_name" value="...." />
// <input type="text" class="form-control" name="profile.last_name" value="...." />
//
// <input type="text" class="form-control" name="emails[]" value="..." />
// <input type="text" class="form-control" name="emails[]" value=".." />
// <input type="text" class="form-control" name="emails[]" value="." />
// </form>
//
// With this js:
//
// var form1 = parseForm($('#someCoolForm'));
// console.log(form1);
//
// Will output something like:
// {
// username: "test2"
// emails:
// 0: ".@....com"
// 1: "...@........com"
// profile: Object
// first_name: "..."
// last_name: "..."
// }
//
// So, function below:
var parseForm = function (form) {
var formdata = form.serializeArray();
var data = {};
_.each(formdata, function (element) {
var value = _.values(element);
// Parsing field arrays.
if (value[0].indexOf('[]') > 0) {
var key = value[0].replace('[]', '');
if (!data[key])
data[key] = [];
data[value[0].replace('[]', '')].push(value[1]);
} else
// Parsing nested objects.
if (value[0].indexOf('.') > 0) {
var parent = value[0].substring(0, value[0].indexOf("."));
var child = value[0].substring(value[0].lastIndexOf(".") + 1);
if (!data[parent])
data[parent] = {};
data[parent][child] = value[1];
} else {
data[value[0]] = value[1];
}
});
return data;
};
Усі відповіді хороші, але якщо в цій функції є поле, яке ви хочете ігнорувати? Легко, надайте поле властивість, наприклад ignore_this:
<input type="text" name="some_name" ignore_this>
І у вашій функції серіалізації:
if(!$(name).prop('ignorar')){
do_your_thing;
}
Ось так ви ігноруєте деякі поля.
$('.mandatory');і!$('.mandatory');
ignore_thisщоб data-ignore-this="true"замість того , щоб створювати свої власні атрибути , які не перевіряють w
Спробуйте наступний код:
jQuery("#form").serializeArray().filter(obje =>
obje.value!='').map(aobj=>aobj.name+"="+aobj.value).join("&")
Для декількох елементів вибору ( <select multiple="multiple">) я змінив рішення від @Jason Norwood-Young, щоб він працював.
Відповідь (як розміщено) приймає значення лише з першого вибраного елемента, а не з усіх . Він також не ініціалізував і не повертавсяdata , колишня помилка вкидання JavaScript.
Ось нова версія:
function _get_values(form) {
let data = {};
$(form).find('input, textarea, select').each(function(x, field) {
if (field.name) {
if (field.name.indexOf('[]') > 0) {
if (!$.isArray(data[field.name])) {
data[field.name] = new Array();
}
for (let i = 0; i < field.selectedOptions.length; i++) {
data[field.name].push(field.selectedOptions[i].value);
}
} else {
data[field.name] = field.value;
}
}
});
return data
}
Використання:
_get_values($('#form'))
Примітка. Вам потрібно просто переконатися, що nameваш вибір був []доданий до кінця, наприклад:
<select name="favorite_colors[]" multiple="multiple">
<option value="red">Red</option>
<option value="green">Green</option>
<option value="blue">Blue</option>
</select>