7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

この記事は 株式会社Y's アドベントカレンダー12日目の記事です。

初めまして、フロントエンド1年目の@kahn_satoです。
javascriptのやりすぎでJQueryが抜けつつありますので、今回はJQueryなしということで。
若輩ながら、記事、書かせていただきやす。

※若輩すぎて言葉の定義が先輩方と違うやもしれません。
その場合、至極優しく、「xxxyyyっていうとわかりやすいよ」的なアドバイスくださいませ。。

ということで!!

自分の思考回路も含めてさらしてみようと思います。
やりたかったのは、
tableに置いた要素を検索して、絞り込み
tableに新しい行を追加
の、2点。

やってみた。

スクリーンショット 2017-12-12 0.30.32.png

UIが死ぬほどシンプルなのは見た目にとらわれて欲しくないため。←
trtdを3つという構造ぐらいしかいうことないですね。
まあHTMLCSSは置いといて、大事なのは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を取得する
・取得したvaluetableの中にないか検索
・取得したvalueを含んでいるtr以外は非表示にする。
functon boo()はこんな感じ。
あとはひたすらfor文回すってゆー愚かな構成ですが、確実。

ポイントになるのは

  1. 取得したvalueが含まれているかif文の条件分岐で判断して、trueしたtdには.hittersを追加。falseられたらnotHitColsfalseられたtdを含むtrを入れて、それをdisplay:none;
  2. 全部見終わったら、再度tdlengthだけfor文回して.hittersが追加されているものだけが表示されている状態に。
  3. <input type='text'>valueが空白の状態で検索ボタンを押すと、trdisplay:'table-row';に変更。display:none;されているのはtrなので、これでまた全部表示される。

次はfuncton fooo()

同じくやりたいことを言語化。今度は新規でtrを追加です。
・新規でtrtd3つを入れ子にして作る
・通し番号を1つ目のtdに入れる
addNewElemaddNewContに入力された内容を各tdに入れる
trを書き出すと、あら不思議。行が追加される。

ポイントになるのは(その2)

1.またfor文回すのだるくね、ってなったのでここで登場、forEach。便利です。引数苦手なぼくでも使える。便(ry
2.今回は1つずつしかtrが追加されない優しい設定のため、trと1つ目のtdに入れる通し番号は先に作成。
3.その後forEachを使って中身をぶち込んだtdをさらにあらかじめ用意して置いたtrに思い切りぶち(ry

出来上がり。

果たしてforEach使う意味があったのか等、諸々疑問は多いわけです。
ここはこうした方がいいとか、こうできる、とかの攻略法や選択肢が
頭に蓄積されてないなと最近思います。
色んなところで色んなコード書いて色んな人にレビューもらうのが、
一番早い成長なのかなと思います。
計画された偶発性理論はここでも役立つ。
学ぼうと思います。
ご指導ご鞭撻のほど、おねしゃす。

あ、パクるとは林先生に怒られるので、要注意です(身内ネタです)。

もうすぐ半分!
13日目 @h_plumさんにバトンタッチ!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?