Ответ 1
Не думайте, что вам нужны цитаты по этому поводу:
var child = $("this");
попробовать:
var child = $(this);
Я хочу перебрать элементы HTML-формы и сохранить значения <input> поля в объекте. Следующий код не работает:
function config() {
$("#frmMain").children().map(function() {
var child = $("this");
if (child.is(":checkbox"))
this[child.attr("name")] = child.attr("checked");
if (child.is(":radio, checked"))
this[child.attr("name")] = child.val();
if (child.is(":text"))
this[child.attr("name")] = child.val();
return null;
});
Также не выполняется следующее (вдохновленное ответом на работу):
function config() {
$("#frmMain").children().each(function() {
var child = $("this");
alert(child.length);
if (child.is(":checkbox")) {
this[child.attr("name")] = child.attr("checked");
}
if (child.is(":radio, checked"))
this[child.attr("name")] = child.val();
if (child.is(":text"))
this[child.attr("name")] = child.val();
});
}
Предупреждение всегда показывает, что child.length == 0
. Ручной выбор элементов работает:
>>> $("#frmMain").children() Object length=42 >>> $("#frmMain").children().filter(":checkbox") Object length=3
Любые намеки на правильность выполнения цикла?
Не думайте, что вам нужны цитаты по этому поводу:
var child = $("this");
попробовать:
var child = $(this);
jQuery имеет отличную функцию для циклического набора элементов: . each()
$('#formId').children().each(
function(){
//access to form element via $(this)
}
);
В зависимости от того, что вам нужно для каждого ребенка (если вы хотите разместить его где-нибудь через AJAX), вы можете просто сделать...
$("#formID").serialize()
Он создает строку для вас со всеми значениями автоматически.
Как и для прокрутки объектов, вы также можете сделать это.
$.each($("input, select, textarea"), function(i,v) {
var theTag = v.tagName;
var theElement = $(v);
var theValue = theElement.val();
});
Я использовал следующее:
var my_form = $('#form-id');
var data = {};
$('input:not([type=checkbox]), input[type=checkbox]:selected, select, textarea', my_form).each(
function() {
var name = $(this).attr('name');
var val = $(this).val();
if (!data.hasOwnProperty(name)) {
data[name] = new Array;
}
data[name].push(val);
}
);
Это просто записано из памяти, поэтому может содержать ошибки, но это должно сделать объект с именем data
, который содержит значения для всех ваших входов.
Обратите внимание, что вам нужно иметь дело с флажками особым образом, чтобы избежать получения значений непроверенных флажков. То же самое, вероятно, относится к радиовходам.
Также обратите внимание на использование массивов для хранения значений, как для одного имени ввода, у вас могут быть значения с нескольких входов (в частности, флажки).
если вы хотите использовать каждую функцию, она должна выглядеть так:
$('#formId').children().each(
function(){
//access to form element via $(this)
}
);
Просто выключите закрывающуюся фигурную скобку для закрытого паттерна. Спасибо, что указали это, jobscry, вы спасли меня некоторое время.
для меня все это не сработало. То, что сработало для меня, было чем-то очень простым:
$("#formID input[type=text]").each(function() {
alert($(this).val());
});
Это самый простой способ прокрутки формы, получающей доступ только к элементам формы. Внутри каждой функции вы можете проверять и строить все, что хотите. При создании объектов обратите внимание, что вы захотите объявить его за пределами каждой функции.
ИЗМЕНИТЬ JSFIDDLE
Ниже будет работать
$('form[name=formName]').find('input, textarea, select').each(function() {
alert($(this).attr('name'));
});