EC studio EC studio 技術ブログ

2010年03月09日投稿者:津留 奨史

プログラマ視点でみたjQueryの魅力

jQueryは、リッチなUIを簡単な記述で実装できます。

デザイナーにも理解しやすい仕様(そこも魅力の一つ!)なので、
いまやデザイナー向けにjQueryを説明するブログもたくさんありますね。

ただ、完全にデザイナー向けのライブラリなのか?というと、そうでもなく
デザイナーだけではなくプログラマ視点から見ても魅力があるライブラリだと
言えるでしょう。

今回はプログラマ視点でみたjQueryの魅力と感じた点を簡単にまとめてみます。

コードがスマートになる

なんといってもココに魅力を感じます!
細かく言うと以下のものがあげられます。

・要素の操作もシンプル簡単!

jQueryはセレクタを利用して要素を簡単に取得し、
エフェクトの追加やDOMの操作ができます。
(CSSとほぼ同様のセレクタを指定して
簡単にDOMの操作ができるところがデザイナーにも優しいですね!)

これは、記述方法をみていただければよくわかりますので
通常の書き方とjQueryを利用した書き方で比較してみます。

CODE:
  1. <html>
  2. <head>
  3.  <script type="text/javascript" src="jquery-1.4.1.js"></script>
  4. </head>
  5. <body>
  6. <h3>ホームページ支援サービス一覧 (jQueryで色を変更)</h3>
  7. <ul id="hpbackup">
  8.  <li>Web Analyst</li>
  9.  <li>HP売上プラス</li>
  10.  <li>EC DVD</li>
  11. </ul>
  12.  
  13. <h3>おすすめソフトウェア一覧 (通常のjavascriptで色を変更)</h3>
  14. <ul id="software">
  15.  <li>ESET Smart Security</li>
  16.  <li>ESET NOD32アンチウイルス</li>
  17.  <li>MindManager</li>
  18.  <li>Camtasia</li>
  19.  <li>Snagit</li>
  20. </ul>
  21.  
  22. </body>
  23. <script type="text/javascript">
  24. //jQueryで特定の<ul>タグ以下のテキストカラーを変更
  25. $('#hpbackup li').css('color','#00f');
  26.  
  27.  
  28. //普通のjavascriptで特定の<ul>タグ以下のテキストカラーを変更
  29. for (i in document.getElementById('software').childNodes){
  30.     if (document.getElementById('software').childNodes[i].tagName == 'LI'){
  31.         document.getElementById('software').childNodes[i].style.color = '#0f0';
  32.     }
  33. }
  34. </script>
  35. </html>

上記のスクリプトは、<li>のテキストカラーを変更しているものです。

比べていただくとわかるように
通常の書き方で書くよりもjQueryを利用した書き方のほうが
明らかにスマートで見やすい書き方なのではないでしょうか!?

・1行でAjax!

なんと1行でAjaxが書けます!

例えば、
同ディレクトリにある sample.phpの出力結果をidがhogeのタグ内に読み込む場合
以下のように記述します。

CODE:
  1. <div id="hoge"></div>
  2.  
  3. <script type="text/javascript">
  4. $('#hoge').load('./sample.php');
  5. </script>

これだけです!

AjaxをサポートしているライブラリはExt JSPrototypeなどがありますが、
いずれもjQueryほどシンプルに実装とはいきません。

本当にこの機能だけでも十分魅力的です。

・メソッドチェーンの利用で重複のないコードに

jQueryを使うと何度も同じ要素を指定する必要がなくなります。

例えば、
指定したタグの中にある文字列と文字色を変更する場合です。

CODE:
  1. <span id="hoge">メソッドチェーン</span>
  2.  
  3. <script type="text/javascript">
  4. //毎回、要素の指定をした書き方
  5. $('#hoge').css('color','#FF0000');//色を赤に変更
  6. $('#hoge').html('jQuery');//「jQuery」という文字をタグ内に表示(innerHTMLと同じ)
  7.  
  8. //メソッドチェーンを利用した書き方
  9. $('#hoge').css('color','#FF0000').html('jQuery');
  10. </script>

上記のように

要素を取得→イベントやスタイルを指定
要素を取得→イベントやスタイルを指定
・・・

といったように、毎回要素を取得して記述する方法より

要素を取得
 →イベントやスタイルを指定
 →イベントやスタイルを指定
・・・

という形で、ひとつの要素を取得したら
取得した要素に対して複数の指定をまとめて行うほうが効率的です。
(実際、処理速度の改善にもなります)
そしてコードもスマート!

同じ処理ならjQueryのメソッドチェーンを利用した記述をおすすめします!

readyが便利すぎる!

jQueryのスクリプトを見るとよくreadyが記述されています。
以下のような記述です。

CODE:
  1. <script type="text/javascript">
  2. $(document).ready(function(){
  3.     //この中に処理を記述
  4. });
  5. </script>

このreadyが実行されるタイミングはDOMの操作を行いやすいので、
実はとても便利なメソッドです。

とはいっても、文字だけで動きの説明は難しいので
具体的に、コードとあわせて説明します。

CODE:
  1. <html>
  2. <head>
  3.  <script type="text/javascript" src="jquery-1.4.1.js"></script>
  4.  <script type="text/javascript">
  5.  //サイズ変更
  6.  $('#book1').width(370).height(600);
  7.  </script>
  8. </head>
  9. <body>
  10.  <img id="book1" src="http://blog.ecstudio.jp/wp-content/uploads/2010/01/book-185x300.jpg" style="margin: 10px">
  11. </body>
  12. </html>

上記の例では#book1はサイズが変更されません。

これは、HTMLのドキュメント構造が生成される順番を意識せずに
スクリプトを記述しているからです。
上記スクリプトの場合、<img>タグのドキュメント構造が生成されていない状態で<head>タグが読み込まれ、<img>タグに対する処理をしようとしたため
後で生成された<img>タグはサイズが変わらなかったのです。

この問題をreadyを使わずに解決するためには、
onloadイベントを利用することになります。
しかし、onloadを利用しても問題点はあります。

まずはコードをみていただきましょう。

CODE:
  1. <html>
  2. <head>
  3.  <script type="text/javascript" src="jquery-1.4.1.js"></script>
  4.  <script type="text/javascript">
  5.  function load(){
  6.      $('#book1').width(370).height(600);
  7.  }
  8.  </script>
  9. </head>
  10. <body onload="load();">
  11.  <img id="book1" src="http://blog.ecstudio.jp/wp-content/uploads/2010/01/book-185x300.jpg" style="margin: 10px">
  12. </body>
  13. </html>

上記のようにすれば、たしかに画像のサイズは変更されて表示されます。
しかし、実行すれば分かりますが一度画像がレンダリングされてしまったあとの
タイミングでonloadイベントは動く為、
一瞬ですが表示の時にサイズ変更前の画像が見えてしまいます。
(※キャッシュによって2回目からははじめから大きな画像が出ている場合もあります)

この問題を解決するのがjQueryのreadyです。
先に書いたスクリプトを少しだけ変更してreadyを使った書き方に変えてみます。

CODE:
  1. <html>
  2. <head>
  3.  <script type="text/javascript" src="jquery-1.4.1.js"></script>
  4.  <script type="text/javascript">
  5.  $(document).ready(function(){
  6.      $('#book1').width(370).height(600);
  7.  });
  8.  </script>
  9. </head>
  10. <body>
  11.  <img id="book1" src="http://blog.ecstudio.jp/wp-content/uploads/2010/01/book-185x300.jpg" style="margin: 10px">
  12. </body>
  13. </html>

こちらのコードを実行してみるといかがでしょうか?
はじめから大きな画像が出ているのではないでしょうか。
もちろん動作はキャッシュを消しても変わりません。
この挙動の秘密はreadyとonloadの実行タイミングの違いにあります。

onloadとreadyの実行タイミングの違いを先にざっくり示します。

●onloadの場合
1、ドキュメント構造完成

2、画像読み込み・レンダリング

3、onloadイベントの実行(今回は画像の操作)

●readyの場合
1、ドキュメント構造完成

2、readyの実行(今回は画像の操作)

3、画像読み込み・レンダリング

このように
onloadの実行タイミングはすべてのドキュメント構造が完成して、
画像の読み込みが行われた後になります。
つまりこの読み込み時点では、画像は小さいままのものになっています。
ところがreadyの場合、ドキュメント構造が完成した直後に呼ばれます。
もちろん画像が読み込まれる前になります。
そのため、先にjavascriptで画像のサイズを変更した後に画像を読みこむので、
はじめから画像はサイズが変更されているものが表示されるように見えるのです。

以上のことから
readyを利用することでドキュメント構造の生成順番をそれほど意識する必要がなく
<head>タグ内にもDOMの操作を行うスクリプトを記述できるのです。

実はこのreadyの実行タイミングはDOMContentLoadedというイベントを利用すればFireFoxなどでは同じ動きのものが実現できます。
しかし、Internet ExplorerではDOMContentLoadedが存在しません。
そのため、同じような挙動をさせるには別の方法で実装する必要があります。

jQueryはブラウザ間の違いを吸収してくれるクロスブラウザなライブラリなので、
どのブラウザでもreadyを利用するだけで同様の挙動を実現することができます。
(ブラウザに依存しないところもまたひとつのメリットであると言えるでしょう。)

readyを利用するとブラウザの問題やドキュメント構造の構築タイミングを
考慮する必要がなくなるので安心してスクリプトを記述できます!^^

以上、触ってみてプログラマ視点で魅力的に感じた部分を上げてみました。
もし、まだ利用されていないという方でしたらぜひ使ってみてはいかがでしょうか!?

こちらでダウンロードできます。
http://jquery.com/


関連した記事:

■ 「日本でいちばん社員満足度が高い会社の非常識な働き方」

日本でいちばん社員満足度が高い会社の非常識な働き方

この記事へのコメント (0)

コメントはまだありません。

コメントを投稿

取材に関するお問い合わせ


(担当:大崎)

EC studio 採用情報の詳細はこちら

投稿者
全ECスタッフ導入の
おすすめソフトウェア
人気のエントリー
カテゴリー
最近のエントリー
アーカイブ

BLOG オフィシャルブログ

社長ブログ
EC studio社長ブログ

ブログを読む

技術ブログ
技術部のブログ

ブログを読む

デザインブログ
デザイン部のブログ

ブログを読む

Copyright© EC studio, All Rights Reserved.