HTML要素 | オブジェクト |
---|---|
table | HTMLTableElement |
tr | HTMLTableRowElement |
th | HTMLTableCellElement、HTMLTableHeaderCellElement |
td | HTMLTableCellElement、HTMLTableDataCellElement |
thead | HTMLTableSectionElement |
tbody | |
tfoot | |
caption | HTMLTableCaptionElement |
colgroup | |
col | HTMLTableColElement |
HTML要素 | 作成※1 | 削除※2 |
---|---|---|
table | Document.createElement( 'table' ) |
Node.removeChild( oldChild ) |
tr | Table.insertRow( index ) |
Table.deleteRow( index ) |
th | Document.createElement( 'th' ) |
TableRow.deleteCell( index ) |
td | TableRow.insertCell( index ) |
※1 tr要素とtd要素には専用のメソッドが用意されていますが、それ以外は汎用のDocument.CreateElementメソッドを使用します。
※2 deleteRow()、deleteCell()はremoveChild()と異なり、削除した要素を返しません。
var table = document.createElement( 'table' );
var row = table.insertRow( -1 );HTMLTableElement.insertRow() - Web API Interfaces | MDN
引数を省略した場合には-1
を指定したものと見なされ、行数を表すtable.rows.length
を指定したときと同様に末尾に追加されます。
引数を省略した場合、一部のブラウザ (SafariやAndroidの標準ブラウザ) では0
を指定したものと見なされ先頭に追加されます。よって引数を省略すべきではありません。
var th = document.createElement( 'th' ); row.appendChild( th );
var td = row.insertCell( -1 );HTMLTableRowElement.insertCell() - Web API Interfaces | MDN
引数を省略した場合には-1
を指定したものと見なされ、セル数を表すrow.cells.length
を指定したときと同様に末尾に追加されます。
引数を省略した場合、一部のブラウザ (SafariやAndroidの標準ブラウザ) では0
を指定したものと見なされ先頭に追加されます。よって引数を省略すべきではありません。
テーブルの行へは、Table.rowsプロパティからアクセスできます。このプロパティはTableRowオブジェクトの配列 (HTMLCollection) であるため、n行目の行はTable.rows[ n ]
で参照できます。
行のセルへは、TableRow.cellsプロパティからアクセスできます。このプロパティはTableCellオブジェクトの配列 (HTMLCollection) であるため、n列目のセルはTableRow.cells[ n ]
で参照できます。
たとえば、
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
のようなテーブルがあるとき、
table.rows[ 1 ].cells[ 2 ].firstChild.data;
は「6」を返します。
tbodyへはtBodiesプロパティからアクセスできますが、このプロパティから返されるのはHTMLCollectionのため、HTMLTableElementが実装するメソッドなどは使用できません。よってその必要があるならばtbodyにid属性を設定しておき、getElementById()で要素を直接取得します。 HTMLTableElement.tBodies - Web APIs | MDN HTMLTableElement.insertRow() - Web APIs | MDN
0行目の行が存在しなくなるまで0行目の行の削除をくり返すことで、すべての行を削除できます。
while( table.rows[ 0 ] ) table.deleteRow( 0 );
たとえば下表のように0行目にヘッダが存在する場合、このヘッダ部分だけを残して行を削除するには、
AAA | BBB |
---|---|
1 | 2 |
3 | 4 |
削除の対象を1行目以降に変更します。
while( table.rows[ 1 ] ) table.deleteRow( 1 );
下のテーブルに、マウスポインタを合わせてください。
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | (1, 1) | (2, 1) | (3, 1) | (4, 1) | (5, 1) |
2 | (1, 2) | (2, 2) | (3, 2) | (4, 2) | (5, 2) |
3 | (1, 3) | (2, 3) | (3, 3) | (4, 3) | (5, 3) |
4 | (1, 4) | (2, 4) | (3, 4) | (4, 4) | (5, 4) |
var TARGET_CLASS = 'highlighting'; var CELL_COLOR = 'gray'; var tables = document.body.getElementsByTagName( 'table' ); for( var i = 0; i < tables.length; i++ ) { if( tables[ i ].className.indexOf( TARGET_CLASS ) != -1 ) { AttachHighlighting( tables[ i ] ); } } function AttachHighlighting( table ) { for( var i = 0; i < table.rows.length; i++ ) { var cells = table.rows[ i ].cells; for( var k = 0; k < cells.length; k++ ) { var cell = cells[ k ]; if( cell.tagName != 'TH' ) { cell.onmouseover = function() { var row = this.parentNode; var table = row.parentNode.parentNode; var cols = table.getElementsByTagName( 'col' ); for( var i = 0; i < row.cells.length; i++ ) { cols[ i ].style.backgroundColor = ( row.cells[ i ] == this )? CELL_COLOR : ''; } for( var i = 0; i < table.rows.length; i++ ) { table.rows[ i ].style.backgroundColor = ( table.rows[ i ] == row )? CELL_COLOR : ''; } } } } } var colgroups = table.getElementsByTagName( 'colgroup' ); for( var i = 0; i < colgroups.length; i++ ) { var colgroup = colgroups[ i ]; var cols = colgroup.getElementsByTagName( 'col' ); for( var k = cols.length; k < colgroup.span; k++ ) { var col = document.createElement( 'col' ); colgroup.appendChild( col ); } } table.onmouseout = function() { var cols = this.getElementsByTagName( 'col' ); for( var i = 0; i < cols.length; i++ ) { cols[ i ].style.backgroundColor = ''; } for( var i = 0; i < this.rows.length; i++ ) { this.rows[ i ].style.backgroundColor = ''; } } }
上で示したコードでは、連結されたセルを含むとき期待した通りには動作しません。この問題の解決には、jQueryのtableHoverプラグインが参考になります。
下のテーブルに、マウスポインタを合わせてください。
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | A | B | |||
2 | |||||
3 | C | ||||
4 | D |
行方向にだけ着色するならば、tr要素にCSSの:hover擬似クラスでスタイルを設定することでも実現できます。
tr:hover { background-color: gray; }
下のテーブルに、マウスポインタを合わせてください。
1 | 2 | 3 | |
---|---|---|---|
1 | |||
2 | |||
3 |