"push" 不是函数 [在 getElementsByTagName 返回的元素上]
Posted
技术标签:
【中文标题】"push" 不是函数 [在 getElementsByTagName 返回的元素上]【英文标题】:"push" is not a function [on elements returned by getElementsByTagName] 【发布时间】:2011-05-26 20:06:46 【问题描述】:我有一点 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] 未定义。这可能很明显,但我没有看到。帮忙?
【问题讨论】:
嗨 - 我已经为你修改了它,但是当你发布代码时,选择它并按下编辑器中的代码块按钮(101010 按钮)会很有帮助 第二个问题:数组中的最后一项总是myArray[ myArray.length-1 ]
,因为 JavaScript 数组的索引从 0 开始。
数组是对象,但对象不是数组。
哦,我必须从 sstatic.net 启用 Javascript,右边有按钮和方向。 (有时 NoScript 很痛苦。)
Phrogz - 对于第二个 Q,我试图向“数组”添加一个元素。如果它是一个数组,我认为它会工作得很好。由于 NodeLists 不允许添加,所以没有运气。
【参考方案1】:
拥有.length
属性并不意味着它是一个数组。 getElementsByTagName()
返回 DOM 2 NodeList,而不是 Array。
【讨论】:
正确,NodeList 类似于一个数组,但不完全是 ;-) 我想我应该更多地关注 Crockford 的“补救 Javascript”。我知道它是那样的东西,但不知何故没有看到它。很明显,现在。谢谢!【参考方案2】:正如 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
【讨论】:
出于好奇,a.constructor == Array
在什么情况下会失败?仅当 constructor
属性已被专门分配时,或者是否存在不应信任的常见情况?
这可能会失败,例如当数组来自另一个文档时,比如您打开的窗口或 iframe,因为它在它自己的 JS 上下文中运行。【参考方案3】:
这不起作用的原因是因为inputArr
变量实际上是一个节点列表,而不是一个真正的数组。
如果您确实希望它是一个数组,您可以循环遍历它并将其中的所有节点添加到一个真正的数组中,或者您可以这样做:
var node_array = Array.prototype.slice.call(node_list);
【讨论】:
以上是关于"push" 不是函数 [在 getElementsByTagName 返回的元素上]的主要内容,如果未能解决你的问题,请参考以下文章
Meteor raix:push:通知设置中只有“徽章”而不是“徽章、声音、横幅”