2011-07-18 7 views
1

I次のJavaScriptコードを持っている:javascript配列プッシュ問題

var objectArray = []; 
var allInputObjects = []; 
var allSelectObjects = []; 
var allTextAreaObjects = []; 

//following returns 3 objects 
allInputObjects = document.getElementById("divPage0").getElementsByTagName("INPUT"); 

//following returns 1 object 
allSelectObjects = document.getElementById("divPage1").getElementsByTagName("SELECT"); 

//following returns 0 objects 
allTextAreaObjects = document.getElementById("divPage2").getElementsByTagName("TEXTAREA"); 

//and following statement does not work 
objectArray = allInputObjects.concat(allSelectObjects); 

をそして、私の問題は、最後の行がエラーを投げているということです。

Firefoxで上記のコードを試しましたが、allInputObjects.concatは機能ではありません。

私はスクリプトがallInputObjectsを配列として扱っていないと信じています!

ご協力いただければ幸いです。

答えて

4

getElementsByTagNameの結果に基づいて動作するように配列を作成することができます一つの方法だが、それはすべてのそれらのプロトタイプの機能をサポートしていないことを除いてArrayに似ている、NodeListを返します。

var arr = Array.prototype.slice.call(somenodelist, 0); 

arrはほとんどそれが今Arrayプロトタイプ関数はconcatように、サポートしていることを除いて、同一であろう:シームレスアレイ、使用中にそのようなアレイのようなオブジェクトを変換する

何の機能が実際に行うことは、インデックス0からとした後、正確なすべてのものであることを、somenodelistの要素を含む部分Arrayを返しています。明らかに、これはすべての要素にすぎません。したがって、これは配列のようなオブジェクトを実際のArrayに変換するトリックです。

+0

+1には問題の実際の解決策が含まれています( 'NodeList'を配列に戻す変換)。 –

+1

ネイティブECMAScript関数に渡されたときにホストオブジェクトが動作することは期待できません。この場合、IE <9(少なくとも)は失敗します。 – RobG

+0

@RobG:本当ですか?私はjQueryも '.toArray'関数でこの関数を利用していると思います。 – pimvdb

4

なぜallSelectObjectsアレイですか?

最初は空の配列に割り当てられています。しかしそれは、ライン6(ish)のgetElementsByTagNameコールによって上書きされます。 Javascriptの変数は厳密に型付けされていないので、最初の代入で後で代入を配列にする必要はありません。

最後の行を呼び出すときに、変数に配列ではなくNodeListまたはそれに類するものがあると思われます。 (これはFirefoxの場合はreturned by the methodです。)

3

Andezejが指摘しているように、あなたはここで配列を扱っていないので、あなたは一種のノードリストを扱っています。

ここでは、getElementsByTagName

 var tags = obj.getElementsByTagName('input'); 
     for (var j=0;j<tags.length;j++) { 
      resultArray.push(tags[j]); 
     } 
+0

+1これは、変換する最善の方法ですNodeListを配列に追加します。 – RobG

1

配列にごNodeListを変換するだけで別の面白い方法:あなたがArray.prototypeにメソッドを追加する場合、今

var tags = obj.getElementsByTagName('input'), 
    tags2Arr = ( 
      function toArr(i){ 
      return i ? toArr(i-1).concat(tags[i]) : [tags[0]]; 
      }(tags.length-1) 
    ); 

Array.prototype.clone = function() { 
    var arr = this; 
    return (function clone(i){ 
    return i ? clone(i-1).concat(arr[i]) : [arr[0]]; 
    })(this.length-1); 
}; 

あなたが使用して、配列にNodeListを変換することができますこのオンライナー:

Array.prototype.clone.call(obj.getElementsByTagName('input')); 
関連する問題