“push” 不是 [getElementsByTagName 返回的元素上的] 函数
2010-12-16
7374
我使用了一些 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 不是函数
”它确实说它是一个数组。
现在,除了它是一个方法(而不是一个函数)之外,似乎这里出了什么大问题,它就在我眼皮底下,我却看不到。需要帮助吗?
之前,我尝试执行:
len = inputArr.length;
inputArr[len].name = ...
,还收到一个错误,提示 inputArr[31] 未定义。这可能很明显,但我没有看到。需要帮助吗?
3个回答
具有
.length
属性并不意味着它是一个数组。
getElementsByTagName()
返回
DOM 2 NodeList
,而不是
Array
。
Phrogz
2010-12-16
正如 Phrogz 所说,检查
length
属性
不是
检查数组的一种方式。
只有一种方法可以做到这一点,因此它在 所有 情况下都有效。
那就是使用
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
Ivo Wetzel
2010-12-16
此方法无效的原因是
inputArr
变量实际上是一个节点列表,而不是一个真正的
数组
。
如果您确实希望它是一个数组,则可以循环遍历它并将其中的所有节点添加到一个真正的数组中,或者您可以执行以下操作:
var node_array = Array.prototype.slice.call(node_list);
Jacob Relkin
2010-12-16