Notes開発者のためのXPagesデザインレシピ

簡単でCoolなXPagesアプリケーションを作るための情報を発信していきます

コーディング

夏期集中講座 jQuery基礎1

image

 

jQueryって何?

jQueryは、JavaScriptを効率よく書くための拡張ライブラリです。prototype.jsを見たJohn Resig(ジョン・レッシグ) が、「俺ならもっと効率的に書けるよ!」と開発を始め、2006年8月にVer1.0が公開されました。prototype.jsと同じく「$」という関数名を使用しているため、jQueryとprototype.jsを同時に使用しようとするとバッティングが起こります。(バッティングさせない記述方法もあります。)ライセンスはMITライセンスとなっており、ライブラリの著作権表示を消さなければ、商用・非商用を問わず、誰でも自由に利用することが出来ます。

一つ注意していただきたいのは、jQuery自体はUIコンポーネント(Webアプリの画面を作るための部品)ではなく、コーディングをより効率化するためのライブラリであるという点です。jQueryを使った代表的なUIコンポーネントには、PCブラウザ用のUIコンポーネントである「jQueryUI」や、モバイルブラウザ用のUIコンポーネントの「jQueryMobile」などがあります。他にもBootstrapやjqPlotなど有償、無償を含め、いろいろな物がリリースされています。

【UIコンポーネント一例】

ライブラリ(プラグイン) 機能
jQueryUI PCブラウザ用のUIコンポーネント
jQueryMobile モバイルブラウザ用のUIコンポーネント
Bootstrap レスポンシブデザインのためのUIコンポーネント
jqPlot チャートを書くためのUIコンポーネント

 

$って何?

jQueryを解説しているサイトを見ると、こんな書き方がされています。

//書き方1
jQuery(function($){
	$("#color_div").css("color","red");
})
//書き方2
$(function($){
	$("#color_div").css("color","red");
})

書き方1も書き方2も同じ処理です。最初にある「jQuery」や「$」って何でしょう?簡単に言うと、関数とかクラスだと思えば良いでしょう。正式名はjQueryですが、別名(エイリアス名)として$という記述でも使えるようになっています。「$」という名前の関数と聞く、何か変な感じがしますが、JavaScriptでは$という記号だけの名前を持った関数が作れるのです。(LotusScriptでは$という記号だけの関数は作れませんね。)どっちで書いても同じなので、処理の部分を下記のように書いても動作します。

jQuery("#color_div").css("color","red");

動作は同じになりますが、jQueryと書くのと$と書くのでは、文字の数に応じて通信量が変わってくるので、普通は$と書いた方が良いでしょう。

 

$(function($){って本当に必要?(onLoadイベントとの違い)

まず標準的なHTMLの動作としてはどうなるかを解説します。$(function($){は正式に書くと下のように記述することが出来ます。

$(document).ready(function($){
	//ここに処理を書く
});

こう記述すると、「何がしたいのか?」がわかりやすくなりますね。ドキュメントが読み込まれて「DOMが構築されたら処理が実行する」という動作になります。これに似た処理として<body>タグのonLoadイベントがあります。じゃぁ、onLoadイベントでも良いんじゃね?という話になるのですが、ところがギッチョン!それは違います!

$(function($){はDOMが構築された時点で実行されますが、onLoadイベントは画像など、すべてのリソースが読み込まれてから実行されます。用途にもよりますが、基本的には$(function($){の中に記述した方がパフォーマンス的に有利となります。

 

XPagesの場合はどうなる?(dojoとの共存)

では、XPagesに実装した場合の動作はどうなるのでしょう?実験してみるとわかりますが、$(function($){と、XPagesのonClientLoadイベントはほぼ同時に実行されます。(正確にはonClientLoadが少し先に実行されます。)これはデフォルトでXPagesに読み込まれているdojoが「DOMが構築されたら処理が実行される」という動作を実現してくれるためです。なので、XPagesに組み込まれているdojoとjQueryを併用した場合、$(function($){は「なくても動作する」ということになります。

例えば、XPageのソースタブに下記のソースを書いてみると、どちらも同じ動作になります。個人的にはページの読み込み時に実行する場合は書き方1、それ以外のボタンのイベントなど(DOM構築後)に記述する場合は書き方2で良いかなと思います。(標準的なHTMLを学んできた人にとってもわかりやすい。)

//書き方1
<script>
	$(function($){
		$("p").css("color","red");
	});
</script>
//書き方2
<script>
	$("p").css("color","red");
</script>

 

実験結果

下記のようなソースをXPagesのソースタブに書き込み、init1()をXPagesのonClientLoadイベント、init2()を<body>タグのonLoadイベントで実行すると、結果はアニメgifのようになります。(読込をわかりやすくするために大きな画像をXPages上に配置しています)コンソールには、現在の時間をミリ秒で出力しているので、どの順番で処理が実行されているかがわかります。

<script>
    $(function(){
        console.log("jQuery function");
        console.log(+new Date());
    });
    function init1(){
        console.log("onClientLoad");
        console.log(+new Date());
    }
    function init2(){
        console.log("body onLoad");
        console.log(+new Date());
    }
</script>

view1

 

おまけ:dojoを読み込ませないようにするには

dojoを読み込まないXPagesアプリを作るには、パッケージエクスプローラでアプリケーションを開き、「xsp.properties」のSourceタブに下記のコードを追記します。

xsp.client.script.libraries=none
xsp.theme=<empty>

image

これでdojoを使わず、心置きなくjQueryだけでXPagesアプリを作ることが出来ます。、あまりオススメしません。XPagesのイベントを始め、dojoを使ってるコンポーネントはすべて動作しなくなります。素のHTMLで記述する形になりますので、使いどころとしてはWebデザイナーさんとコーダーさんにCOOLなデザインのWebページを作って貰って、それをXPagesアプリに転用したい場合などに限られるのではないかと思います。

 

次回予告

次回は夏期集中講座第2弾として、jQueryの四段活用について解説します。