[HTML]table クリックのエコー

HTMLの表をクリックした時に行選択状態にするには、チェックボックスのchecked やリンクのselectedの属性を使う方法もあったが、昔のブラウザならどんな属性も自由に付けられるからtrタグにcheckedするのもいいけど、変な使い方は無視するのが御時世なので、trタグに行選択クラスを加えるのが安心。

その為には、cssとjavascriptを少し書かないといけない。

注意点としては、

  • 表の背景色を一行ごとに変えてる場合はnth-child(…)の方が優先度が高いらしい。
    • 選択状態クラスの背景色に !import して優先度を変える。
  • thやtdで文字や背景の色を指定していると、trで色を変えても無関係で無視されてしまう。

かな。

なので、 ちと面倒だけど、thやtdにも 選択状態クラスを入れれば良い。

但し、javascriptの for .. in は、childNodes の要素の識別子(数値)を含むプロパティ名(文字列)を返してくるので、!isNaNでフィルターしないといけないし。childNodesには行中のスペース等のテキスト要素も含まれているので、classListプロパティがあるものだけ処理しないとエラってしまうから、配列でのfor..inは非推奨でfor..ofがお勧めとなっている。

こんな感じかな。

ちと大変と書いておいて、6行しか増えてないなぁ。

window.onload = function () {
  var tables = document.querySelectorAll("table");
  let addClassElement = null;
  for (var table of tables) {
    table.addEventListener('click', (event) => {
      var tr = event.target.parentElement;
      // 前回設定したものを回復
      if (addClassElement!=null) {
        addClassElement.toggleClassNameWithChilds('selected01');
        addClassElement = null;
      }
      // 行選択クラスをトグる
      addClassElement = tr.toggleClassNameWithChilds('selected01');
    }, false);
  }
}

// 指定クラスをトグる
if(!HTMLElement.prototype.toggleClassNameWithChilds) {
  HTMLElement.prototype.toggleClassNameWithChilds = function(className) {
    var addClassElement = null;
    if (this === undefined || this.classList === undefined) {
      return null;
    }
    if (!this.classList.contains(className)) {
      addClassElement = this;
    }
    this.classList.toggle(className);
    //配下のオブジェクトも反映
    for (var ch of this.childNodes) {
      // 未実装なオブジェクトを除外
      if(ch.toggleClassNameWithChilds !== undefined) {
        ch.toggleClassNameWithChilds(className);
      }
    }
    return addClassElement;
  }
}
tr:nth-child(even) {
  background-color: white;
}

tr:nth-child(odd) {
  background-color: lavender;
}

.selected01 {
  color: white;
  background-color: gray;
}

Element.classListにtoggleWithChildsとかを追加しようとしたけど、classListの生成タイミングが判らず諦めた。


  • カテゴリー:
  • HTML


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA