Область видимости переменной jQuery в каждом - PullRequest
5 голосов
/ 17 мая 2011

Я пытаюсь создать массив, содержащий все значения каждого элемента формы.Оповещение работает, просто найдите, но в файле console.log пусто, я не понимаю, как работает область видимости в JavaScript?

Ответы [ 5 ]

8 голосов
/ 17 мая 2011

Следует знать, что Array в JavaScript может иметь только положительные целочисленные индексы (которые действительно обрабатываются как строки).

Когда вы назначаете строку ключу, вы назначаете свойствана Object.

Вы, вероятно, хотите что-то вроде этого ...

var data = {};
$("#page2 input").each(function() {
   data[this.id] = this.value;
});

jsFiddle .

Если вы хотели просто id атрибуты.

var data = $("#page2 input").map(function() { 
               return this.id;
           }).get();

jsFiddle .

1 голос
/ 17 мая 2011

Ваш вопрос был:

... все значения каждого элемента формы ...

, но ваш селектор был только для элементов ввода в одной конкретной форме,Предполагая, что вы на самом деле хотели получить значения всех элементов управления в форме, тогда могут подойти следующие POJS:

function getFormValues(formId) {
  var data = {};
  var form = document.getElementById(formId);

  if (form) {
    var control, controls = form.elements;

    if (controls) {
      var i = controls.length;

      while (i--) {
        control = controls[i];
        data[control.id] = control.value;
      }
    }
  } 
  return data;
}

Предполагается, что у каждого элемента управления есть идентификатор, что не является обязательным требованием.Если некоторые элементы управления не имеют идентификатора, вы можете вместо этого использовать свойство name, поэтому:

        data[control.id || control.name] = control.value;

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

        var idOrName = control.id || control.name;
        if (idOrName) {
          data[idOrName] = control.value;
        }

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

1 голос
/ 17 мая 2011

Объем правильный. Если консоль не отображает значения entires в массиве, то я предполагаю, что ваши атрибуты ID не являются числовыми.

Не означает, что данных там нет. Просто означает, что консоль предпочитает отображать только числовые индексы.

Рассмотрим следующий ввод в консоль Chrome:

var arr = new Array();
arr['test'] = 'test';

arr;  // []
arr.test;  // 'test'

Несмотря на то, что допустимым является JavaScript для передачи нечислового свойства в массив, в большинстве случаев это неправильный подход.

1 голос
/ 17 мая 2011

Вы пытаетесь создать объект (new Object() или { }), а не массив.

0 голосов
/ 17 мая 2011

Если вы используете входной идентификатор в качестве ключа, то вы создаете объект, а не массив.

var data = new Object();
...