繁体   English   中英

每个jQuery变量范围

[英]jQuery variable scope within each

我正在尝试构建一个包含每个表单元素的所有值的数组。 警报只能找到,但在console.log数据是空的,我不明白javascript中的作用域是如何工作的?

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

非常感谢你的时间,

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

将字符串分配给键时,您将为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

您正在尝试创建一个对象new Object(){ } ),而不是数组。

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

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

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

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

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

虽然为数组提供非数字属性是有效的JavaScript,但在大多数情况下这是错误的方法。

你的问题是:

...每个表单元素的所有值...

但您的选择器仅适用于某种特定形式的输入元素。 假设您实际上想要表单中所有控件的值,那么以下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;
}

假设每个控件都有一个ID,这不是必需的。 如果某些控件没有id,则可能需要使用name属性,因此:

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

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

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

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

如果您使用输入id作为键,那么您创建的是Object,而不是Array。

var data = new Object();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM