我正在尝试构建一个包含每个表单元素的所有值的数组。警报只能找到,但在console.log数据为空时,我是否无法理解javascript中的作用域如何工作?
var data = new Array();
$("#page2 input").each(function(index) {
alert($(this).attr('id'));
data[$(this).attr('id')] = $(this).val();
});
非常感谢你的时间,
答案 0 :(得分:8)
要知道的是,JavaScript中的Array
只能有正整数索引(实际上它们被视为字符串)。
为密钥分配字符串时,您要将属性分配给Object
。
你可能想要这样的......
var data = {};
$("#page2 input").each(function() {
data[this.id] = this.value;
});
如果您只想要id
属性。
var data = $("#page2 input").map(function() {
return this.id;
}).get();
答案 1 :(得分:1)
您正在尝试制作对象(new Object()
或{ }
),而不是数组。
答案 2 :(得分:1)
范围是正确的。如果控制台没有在数组中显示entires,那么我猜你的ID属性不是数字。
并不意味着数据不存在。只是意味着控制台选择只显示数字索引。
考虑Chrome控制台中的以下输入:
var arr = new Array();
arr['test'] = 'test';
arr; // []
arr.test; // 'test'
虽然为数组提供非数字属性是有效的JavaScript,但在大多数情况下,这是错误的方法。
答案 3 :(得分:1)
你的问题是:
...每个表单元素的所有值......
但您的选择器仅适用于某种特定形式的输入元素。假设您确实想要表单中所有控件的值,那么以下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;
}
您可能还需要处理具有相同名称的控件,因为最后访问的控件的值将替换先前同名控件的值。
答案 4 :(得分:0)
如果您使用输入ID作为键,那么您创建的是Object,而不是Array。
var data = new Object();