我有一些Javascript,我用XMLHttpRequest发布我的表单,否则工作正常,但当我尝试将SELECT值添加到INPUT值数组时,似乎Javascript已经失去了理智(或者我有)。
此函数只构建“name1 = value1& name2 = value2”字符串并将其传递。
代码:
function sendTheForm() {
var postData = '';
var inputArr = document.getElementsByTagName('input');
if (inputArr.hasOwnProperty(length)) alert("ARRAY!!");
var selects = document.getElementsByTagName('select');
var tmpObj = new Object();
for (var i = 0; i < selects.length; i++) {
tmpObj.name = selects[i].name;
tmpObj.value = selects[i].value;
inputArr.push(tmpObj);
}
for (var i = 0; i < inputArr.length; i++) {
if (inputArr[i].value) {
if (postData.length) postData += '&';
postData += inputArr[i].name;
postData += '=';
postData += escape(inputArr[i].value);
}
}
makeHttpReq(postData)
}
我在FireFox中遇到的错误是:“inputArr.push is not a function
”它确实说它是一个数组。
现在,除了它是一种方法(不是一种功能)之外,这里似乎有些严重错误,它在我的鼻子底下,我看不到它。帮助
早些时候,我尝试过:
len = inputArr.length;
inputArr[len].name = ...
并且还得到inputArr [31]未定义的错误。这可能是显而易见的,但我没有看到它。帮助
答案 0 :(得分:6)
拥有.length
属性并不意味着它是一个数组。 getElementsByTagName()
会返回DOM 2 NodeList,而不是Array。
答案 1 :(得分:4)
正如Phrogz所说,检查length
属性 NOT 是一种检查数组的方法。
只有一种方法可以做到这一点,所以它适用于所有个案。
那就是使用Object.prototype.toString.call(object).slice(8, -1)
。
它为您提供了Class值。
Value Class Type
-------------------------------------
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object
答案 2 :(得分:2)
这不起作用的原因是因为inputArr
变量实际上是一个节点列表,而不是真正的数组。
如果你确实希望它是一个数组,你可以遍历它并将其中的所有节点添加到一个真正的数组中,或者你可以这样做:
var node_array = Array.prototype.slice.call(node_list);