この記事は 株式会社Y's アドベントカレンダー12日目の記事です。
初めまして、フロントエンド1年目の@kahn_satoです。
javascriptのやりすぎでJQueryが抜けつつありますので、今回はJQueryなしということで。
若輩ながら、記事、書かせていただきやす。
※若輩すぎて言葉の定義が先輩方と違うやもしれません。
その場合、至極優しく、「xxx
はyyy
っていうとわかりやすいよ」的なアドバイスくださいませ。。
ということで!!
自分の思考回路も含めてさらしてみようと思います。
やりたかったのは、
・table
に置いた要素を検索して、絞り込み
・table
に新しい行を追加
の、2点。
やってみた。
UIが死ぬほどシンプルなのは見た目にとらわれて欲しくないため。←
tr
にtd
を3つという構造ぐらいしかいうことないですね。
まあHTML
やCSS
は置いといて、大事なのはJS
。
ES6
に叩き直していただくのもありがたいなぁ〜←
こんな感じになりました。
var input = document.getElementById('input');
var textValue = input.getElementsByTagName('input');
var tbl = document.getElementById('tbl');
var rows = tbl.rows.length;
var td = document.getElementsByTagName('td');
var notHitCols;
function boo() {
var inputVal = textValue[0].value.toLowerCase();
tbl.rows[0].style.display = 'none';
for (var i = 1; i < rows; i++) {
var cols = tbl.rows[i].cells.length;
for (var n = 0; n < cols ; n++) {
var cells = tbl.rows[i].cells[n];
var cellsTxt = cells.innerHTML.toLowerCase();
if (cellsTxt.indexOf(inputVal) != -1 ) {
cells.classList.add('hitters');
} else {
notHitCols = tbl.rows[i];
notHitCols.style.display = 'none';
cells.classList.remove('hitters');
}
}
}
for (var i = 0; i < td.length; i++) {
if (td[i].classList.contains('hitters')) {
td[i].parentNode.style.display = 'table-row';
td[i].style.display = 'table-cell';
}
}
}
var addNewElem = document.getElementsByTagName('textarea')[0];
var addNewCont = document.getElementsByTagName('textarea')[1];
function fooo() {
var trLength = rows;
var addNewElemValue = addNewElem.value.toLowerCase();
var addNewContValue = addNewCont.value.toLowerCase();
var tr = document.createElement('tr');
var td1 = document.createElement('td');
td1.innerHTML = trLength;
tr.appendChild(td1);
var items = {
'td2' : addNewElemValue,
'td3' : addNewContValue
}
var lists = ['td2', 'td3'];
lists.forEach( function(value) {
for (var i = 0; i < 1; i++) {
var td2 = document.createElement('td');
td2.innerHTML = this[value];
}
tr.appendChild(td2);
}, items);
tbl.getElementsByTagName('tbody')[0].appendChild(tr);
}
・functon boo()
で検索して絞り込み。
・function fooo()
で新規の行を追加。
という具合です。
kahn_satoの頭の中は、というと。
まずはfuncton boo()
やりたいことを言葉に並べて、整理してからスタートします。
・<input type='text'>
のvalue
を取得する
・取得したvalue
がtable
の中にないか検索
・取得したvalue
を含んでいるtr
以外は非表示にする。
functon boo()
はこんな感じ。
あとはひたすらfor
文回すってゆー愚かな構成ですが、確実。
ポイントになるのは
- 取得した
value
が含まれているかif
文の条件分岐で判断して、true
したtd
には.hitters
を追加。false
られたらnotHitCols
にfalse
られたtd
を含むtr
を入れて、それをdisplay:none;
! - 全部見終わったら、再度
td
のlength
だけfor
文回して.hitters
が追加されているものだけが表示されている状態に。 -
<input type='text'>
のvalue
が空白の状態で検索ボタンを押すと、tr
がdisplay:'table-row';
に変更。display:none;
されているのはtr
なので、これでまた全部表示される。
次はfuncton fooo()
同じくやりたいことを言語化。今度は新規でtr
を追加です。
・新規でtr
とtd
3つを入れ子にして作る
・通し番号を1つ目のtd
に入れる
・addNewElem
とaddNewCont
に入力された内容を各td
に入れる
・tr
を書き出すと、あら不思議。行が追加される。
ポイントになるのは(その2)
1.またfor
文回すのだるくね、ってなったのでここで登場、forEach
。便利です。引数苦手なぼくでも使える。便(ry
2.今回は1つずつしかtr
が追加されない優しい設定のため、tr
と1つ目のtd
に入れる通し番号は先に作成。
3.その後forEach
を使って中身をぶち込んだtd
をさらにあらかじめ用意して置いたtr
に思い切りぶち(ry
出来上がり。
果たしてforEach
使う意味があったのか等、諸々疑問は多いわけです。
ここはこうした方がいいとか、こうできる、とかの攻略法や選択肢が
頭に蓄積されてないなと最近思います。
色んなところで色んなコード書いて色んな人にレビューもらうのが、
一番早い成長なのかなと思います。
計画された偶発性理論はここでも役立つ。
学ぼうと思います。
ご指導ご鞭撻のほど、おねしゃす。
あ、パクるとは林先生に怒られるので、要注意です(身内ネタです)。
もうすぐ半分!
13日目 @h_plumさんにバトンタッチ!