3

今日、Firefox の Javascript で奇妙な問題が発生しています。

いくつかのテーブル行を操作しようとしていますが、.getElementsByTagName("tr");がらくたを引き戻しています。

dynamicTable.tableBody = dynamicTable.getElementsByTagName("tbody")[0];
var tableRows = dynamicTable.tableBody.getElementsByTagName("TR");
var actualTableRows = new Array();
for(var i in tableRows) {
    var row = tableRows[i];
    alert(row.tagName);
    if(row.tagName == "TR"){
       actualTableRows.push(row);
    }
}
dynamicTable.bodyRows = actualTableRows;

もちろん不可解な部分は、エラーを修正するための一時的なハックです。何らかの理由.getElementsByTagName("tr")で、いくつかの機能も引き戻されています。

ちなみに、上記のアラートは「TR TR TR TR undefined undefined undefined」のようになります。

私が欲しかったコードはこのようなものでした

dynamicTable.bodyRows = dynamicTable.tableBody.getElementsByTagName("tr");

しかし、要素bodyrowsだけが含まれているわけではなく<tr>、前述のがらくたが含まれています。

何かご意見は?

編集:コードの 2 番目のブロックを使用すると、21 個のテーブル行 (tr 要素) を持つテーブルで 24 要素の長さのリストが得られます。コードの最初のブロックは、問題を修正する単なるハックです。

アラートを次のように変更すると、次のようalert(row)になります。

[object HTMLTableRowElement]
...

function item() {
    [native code]
}

21

function namedItem() {
    [native code]
}
4

1 に答える 1

8

このfor-inステートメントは、返されるHTMLCollectionに存在するitemandnamedItemメソッドも列挙しています。getElementsByTagName

DOM コレクションのような配列のような要素を反復for...inするには、単純な順次ループが常に推奨されます。このステートメントは、オブジェクト プロパティを列挙するために使用することを意図しています。

dynamicTable.tableBody = dynamicTable.getElementsByTagName("tbody")[0];
var tableRows = dynamicTable.tableBody.getElementsByTagName("TR");
var actualTableRows = new Array();
for(var i = 0, n = tableRows.length; i < n; i++) { // <---- simple for loop
    var row = tableRows[i];
    alert(row.tagName);
    if(row.tagName == "TR"){
       actualTableRows.push(row);
    }
}
dynamicTable.bodyRows = actualTableRows;

for..in次の理由により、配列のようなオブジェクトでは使用しないでください。

  • 反復の順序は保証されません。配列インデックスは数値順にアクセスされない場合があります。
  • 継承されたプロパティも列挙されます (これが別の問題の原因になる可能性があります)。

推奨記事:

于 2010-06-16T18:41:57.740 に答える