Javascript jQuery变量范围在每个

Javascript jQuery变量范围在每个,javascript,jquery,foreach,scope,each,Javascript,Jquery,Foreach,Scope,Each,我试图构建一个数组,其中包含每个表单元素的所有值。警报只在查找时起作用,但在console.log数据为空时,我是否无法理解javascript中的作用域是如何工作的 var data = new Array(); $("#page2 input").each(function(index) { alert($(this).attr('id')); data[$(this).attr('id')] = $(this).val(); }); 非常感谢您的时间,

我试图构建一个数组,其中包含每个表单元素的所有值。警报只在查找时起作用,但在console.log数据为空时,我是否无法理解javascript中的作用域是如何工作的

  var data = new Array();
  $("#page2 input").each(function(index) {
      alert($(this).attr('id'));
      data[$(this).attr('id')] = $(this).val();
  });

非常感谢您的时间,

您试图创建一个对象(
newobject()
{}
),而不是一个数组。

需要知道的一点是,JavaScript中的
数组
只能具有正整数索引(实际上被视为字符串)

将字符串指定给键时,就是将属性指定给
对象

你可能想要这样的东西

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

如果只需要
id
属性

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

.

如果将输入id用作键,则创建的是对象,而不是数组

var data = new Object();

范围是正确的。如果控制台没有在数组中显示entires,那么我猜您的ID属性不是数字

这并不意味着数据不存在。这仅仅意味着控制台选择只显示数字索引

考虑Chrome控制台的以下输入:

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

arr;  // []
arr.test;  // 'test'
虽然将非数值属性赋予数组是有效的JavaScript,但在大多数情况下,这是错误的方法。

您的问题是:

…每个表单元素的所有值

但选择器仅用于一种特定形式的输入元素。假设您确实需要表单中所有控件的值,那么以下POJ可能适合:

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;
}
假设每个控件都有一个ID,这不是必需的。如果某些控件没有id,您可能希望改用name属性,因此:

        data[control.id || control.name] = control.value;
在某些情况下,您的控件可能没有id或名称(例如表单需要但不提交其值的控件,如提交和重置按钮),因此:


您可能还需要处理具有相同名称的控件,因为最后访问的控件的值将替换以前同名控件的值。

编写效率更高:
this.id
this.value
。感谢,特别是第二部分,看起来很有趣!我必须立即停止编程两种语言(PHP/Javascript),这会导致混乱!
        var idOrName = control.id || control.name;
        if (idOrName) {
          data[idOrName] = control.value;
        }