2

この単純なコードについて、非常に多くのフォーラム投稿を調べました。そして、何も機能せずに多くのバリエーションと方法を試しました。

データベースクエリに基づいてテーブルを作成するスクリプトがあります。結果を10に制限し、データベースから他の結果に移動するための進むボタンと戻るボタンを提供します。次のボタンを押すと、現在のすべてのテーブル行を削除して、クエリの新しい結果でそれらを再作成できるようにする必要があります。次のコードを使用して行を削除しています。

if (document.getElementsByClassName('shiftTrRow')) {
    table = document.getElementById('resultsTable')
    deleteRow = document.getElementsByClassName('shiftTrRow');
    table.removeChild(deleteRow);       
}

ifケースを使用して、削除する行があるかどうかを確認します。検出された行があるかどうかをテストするアラートを追加しました。これは機能します。

コードを実行すると、次のエラーが表示されます。

table.removeChild(deleteRow)

Uncaught Error: NOT_FOUND_ERR: DOM Exception 8 

エラーコードを調べたところ、要素が見つからなかったと説明されていますが、このコードは要素が見つかった場合にのみ実行されるため、これは当てはまりません。私が間違っていることや、これを行うためのより良い方法を誰かが知っているなら、私はそれを本当に感謝します。

4

3 に答える 3

2

document.getElementsByClassNameNodeList単一ノードではなく、を返します。たとえば、そのリストからノードを選択する必要がありますdocument.getElementsByClassName('shiftTrRow')[0]

また、ノードが実際に指定されたテーブルの子であることを確認してください。次のコードは、もう少し例外安全です。

if (document.getElementsByClassName('shiftTrRow'))
{    
    deleteRow = document.getElementsByClassName('shiftTrRow')[0];

    if(deleteRow.parentNode)
        deleteRow.parentNode.removeChild(deleteRow);
}
于 2012-08-05T15:53:51.267 に答える
1
document.getElementsByClassName('shiftTrRow')
                   ^

NodeList、つまり要素の配列を返します。それらをループして、すべてを単独で削除する必要があります(ただし、コレクションはライブであり、要素を削除すると縮小します)。

また、getElementsByClassNameはそのテーブルの行がまったくない要素を返す可能性があり、その結果、NOT FOUND例外が発生します。

ただし、テーブルから行を削除する最も簡単な方法は、そのdeleteRowメソッドです。

var table = document.getElementById('resultsTable');
while (table.rows.length > 0)
    table.deleteRow(0);
于 2012-08-05T15:52:31.013 に答える
1

document.getElementsByClassName要素の配列を返します。table.removeChild引数には、配列ではなくDOM要素が必要です。

于 2012-08-05T15:52:56.490 に答える