开发者问题收集

“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