“push”不是[getElementsByTagName返回的元素]的函数

时间:2010-12-16 22:14:35

标签: javascript html arrays dom

我有一些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]未定义的错误。这可能是显而易见的,但我没有看到它。帮助

3 个答案:

答案 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);