|  | 
	| 連載:改造WebアプリケーションUIビフォー/アフター 第2回 Webアプリ改造の前に「速習! jQuery/jQuery UI」葛西秋雄 2010/03/05
 | 
	| 
 | 
はじめに
 前回では、ASP.NETのデータ・コントロールを利用した3階層のWebアプリケーションである「ITブック」を紹介しました。今回は第3回の準備編として、jQueryのAPIとjQuery UIのプラグインの使い方をざっくり理解していただきます。
jQueryのHello World
 jQueryは、米国のJohn Resig氏が中心となって開発したJavaScriptのライブラリです。わずか数行のコードを記述するだけでアニメーションなどのエフェクトをWebアプリケーションに組み込むことができます。
 jQueryはDOM(Document Object Model)の要素を検索したり、属性を書き換えたりするためのAPIを豊富に用意しています。また、これらのAPIを利用してコミュニティが作成したjQuery用のプラグインがたくさん公開されています。
 「jQuery UI」は、ユーザー・インターフェイスに特化したjQueryのプラグインの1つで、Accordion、Datepicker、Dialog、Tabsなどの機能が含まれています。
■jQueryのreadyイベントを理解する
 JavaScriptはインタプリタ型の言語ですから、ブラウザがJavaScriptのコードを検出した時点で解読して逐次実行されます。
 例えば以下のリスト1のように、<head>要素に<script>要素を追加して、「document.getElementById('msg').innerHTML = '……';」のようなコードを記述すると、ブラウザはこのコードを読み込んだ時点で解読して実行します。ところが、このgetElementByIdメソッドで参照している“div#msg要素”は、<body>要素に定義されているため、まだ読み込まれていません。このためdiv#msg要素が見つからないといった問題が発生します。
| 
 
| <head><script type="text/javascript">
 
 // この時点では、div#msg要素がまだ読み込まれていないため
 // 見つからない
 document.getElementById('msg').innerHTML = '<b>Hello World!</b>';
 
 </script>
 </head>
 
 <body>
 <div id="msg"></div>
 </body>
 
 |  | 
| リスト1 要素が見つからないためエラーとなるJavaScript | 
|  | 
 この問題を回避するには、JavaScriptのコードをwindowオブジェクトのonloadイベントに記述します(リスト2)。このonloadイベントは、HTMLのすべての要素がレンダリングされて、かつイメージなどがロードされた後に実行されます。つまり、div#msg要素がレンダリングされてDOMが生成されていることが保証されます。
| 
 
| window.onload = function() {// DOMがすでに生成されているのでdiv#msg要素が見つかる
 document.getElementById('msg').innerHTML = '<b>Hello World!</b>';
 }
 
 |  | 
| リスト2 onloadイベントに記述したJavaScriptコード | 
|  | 
 jQueryでは、windowのonloadイベントに相当するものとして、readyイベントがあります。これによりリスト2と同等のコードを次のように記述できます。
| 
 
| $(document).ready(function() {$('#msg').html('<b>Hello World!</b>');
 });
 
 |  | 
| リスト3 jQueryのreadyイベントで記述したJavaScriptコード | 
 ただし、イメージがロードされる前に実行されるといった違いがあります。つまり、onloadイベントよりreadyイベントが先に実行されます。例えば、readyイベント・ハンドラで、<img>要素のwidth、heightなどのプロパティを参照するときは、イメージが完全にロードされているかを確認する必要があります。
 jQueryのreadyイベントは、省略して次のように記述することができます。以降、本稿では省略形で記述します。
| 
 
| $(function() {$('#msg').html('<b>Hello World!</b>');
 });
 
 |  | 
| リスト4 readイベントの省略形 | 
 なお、jQueryのAPIを利用するには、<head>要素に<script>要素を追加してjQueryのライブラリを組み込む必要があります。本連載では以下のリスト5のように、jquery.comからライブラリをダウンロードする代わりに、GoogleのCDN(Content Delivery Network)を利用しています。CDNについては、「jQueryプラグイン実践活用法」で解説していますので参照してください。
| 
 
| <head><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
 </head>
 
 |  | 
| リスト5 GoogleのCDNによるjQueryの読み込み | 
■セレクタとメソッド・チェーンを理解する
 jQueryでDOMの要素を検索するにはセレクタを使用します。jQueryのセレクタは、CSSのセレクタと互換性がありますので、すでにCSSの経験のある方は短時間で使いこなせるはずです。
 例えば、<div>要素を検索するには、セレクタにタグ、ID、クラスなどが指定できます。
| 
 
| $('div').html('<b>Hello World!</b>');  // セレクタにタグを指定$('#msg').html('<b>Hello World!</b>'); // セレクタにIDを指定
 $('.msg').html('<b>Hello World!</b>'); // セレクタにクラスを指定
 
 ……中略……
 
 <div id="msg" class="msg"></div>
 
 |  | 
| リスト6 セレクタによる<div>要素の検索 | 
 jQueryのAPIは、戻り値として自分自身を返しますので、セレクタでdiv#msg要素を検索した後に、cssメソッドで前景色やフォント・サイズを書き換えるときには、メソッドを「.」でチェーンさせることができます。これでかなりコードが節約できます。
| 
 
| $('#msg').html('<b>Hello World!</b>') // div#msgに「Hello World!」を格納
 .css('color', 'red')         // div#msgの前景色を「赤」にする
 .css('font-Size', '20px');   // div#msgのフォントを「20px」にする
 
 |  | 
| リスト7 cssメソッドとメソッド・チェーンを使った記述例 | 
|  | 
■要素をアニメーション化するには
 div#msg要素のスタイルシートを変えるには、前出のcssメソッドで可能ですが、CSSの複数のプロパティを一括して変更するには適していません。
 例えば、color、background-color、font-size、widthなどのプロパティを一括して書き換えるには、CSSのクラス「.red」を宣言しておき、addClassメソッドで要素にクラスを適用します。
| 
 
| .red {color: Yellow;
 background-color: Red;
 font-size: 20px;
 width: 100px;
 }
 
 ……中略……
 
 // div#msg要素にCSSのクラス「.red」を追加する
 $('#msg').addClass('red');
 
 ……中略……
 
 <div id="msg">Hello World!</div>
 
 |  | 
| リスト8 addClassメソッドによるCSSクラスの適用 | 
|  | 
 div#msg要素のスタイルシートを書き換えるときにアニメーション化するには、jQuery UI*1のaddClassメソッドを利用します。jQuery UI版のaddClassメソッドは、第2引数にdurationを追加して、ミリ秒単位で時間を指定できます。
| *1 jQuery UIを利用するには、jQuery UIのライブラリとテーマ(CSS)を追加する必要があります。詳細は、後述の「jQuery UIのプラグインをざっくり理解する」で説明します。 
 | 
| 
 
| addClass(class, [duration])
 |  | 
| jQuery UI版addClassメソッドの構文 | 
 前出のaddClassメソッドにdurationを追加すると、3秒かけてCSSを段階的に書き換えます。
| 
 
| $('#msg').addClass('red', 3000);
 |  | 
 CSSのfont-size、width、heightなどのプロパティを書き換えるときは、animateメソッドを利用すると、きめ細かく制御できます。
 リスト9では、animateメソッドにより、font-sizeとheightプロパティの値(10px、25px)を、3秒かけて(50px、60px)に書き換えています。jQueryは、animateメソッドが実行されると、div#msg要素にstyle属性を追加して、font-sizeとheightプロパティを段階的に書き換えます(図1)。
| 
 
| #msg {font-size: 10px;
 height: 25px;
 width: 250px;
 color: #000;
 background-color: #ccc;
 }
 
 ……中略……
 
 $('#msg').animate({
 fontSize: '50px',
 height: '60px'
 }, 3000);
 });
 
 ……中略……
 
 <div id="msg">Hello World!</div>
 
 |  | 
| リスト9 animateメソッドによるアニメーション | 
|  | 
|  
 | 
| 図1 div#msg要素にstyle属性が追加されてfont-sizeとheightプロパティが段階的に書き換えられているところ | 
| (FirefoxのアドオンFirebugで確認) | 
 jQuery UIのanimateメソッドを利用すると、color、background-colorなどのプロパティも書き換えることができます。この場合、jQueryはdiv#msg要素にstyle属性を追加してcolorとbackground-colorプロパティにrgbメソッドを設定し、Red、Green、Blueの値を段階的に書き換えます(図2)。
| 
 
| #msg {width: 250px;
 height: 25px;
 color: #000;
 background-color: #ccc;
 }
 
 ……中略……
 
 $('#msg').animate({
 color: 'yellow',
 backgroundColor: 'red',
 fontSize: '50px',
 height: '60px'
 }, 3000);
 });
 
 ……中略……
 
 <div id="msg">Hello World!</div>
 
 |  | 
| リスト10 jQuery UIのanimateメソッドによるアニメーション | 
|  | 
|  
 | 
| 図2 colorとbackground-colorのrdbメソッドの値を段階的に書き換えているところ | 
| (FirefoxのアドオンFirebugで確認) |