JavaScriptで何もないところにtableを動的に作成する
createElement(tagName)とすることでtagNameで指定されたHTML要素を作成することができる。
tableを作成したい場合はcreateElement(“table”)とやればよい。
HTMLのtableを構成するのは、table、thead(なくてもよい)、tbody(なくてもよい)、tr、th、tdの要素があるのでこれらも作成します。
以下は1行3列の表を作成しているコードです。
var mybody = document.getElementsByTagName("body")[0]; var mytable = document.createElement("table"); var mytbody = document.createElement("tbody"); var mytr = document.createElement("tr"); var myth = document.createElement("th"); var mytd1 = document.createElement("td"); var mytd2 = document.createElement("td"); myth.textContent ="みだし"; mytd1.textContent = "あいうえお"; mytd2.textContent = "かきくけこ"; mytr.appendChild(myth); mytr.appendChild(mytd1); mytr.appendChild(mytd2); mytbody.appendChild(mytr); mytable.appendChild(mytbody); mybody.appendChild(mytable);
1番上の行でやっているのはこのページのbody全体の0番目の要素つまりbodyタグを取得しています。
それ以後でcreateElementをやってtableに必要な部品を作成。
myth、mytd1、mytd2のtextContentに文字列を入れてあげてます。textContentプロパティはNodePrototypeからの継承で使えるプロパティです。
重要なのはその後のappendChildが6行続いてる部分です。
mytrに、myth、mytd1、mytd2をappendChildメソッドで追加
↓
mytbodyにmytrを追加
↓
mytableにmytbodyを追加
↓
mybodyにmytableを追加
とこの順番が大事。
要素をトップダウンで作成し、子要素を親要素へとボトムアップで追加していく。
まずHTML的に書くとどうなるかをイメージして、それをJavaScriptに落とし込んでいくようなスキルが必要。絵で描いてもいい。
CodePen
See the Pen
Untitled by pghappy (@pghappy)
on CodePen.
JavaScriptでtableと中の要素tdを取得する
HTML側の本文に
<table id="tbl"></table>
などと作っておいて、JavaScript側に
var mytable = document.getElementById("tbl");
とやればテーブルの要素を取得できる。
テーブルの中の「行」「列」「セル」にアクセスするには?
例えば以下のような表があったとして。
JavaScriptは以下のようにする。
var mytable = document.getElementById("tbl"); //html側のtableについてるidで要素を取得 for (var i=0; i < mytable.rows.length; i++) { for (var j=0; j < mytable.rows[i].cells.length; j++) { console.log( "(" + i + "," + j + ") : " + mytable.rows[i].cells[j].innerHTML ); } }
mytable.rowsで、すべての行(tr)要素を配列で取得。
mytable.rows.lengthで、行の数を取得。最初のforループで行の数だけ繰り返す。
mytable.rows[i].cellsでセル(thとtd)要素をまとめて配列で取得。
2番目のループではmyable.rows[i]に入ってるセルの数だけ繰り返す。
コンソールに値を表示しています。
CodePen↓
See the Pen
table-get-data by pghappy (@pghappy)
on CodePen.
JavaScriptのtalbeに行を追加する
行(tr)を追加するにはtable要素のinsertRowメソッドを使う。
var mytable = document.getElementById("tbl"); var mytr = mytable.insertRow(1);
このように記述する。insertRow()メソッドには必ず引数を入れて挿入する行番号を明示すること。(引数が無い時の挙動はブラウザによって異なる場合があるため)
引数は0が0行目。1が1行目。-1が最後の行に追加となる。
行(tr)を追加したら、後はその中に入れるセル(thやtd)を指定していく。
やり方はいくつかある様子。
完成のイメージは下図のとおり。
1つ目のやり方。
//1つ目のやり方 var mytr = mytable.insertRow(1); //引数1 : 表の1行目に追加 //thセルの追加 var myth = document.createElement("th"); myth.innerHTML = "URL"; mytr.appendChild(myth); //tdセルの追加 var mycell1 = mytr.insertCell(1); var mycell2 = mytr.insertCell(2); //textContentでもいいしinnnerHTMLでもいいし mycell1.textContent = "techacademy.jp"; mycell2.innerHTML = "tech-camp.in";
・thを追加するにはdocument.createElemnetを使うやり方しかなかった。innnerHTMLで文字列URLを指定してmytrにappendChildでthを追加。
・次にtdセルを2つ追加する。これはmytrのinsertCellメソッドで実現できる。引数には列番号を入力。
・セルの中身の文字列はtextContentやinnerHTMLで指定できる。innerHTMLを使えばHTMLで記述できる。
2つ目のやり方。
//2つ目のやり方 var mytr2 = mytable.insertRow(-1); //引数-1 : 表の一番最後に1行追加 var myth2 = document.createElement("th"); var myth2Txt = document.createTextNode("評価"); myth2.appendChild(myth2Txt); mytr2.appendChild(myth2); mycell3 = mytr2.insertCell(1); mycell3Txt = document.createTextNode("●●●●"); mycell3.appendChild(mycell3Txt); mycell4 = mytr2.insertCell(2); mycell4Txt = document.createTextNode("★★★★"); mycell4.appendChild(mycell4Txt);
今回は表の最後の行に1行追加してみた。
thは先ほどと同様にdocument.createElement(“th”)で生成する。
次にdocument.createTextNode(“評価”)で、テキストノードを生成しこのmyth2Txtを親要素のthにappendChildして、さらにthは親要素のmytr2にappendChildする。
セルの生成は先ほどと同様にinsertCell()メソッドで行う。
中の文字列はcreateTextNodeで生成して親要素にappendChidするやり方となっている。
全体的なコードは以下のとおり。
See the Pen
table-insert-tr by pghappy (@pghappy)
on CodePen.
JavaScriptのtableのクリックしたセルと行を取得する
多分方法はいくつかある。
HTML側に作ったtableのセルにidとonclick属性を先に指定しておいて、javascriptでクリック時のイベントを取る方法があるけど、今回実現するのはその方法ではなくて。
以下ではJavaScript内でイベントを設定する方法を備忘録しておく。
例によって例のごとくHTML側は次のtableを用意した。
<body> <table id="tbl"> <tr> <th>比較</th><th>テックアカデミー</th><th>テックキャンプ</th> </tr> <tr> <th>学習方式</th><td>オンライン</td><td>教室</td> </tr> <tr> <th>言語</th><td>いろいろ</td><td>Ruby on Rails</td> </tr> <tr> <th>料金</th><td>20万円</td><td>10万円</td> </tr> </tbody> </table> <p id="result"></p> </body>
これに対して、JavaScriptは以下のようにした。
var mytable = document.getElementById("tbl"); for (var i=0; i < mytable.rows.length; i++) { for (var j=0; j < mytable.rows[i].cells.length; j++) { mytable.rows[i].cells[j].id = i + "-" + j; mytable.rows[i].cells[j].onclick = clicked; } } function clicked(e) { var txt = document.getElementById("result"); txt.textContent = e.target.id + "がクリックされました。値は:" + e.target.innerHTML; }
1行目でidにtblを指定したtable要素を取得してmytableで使えるようにしている。
2重のforループでまわして1セルずつにidとonclickプロパティを指定した。onclickプロパティには関数clickedを実行するようにしている。
clicked(e)関数ではイベントが発生した際に、e.target.idでどこのセルがクリックされたかを表示しつつ、セルの文字を表示するようにした。
CodePenは以下のようになった。
See the Pen
table-get-click-tr by pghappy (@pghappy)
on CodePen.