昨年のこととなりますが、仕事で開発しているシステムの中に、メールソフトなどによくある「フィルタリング設定」のような機能を実装しました。フィルタリングの条件をリストに追加し、リストを上下に移動することで優先順位を変更でき、さらに内容も変更でき、必要のないものは削除するといったものです。
今、この「リストを操作する機能」を使って、このブログに新しい機能を追加してみようと考えています。それに先立ち、思い出す意味も含めてブログにまとめてみることにしました。以下、参考になればと思います。
サンプル
まずは、どんな機能化ということで、サンプルを挙げておきます。要は「テーブルの行を思うがままにJavaScriptで操作してしまおう」といった機能となります。
< サンプル >
手っ取り早く機能を確認するには、以下の方法をお試しください。
- まず「リスト選択」の列の選択肢から「B」を選択します。
⇒「リスト名」が「B」に変更されます。(変更) - 「追加/削除」の列の「+」ボタンを押します。
⇒行が追加されます。(追加) - 追加された行の「リスト順」の列の「↑」をクリックします。
⇒行が上へ移動します。(移動) - 移動した行の「リスト順」の列の「↓」をクリックします。
⇒行が下へ移動します。(移動) - 最後に、好きな行の「追加/削除」の列の「-」ボタンを押します。
⇒行が削除されます。(削除)
いかがでしょうか。まあ、よくある機能ですね。では、この機能の実装方法について以下にまとめておきたいと思います。
HTML
HTMLでは、以下の点がポイントとなります。
- それぞれの機能を発生させるためのイベントハンドラをセットしておきます。
- 操作の対象となる「行」の部分は<tbody>タグ内に記述するようにします(これが後々大事になります)。
- JavaScript側ではDOMを使用しますが、ブラウザーによって「改行」をノードとして扱うものがあったりなかったりするので、一切改行を入れずに記述します。
JavaScript
JavaScriptでは、HTML内に記述したイベントハンドラによって呼び出される関数をそれぞれ定義します。
行を追加する
テーブル内の「+」ボタンが押されると、以下のaddList()関数が呼び出されます。処理内容としては、テーブルの1行目の「行(tr要素)」のクローンを作成し、それを「+」ボタンが押された行の下に追加します。
行を削除する
テーブル内の「-」ボタンが押されると、以下のremoveList()関数が呼び出されます。処理内容としては、単純に「-」ボタンが押された行を削除します。
行を一つ上に移動させる
テーブル内の「↑」が押されると、以下のupList()関数が呼び出されます。処理内容としては、「↑」が押された行の上に「行が存在した場合」に、その行の上に挿入させます。
行を一つ下に移動させる
テーブル内の「↓」が押されると、以下のdownList()関数が呼び出されます。処理内容としては、「↓」が押された行の下に「行が存在した場合」に、その行の下に挿入させます。
行の一部を変更する
テーブル内の<select>要素のオプションが選択されると、以下のchangeList()関数が呼び出されます。処理内容としては、新たにtd要素を作成し、その要素内を選択されたオプションの値を取得して置き換え、さらに既存のtd要素と置き換える。
以上のような感じで実装を試みたわけですが、純粋なJavaScriptのみでDOMを扱うとなると、ブラウザーによる挙動が不確定でわけがわからなくなります。そこでjQueryを使って書き換えてみることにしました。jQueryを使うことによって、以下のようにだいぶシンプルにコードを書くことができます。
jQueryを使って実装
jQueryを使う場合も、上記の純粋なJavaScriptのみで実装する時とほぼ同じような考え方で実装していくことができますが、一箇所だけ大きく異なる点があります。
行を追加する際に、上記ではテーブルの1行目の行を複製して挿入しましたが、今回は処理を簡単にするために、その複製用の1行目の行をCSSで非表示にしています。そのためテーブルを表示させる際に、その非表示とした1行目の行を複製して表示させる処理を追加しています。
HTML
jQueryを使うと、ブラウザーごとのDOMにおける改行の扱いを気にする必要はありません。HTMLも自分の見やすいようにコーディング可能です。今回はイベントハンドラではなく、jQueryで処理をしやすくするためにクラス属性をセットしておきます。
CSS
先にも述べたように、1行目の行を複製用のサンプルコードとして非表示にします。
#p2146-2-tbody tr:first-child {
display: none;
}
jQuery(JavaScript)
ポイントとしては、jQuery 1.7から追加された.on()メソッドを使ってイベントをバインドしています。jQuery 1.7以前であれば.live()メソッドを使うところだと思いますが、この.onメソッドは、その.live()メソッドをはじめとして、.bind()メソッド、.delegate()メソッドの機能が統合された強力な機能を持つメソッドとなっています。
.on()メソッド
jQueryのソースコードは以下となります。
< jQueryで実装したサンプル >
上記のJavaScriptでの実装のサンプルと特に動きは変わらないかと思います。
まとめ
以上のように、tableの行を操作する機能について紹介しましたが、この機能の使い道として考えられることとしては、やはりajax関連の機能ではないでしょうか。最初にも書きましたが、現在このブログに新しい機能を実装しようと考えています。
その機能というのが、簡単に言えば「後で読む」機能で、トップページの記事一覧にそれぞれ「後で読む」ボタンを設置しておき、そのボタンを押すと、サイドバーにリンクつきタイトルが追加されるといったものです。タイトルをクリックして記事にアクセスするとサイドバーの表示から消え、さらに順番も変更できるといったものです。これをHTML5のweb storageを使って実装できればなと思っています。
コメント