Цикл по элементам в jQuery - PullRequest
27 голосов
/ 04 октября 2008

Я хочу перебрать элементы HTML-формы и сохранить значения полей в объекте. Однако следующий код не работает:

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;
    });

Ничего не делает (вдохновлено ответом jobscry):

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

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

Ответы [ 7 ]

40 голосов
/ 04 октября 2008

не думаю, что вам нужны цитаты по этому вопросу:

var child = $("this");

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

var child = $(this);
28 голосов
/ 04 октября 2008

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

$('#formId').children().each(
    function(){
        //access to form element via $(this)
    }
);
13 голосов
/ 04 октября 2008

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

$("#formID").serialize()

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

Что касается циклического перемещения по объектам, вы также можете сделать это.

$.each($("input, select, textarea"), function(i,v) {
    var theTag = v.tagName;
    var theElement = $(v);
    var theValue = theElement.val();
});
3 голосов
/ 04 октября 2008

Ранее я использовал следующее:

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

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

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

0 голосов
/ 27 марта 2013

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

EDIT JSFIDDLE

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

$('form[name=formName]').find('input, textarea, select').each(function() {
    alert($(this).attr('name'));
});
0 голосов
/ 16 января 2013

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

$("#formID input[type=text]").each(function() {
alert($(this).val());
});
0 голосов
/ 09 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...