2014-01-28 5 views
2

У меня есть форма, и я пытаюсь создать для нее выборочную проверку, итерации по элементам и делать все, что нужно сделать.

Это мой JS код до сих пор

$('#createClient').click(function (event) { 
    var formData = { 
     'clientbrandname': $("#createClientBrand").val(), 
     'surveyReferral': $("#createSurveyReferral").val(), 
     'GuestReferral': $("#createGuestReferral").val(), 
     'email': $("#createInviteEmail").val(), 
     'phone': $("#createPhoneNumber").val(), 
     'xampAccNumber': $('#createUserLimit').val(), 
     'logo': $('#createClientLogo').val(), 
     'Template': $('#createRefPage').val(), 
     'xampClient': $('#createAmplifierClient').val(), 
     'xampActive': $('#createAmpMembership').val(), 
     'sReferralID': $('#sReferralID').val(), 
     'gReferralID': $('#gReferralID').val() 
    }; 

    $(formData).each(function() { 
     alert($(this).val()); 
    }); 

}); 

С помощью этого кода я бегу в ошибку (i.nodeName is undefined), который я подозреваю, исходит из той части, где я пытаюсь использовать $(this).val()

Любой может предложить решение этой проблемы?

ответ

3

Вы повторяете объект. Поэтому вам нужно вызвать пар имя в функции. Функция

в $ .each() не является такой же, как $ (селектор) .each(), который используется для итерацию, исключительно, через объект JQuery. Функция $ .each() может использоваться для итерации по любой коллекции, будь то объект или массив.

JsFiddle

$.each(formData, function(name, value) { 
     alert(name); //Alerts clientbrandname 
     alert(value); //Alerts the value from "$("#createClientBrand").val()" 
    }); 
+0

Это правильный ответ, gj! – Mike

+1

На самом деле он оповещает 0 и [объект объекта], а затем выходит – Geo

+0

попробуйте сейчас ........ – KingKongFrog

2

То, что вы действительно хотите это:

$.each(formData, function(key, value) { 
    // ... 
}); 

Функция $ как в $(...) ожидает node или массив узлов. Затем возвращаемый объект имеет метод #each, который выполняет итерацию по узлам.

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

Объект в JavaScript может вести себя как массив для этой цели.

Теперь интересно, вы считали, что используете serializeArray?

+2

Было бы более полезным для читателя, если бы вы объяснили, почему именно это он действительно хотел. – crush

+1

Вы также ухудшили читаемость кода, используя $ .each вместо $ (formData) .each ... – Mike

+0

Вы также не объяснили, как правильно использовать это, чтобы выполнить то, что желает читатель. – crush

2

Ссылаясь на jQuery документы, расположенных HERE, он утверждает

обобщенную функцию итератора, который может быть использован, чтобы плавно итерацию над обоими объектами и массивами. Массивы и объекты типа массива с свойством length (например, объект аргументов функции) повторяются с помощью числового индекса от 0 до длины-1. Другие объекты повторяются через их именованные свойства.

Вы пытаетесь использовать это на associative array, который не может быть заменен цифровым индексом.

Следующая вытягивается со страницы jQuery DOCS отмечено выше ..

var obj = { one: 1, two: 2, three: 3, four: 4, five: 5 }; 
$.each(obj, function(i, val) { 
    $("#" + i).append(document.createTextNode(" - " + val)); 
}); 
+0

В JavaScript нет классов. – crush

+0

Правда, это ассоциативный массив. Дело в том, что он по-прежнему не может быть повторен с помощью числового индекса. – Kevin

+0

Ассоциативный массив - это терминология PHP для «Карты», которая использует хэш-алгоритм для ключа. Это объект JavaScript. – crush

2

Когда вы передаете свой объект JavaScript конструктору JQuery ($(...)) вы создаете экземпляр объекта JQuery.Этот экземпляр имеет свойство length, что заставляет объект действовать array-like.

Согласно документации JQuery для $.each,

Массивы и массив подобных объектов с свойством длины (такие как аргументов функции объекта) повторяются с помощью числового индекса, от 0 до длины-1 ,

Это решение не будет работать для вас, потому что у вас нет числовых индексов.

Вместо этого вам нужно использовать другой вид функции $.each, которую можно увидеть ниже:

//Just a generic representation of your JavaScript object. 
var obj = { 
    myKey: 'myValue' 
}; 

$.each(obj, function (key, value) { 
    console.log(key); //Outputs 'myKey' 
    console.log(value); //Outputs 'myValue' 
}); 

Здесь obj еще не был превращен в объект JQuery, прежде чем итерация над ним. Он не имеет свойства length, поэтому он не будет рассматриваться как массив. Теперь имя свойства будет отправлено в функцию обратного вызова в качестве первого параметра, а значение свойства будет отправлено в качестве второго параметра.

Смежные вопросы