どのようなアプリケーションでも、クライアントに情報を表示したり、その内容を更新したりする場合、スプレッドシート状の画面が、主流になりがちです。
もちろん、HTMLドキュメントでそのような画面を作成するときは、tableエレメントが活躍します。DOMでは、tableの内容をいろいろと操作するための、多くのAPIが用意されています。
HTMLのtableエレメントに該当する、DOMのオブジェクトが、HTMLTableElementです。HTMLTableElementオブジェクトから取得できる情報や、直接操作ができる対象は、殆どが行単位のものです。
interface HTMLTableElement : HTMLElement { attribute HTMLTableCaptionElement caption; // raises(DOMException) on setting attribute HTMLTableSectionElement tHead; // raises(DOMException) on setting attribute HTMLTableSectionElement tFoot; // raises(DOMException) on setting readonly attribute HTMLCollection rows; readonly attribute HTMLCollection tBodies; attribute DOMString align; attribute DOMString bgColor; attribute DOMString border; attribute DOMString cellPadding; attribute DOMString cellSpacing; attribute DOMString frame; attribute DOMString rules; attribute DOMString summary; attribute DOMString width; HTMLElement createTHead(); void deleteTHead(); HTMLElement createTFoot(); void deleteTFoot(); HTMLElement createCaption(); void deleteCaption(); HTMLElement insertRow(in long index) raises(DOMException); void deleteRow(in long index) raises(DOMException); };
rows属性には、当該テーブルの全ての行が、HTMLTableRowElementオブジェクトの集合として、格納されています。
tBodies属性には、tbodyエレメントに該当する内容が、HTMLTableSectionElementオブジェクトの集合として、複数(存在すれば)格納されています。tbodyに行を追加したり、行を削除したりすることは可能ですが、なぜかtbodyそのものを追加削除することは、できないようです。
HTMLTableSectionElementオブジェクトも、行の集合です。操作の対象は、やはり行単位です。
interface HTMLTableSectionElement : HTMLElement { attribute DOMString align; attribute DOMString ch; attribute DOMString chOff; attribute DOMString vAlign; readonly attribute HTMLCollection rows; HTMLElement insertRow(in long index) raises(DOMException); void deleteRow(in long index) raises(DOMException); };
rows属性は、HTMLTableElementオブジェクトのrows属性と同じく、HTMLTableRowElementオブジェクトの集合です。また、insertRowメソッドからの戻りも、HTMLTableRowElementオブジェクトとなります。
HTMLTableRowElementオブジェクトは、行を管理するオブジェクトです。HTML上のtrエレメントに該当します。取得できる情報や、操作の対象は、セル単位となります。
interface HTMLTableRowElement : HTMLElement { readonly attribute long rowIndex; readonly attribute long sectionRowIndex; readonly attribute HTMLCollection cells; attribute DOMString align; attribute DOMString bgColor; attribute DOMString ch; attribute DOMString chOff; attribute DOMString vAlign; HTMLElement insertCell(in long index) raises(DOMException); void deleteCell(in long index) raises(DOMException); };
cells属性は、HTMLTableCellElementオブジェクトの集合です。また、insertCellメソッドからの戻りも、HTMLTableCellElementオブジェクトとなります。
HTMLTableCellElementオブジェクトは、テーブルの一つ一つのセルを現します。HTML上のthエレメントやtdエレメントに該当します。
具体的な、テーブルの操作は次のようになります。
次のようなHTMLがあるとき、3行行を挿入し、各行に5列のセルを挿入します。そして、各セルに"targetTable.r[行インデックス].c[列インデックス]"形式の、idを設定します。
<table id="targetTable"> </table>
var tableId = 'targetTable'; var rowCount = 3; var columnCount = 5; var targetTable = document.getElementById(tableId); for (var i = 0; i < rowCount; i ++) { var row = targetTable.insertRow(headerCount + i); for (var j = 0; j < columnCount; j ++) { var cell = row.insertCell(j); cell.setAttribute('id', tableId + '.r' + i + '.c' + j); } }
次のスクリプトは、ヘッダ・フッタ以外の行(ボディ部分)を、全て削除します。
var targetTable = document.getElementById(tableId); var allCount = targetTable.rows.length; var headerCount = 0; var footerCount = 0; if (targetTable.tHead) { headerCount = targetTable.tHead.rows.length; } if (targetTable.tFoot) { footerCount = targetTable.tFoot.rows.length; } var bodyLast = allCount - footerCount; for (var i = headerCount; i < bodyLast; i ++) { targetTable.deleteRow(headerCount); }
次のスクリプトも、ヘッダ・フッタ以外の行(ボディ部分)を、全て削除します。下の行から削除していくのがみそです。但し、上のスクリプトのほうが、ループの回数も少なくてスマート。特定のtbodyエレメントの内容だけを削除する、と云う様な場合は、改造して使えるけど。
var bodiesCount = targetTable.tBodies.length; for (var i = bodiesCount; i > 0; i --) { var bodyItem = targetTable.tBodies.item(i - 1); var rowCount = bodyItem.rows.length; for (var j = rowCount; j > 0; j --) { targetTable.deleteRow(bodyItem.rows.item(j - 1).rowIndex); } }
下のアンカーのいずれかをクリックすると、ここにテーブルが現れます。
うちのねこ紹介。(残念ながら、一部のWebブラウザでは、画像が表示されません。それはそれはカワイイのに・・・)