Подтвердить что ты не робот

Зацикливание элементов в jQuery

Я хочу перебрать элементы 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

Любые намеки на правильность выполнения цикла?

4b9b3361

Ответ 1

Не думайте, что вам нужны цитаты по этому поводу:

var child = $("this");

попробовать:

var child = $(this);

Ответ 2

jQuery имеет отличную функцию для циклического набора элементов: . each()

$('#formId').children().each(
    function(){
        //access to form element via $(this)
    }
);

Ответ 3

В зависимости от того, что вам нужно для каждого ребенка (если вы хотите разместить его где-нибудь через AJAX), вы можете просто сделать...

$("#formID").serialize()

Он создает строку для вас со всеми значениями автоматически.

Как и для прокрутки объектов, вы также можете сделать это.

$.each($("input, select, textarea"), function(i,v) {
    var theTag = v.tagName;
    var theElement = $(v);
    var theValue = theElement.val();
});

Ответ 4

Я использовал следующее:

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, который содержит значения для всех ваших входов.

Обратите внимание, что вам нужно иметь дело с флажками особым образом, чтобы избежать получения значений непроверенных флажков. То же самое, вероятно, относится к радиовходам.

Также обратите внимание на использование массивов для хранения значений, как для одного имени ввода, у вас могут быть значения с нескольких входов (в частности, флажки).

Ответ 5

если вы хотите использовать каждую функцию, она должна выглядеть так:

$('#formId').children().each( 
  function(){
    //access to form element via $(this)
  }
);

Просто выключите закрывающуюся фигурную скобку для закрытого паттерна. Спасибо, что указали это, jobscry, вы спасли меня некоторое время.

Ответ 6

для меня все это не сработало. То, что сработало для меня, было чем-то очень простым:

$("#formID input[type=text]").each(function() {
alert($(this).val());
});

Ответ 7

Это самый простой способ прокрутки формы, получающей доступ только к элементам формы. Внутри каждой функции вы можете проверять и строить все, что хотите. При создании объектов обратите внимание, что вы захотите объявить его за пределами каждой функции.

ИЗМЕНИТЬ JSFIDDLE

Ниже будет работать

$('form[name=formName]').find('input, textarea, select').each(function() {
    alert($(this).attr('name'));
});