"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:通知设置中只有“徽章”而不是“徽章、声音、横幅”

JS中push的用法

将“push_back”用于带有“get”函数C++的向量

汇编里的"PUSH"和"POP"起了啥功能,,谁能用通俗点的话告诉我吗??

剑指Offer面试题59 - II. 队列的最大值

js数组操作(添加、删除、替换元素)