«push» не является функцией [для элементов, возвращаемых getElementsByTagName] - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть немного 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 ]

6 голосов
/ 17 декабря 2010

Наличие свойства .length не означает, что это массив. getElementsByTagName() возвращает DOM 2 NodeList , а не Array .

4 голосов
/ 17 декабря 2010

Как уже сказал Phrogz, проверка свойства length является НЕ способом проверки массива.

Есть только один способ сделать это, поэтому он работает в ALL случаях.

И это использует Object.prototype.toString.call(object).slice(8, -1).

Что дает вам значение класса.

  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 голосов
/ 17 декабря 2010

Причина, по которой это не работает, заключается в том, что переменная inputArr на самом деле является списком узлов, а не реальным массивом .

Если вы хотите, чтобы это был массив, вы бы перебрали его и добавили все узлы в нем в реальный массив, или вы можете сделать это:

var node_array = Array.prototype.slice.call(node_list); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...