2010-12-16 5 views
2

XMLHttpRequest를 사용하여 양식을 게시하는 자바 스크립트가 있습니다. XMLHttpRequest를 사용하면 정상적으로 작동하지만 양식에 SELECT 값을 추가하려고하면 INPUT 값 배열, Javascript가 마음을 잃어 버렸습니다 (또는 가지고있는 것 같습니다)."push"는 함수가 아닙니다 [getElementsByTagName에 의해 반환 된 요소에]

이 함수는 "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) 
    } 

: "inputArr.push is not a function는"그것은 배열 말할 않습니다.

이제는 (함수가 아닌) 메서드라는 사실 외에도, 여기에 잘못되어있는 것 같아요. 내 코 바로 아래에 있고 볼 수 없습니다. 도움?

이전, 나는 일을 시도 :

len = inputArr.length; 
    inputArr[len].name = ... 

을 또한 inputArr [31] 정의되지 않은 것을 오류를 얻었다. 이것은 아마 분명하지만, 나는 그것을 보지 않을거야. 도움?

+0

안녕하세요 - 나는 당신을 위해 그것을 수정 한하지만 당신은 코드를 게시 할 때 그것을 선택하고 두 번째 질문에 대해 편집기 (101010 버튼)에 –

+0

을 코드 블록 버튼을 눌러 도움이 : 마지막 항목을 배열에 자바 스크립트 배열은 0부터 시작하여 인덱스되기 때문에 항상 myArray [myArray.length-1]입니다. – Phrogz

+0

배열은 객체이지만 객체는 배열이 아닙니다. – Gumbo

답변

6

속성이 .length 인 것은 그것이 배열임을 의미하지 않습니다. getElementsByTagName()Array이 아닌 DOM 2 NodeList을 반환합니다.

+1

정확합니다. NodeList는 ** Array와 비슷하지만별로 좋지 않습니다 .- – scunliffe

+0

Crockford의 "치료 용 자바 스크립트"에 더주의를 기울여야합니다. 나는 그게 그런 것임을 알았지 만, 어떻게 든 그것을 보지 못했습니다. 당연하지. 감사! – Jeffiekins

2

inputArr 변수가 실제로 노드 목록이고 배열이 아니기 때문에 이것이 작동하지 않는 이유가 있습니다. 당신이 배열되고 싶은 경우

, 당신은 그것을 통해 루프를 거라고 진짜 배열에 모든 노드를 추가하거나이 작업을 수행 할 수 있습니다

var node_array = Array.prototype.slice.call(node_list); 
4

Phrogz 이미 확인, 말했듯 length 속성의 경우 NOT 배열을 확인하는 방법입니다.

한 가지 방법 만 있으므로 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 
+0

호기심에서, 어떤 경우에'a.constructor == Array'가 실패합니까? 'constructor' 속성이 특별히 할당되었을 때만, 또는 이것이 신뢰되어서는 안되는 일반적인 상황이 있습니까? – Phrogz

+0

예를 들어, 배열이 다른 문서 (예 : 열린 창 또는 iframe)에서 온 경우, 이는 해당 JS 컨텍스트에서 실행되기 때문에 실패 할 수 있습니다. –

+0

아, 좋은 지적이야. 감사. – Phrogz

관련 문제