.NET TIPS jQueryと「linq.js」を連携させてDOMをLINQにより処理するには?河合 宜文2011/05/19 2011/07/19 更新 |
|
|
「TIPS:JavaScriptで配列をLINQにより処理できるライブラリ「linq.js」を利用するには?」ではlinq.js単独での基本的な使い方を紹介したが、今回はjQueryと連携した使い方を紹介する。
jQueryは優れたライブラリであるが、コレクション処理に関しては貧弱だ。linq.jsはコレクション処理に特化し、DOMなどへの依存もないため、jQueryと干渉することなく、欠けた部分を補完できる。
●linq.js(jQueryプラグイン版)の使い方
linq.jsをダウンロードし、通常のjQueryプラグインと同じく、まずjQueryを参照し、その下にlinq.jsのjQueryプラグイン版であるjquery.linq.jsファイルへのパスを記述すればよい。例えば下記のようなコードを記述する。
|
|
linq.js(jQueryプラグイン版)を利用するためのコード | |
なお、1つ目の例は、配列中の文字列を値に持つ<li>要素のjQueryオブジェクトを生成している。2つ目の例は、HTMLコード中の<div>要素の内容を配列に変換している。 |
単体で動作するlinq.jsファイルと、プラグインで動作するjquery.linq.jsファイルでは、LINQ文としての機能面は同じだが、いくつか差異がある。
まず、linq.jsのEnumerableオブジェクトが、グローバルに配置されるか(linq.jsファイル)、jQuery下に配置されるかだ(jquery.linq.jsファイル)。
また、jquery.linq.jsファイルの方ではLINQメソッドとしてTojQueryが使用できる。このメソッドはLINQ文の値を、複数の要素を持つjQueryオブジェクトに変換する。さらには、jQueryオブジェクトにtoEnumerableメソッドが追加される。これはjQueryセレクタで選択されている要素に対してLINQ文を適用するためのものである。このとき、LINQ文に流れる値は、単一要素のjQueryオブジェクトとなっている。
なお、jQueryのバージョンは1.3以上であれば、どのバージョンでも構わない。
●LINQで加工してjQueryオブジェクトに変換する(TojQueryメソッド)
以下のコードは、TojQueryメソッドにより、LINQ文で作成したリスト要素をHTMLコード内に挿入する例だ。このような手法は、<li>タグや<option>タグなど、リスト要素として使用されるタグに対して親和性が高い。
|
|
TojQueryメソッドにより日にちを(HTMLコード内に)挿入するコードの例 |
Rangeメソッドで、1から月末までの日数(例えば5月ならば「31」)の連番の整数を生成し、それをSelectメソッドで、jQueryにより<option>要素のDOMオブジェクトに変換する。そして、TojQueryメソッドでLINQ文からjQueryオブジェクトに変換し、appendToメソッドで対象のセレクトボックスに挿入する。
実行結果は下記のようになる。
TojQueryメソッドにより日付を(HTMLコード内に)挿入するコードの実行結果 |
日付は、月の選択に合わせて動的に変化する項目だが、Rangeメソッドなどの、linq.jsが生成するメソッドと、jQueryのDOM操作をつなぎ合わせることで、シンプルに記述できる。
●jQueryで選択してLINQで加工する(toEnumerableメソッド)
以下のコードは、HTMLコード内のテーブル(=<table>要素)中の要素をデータとして取り出し、集計処理をする例だ。家計簿の表として、[日付][種類][内容][金額]の4項目を持ち、5行がすでに入力されている。ここから、種類が食費である項目の金額の平均値を求める。
|
|
toEnumerableメソッドでテーブルから値を取り出して平均値を求めるコードの例 |
まずjQueryのセレクタでidが「Kakeibo」の直下の<tbody>要素に含まれている<tr>要素、つまり表の1行1行を選択。それをtoEnumerableメソッドでLINQ文が適用できるオブジェクトに変換し、Selectメソッドで子要素の<td>要素ごとに分解、つまりインデックスを4項目持つ横方向に分解する。さらにWhereメソッドで[種類](インデックスは「1」)が「食費」である項目のみをフィルタリングし、Averageメソッドにより金額(インデックスは「3」)の平均値を算出する。
実行結果は下記のようになる。
toEnumerableメソッドでテーブルから値を取り出し平均値を求めるコードの実行結果 |
HTMLテーブルのセルの抽出をjQueryが、計算処理をlinq.jsが担当することで、それぞれが持たない機能を補完し合うので、複雑な処理をより簡単に記述できる。
●単体版のlinq.jsをjQueryと連携する場合
単体版であってもjQueryと連携させることが可能だ。その場合は、jQueryとの結合(バインディング)ファイルを追加で読み込む。そのファイルはlinq.jsをダウンロードした際の「bindings/linq.jquery.js」にある(※前述の「jquery.linq.js」ファイルと、ファイル名が少し異なることに注意してほしい)。
|
|
単体版linq.jsにjQuery連携メソッド(bindings/linq.jquery.jsファイル)を追加する例 |
これにより、LINQにTojQueryメソッドが、jQueryにtoEnumerableメソッドが追加される。単体+バインディング版(linq.jquery.jsファイル)とjQueryプラグイン版(jquery.linq.jsファイル)の差異は、Enumerableオブジェクトがグローバルにあるか、jQuery($)下にあるかのみであり、機能面での違いはないので、どちらでも好みの方を選ぶといいだろう。
カテゴリ:オープンソース・ライブラリ 処理対象:JavaScript 関連TIPS:JavaScriptで配列をLINQにより処理できるライブラリ「linq.js」を利用するには? |
「.NET TIPS」 |
更新履歴 | |||||
|
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|