Ajaxフレームワークのプラグインの仕様比較と作成方法について。
個人的によく使うprototype、jQuery、mootoolsのプラグインテンプレートとサンプルソースをそれぞれ載せてます。
短いソースならベタ書きでも悪くはないけど、使いまわしが効いたり、衝突が起きなかったりと
大掛かりなものになればなるほどメリットはあるので、よく使うなら覚えておいて損はないと思う。
でもプラグインを作ること自体はそう難しくなくても、理解するのが大変なんだよな。
どれか1つ把握してたら応用で他のも作れるようになるはず。ソースは私。
なお、適当に書いたサンプルソースは全て
「IDで指定した要素の文字色をオプションで指定した色に変える」という内容です。
また、あえてメソッドを動作させるようにしています。
ソースの説明書き加えた
mootools (ver1.2)
まず個人的に一番気に入ってるmootoolsから。
mootoolsのプラグインは特に決まった書式などは無く、Classで作成されているものが多いです。
Classという名前の通りPHPやJAVA等のクラスとほぼ同じ仕様なのでとっつきやすいと思われる。
var myClassName = new Class({
//渡されたクラスやオブジェクトのプロパティがクラスにコピーされるClass:Options実装
Implements: [Options],
//クラスのオプション(名前:デフォルト値)
options: {
myOption: ''
},
//コンストラクタ(optionsはインスタンス作成時に渡される値)
initialize: function(options) {
//渡されたオプションを追加
this.setOptions(options);
},
//クラスのメソッド
myMethod: function() {
}
});
この記事でPHPのクラスについて触れてますが、実にそっくりです。
Sample
解説の内容は以下prototypeとほぼ同じなので、prototypeでは省略しています。
//addEvent("domready"は)DOMが読み込まれたら実行します
window.addEvent('domready', function(){
//クラスのインスタンス作成。変数sampleに格納していますが、格納しなくても実行されます。
//#testの文字色を青色にする
var sample = new mySampleClass($("test"),{color:"blue"});
});
//mootoolsのClass()で新しいクラスを作成する
var mySampleClass = new Class({
//渡されたクラスやオブジェクトのプロパティがクラスにコピーされる
Implements: [Options],
//クラスのオプション(オプションの名前:デフォルト値)
options: {
color: 'red'
},
//コンストラクタ
//elementは$("test")、optionsは{color:"blue"}が渡されます
initialize: function(element,options) {
//渡されたオプションを追加
this.setOptions(options);
//配列へオプションの値を格納します
this.element = element;
this.color = this.options.color;
//メソッド実行
this.addColor();
},
//クラスのメソッド
addColor: function() {
//elementで渡された要素にスタイル属性でcolorプロパティを追加します。
//セットするのはオプションで渡された色
this.element.setStyle("color",this.color);
}
});
テンプレートと同じにするためメソッドを使って書いていますが
initialize()にaddColor()の内容を書いても同じ結果が得られます。
mootoolsカテゴリーやタグで書き散らしたクラスソースが見れるのでそちらも参考にどうぞ。
jQuery (ver1.3.1)
jQueryはプラグインの多さで有名。プラグインの書式は定型があるのでそれに沿って作れば大概動く。
外部ファイルに保存する場合はファイル名を「jquery.プラグイン名.js」にすること。
以下2つ並べて書いてますが内容は同じ。
(function(jQuery) {
//jQuery名前空間にプラグイン名を登録します
jQuery.fn.mySamplePlugin = function(options){
//オプションとデフォルト値
var options = jQuery.extend({
myOption: "",
}, options);
//要素を変数へ格納
var $this = jQuery(this);
//メソッド
function myMethod(){
alert($this);
}
//実行
myMethod();
};
})(jQuery);
(function($){
$.extend({
mySamplePlugin: new function(){
//オプションとデフォルト値
var options = {
myOption: ""
};
//メソッド
this.myMethod = function(options){
alert($(this));
}
}
});
//jQuery.fnにメソッドを追加
$.fn.extend({
mySamplePlugin:$.mySamplePlugin.myMethod
});
})(jQuery);
前者はjQuery、後者は$を使っていますが、プラグインの中でjQueryの代わりに$を使う場合は
(function($) {省略})(jQuery)として引数で$を渡せばおk。
衝突を避けるためにもなるべく$は使わない方が良い。
Sample
$(document).ready(function(){
$("#test").mySamplePlugin({color:"blue"});
});
(function($){
$.extend({
mySamplePlugin: new function(){
this.options = {
color:"red"
};
this.myMethod = function(options){
$(this).css("color",options.color);
}
}
});
$.fn.extend({
mySamplePlugin:$.mySamplePlugin.myMethod
});
})(jQuery);
(function(jQuery) {
jQuery.fn.mySamplePlugin = function(options){
var options = jQuery.extend({
color: "red",
}, options);
var $this = jQuery(this);
var addColor = function(){
$this.css("color",options.color);
}
addColor();
};
})(jQuery);
prototype.js (upper ver 1.6)
prototype.jsのプラグインもClass.create()によるクラスの作成になる様子。
ver1.6から書き方が変わったらしい。
Event.observe(window, 'load', function() {
new myClassName("red","blue");
});
var myClassName = Class.create({
//コンストラクタ
initialize: function(option1,option2) {
//格納
this.myOption1 = option1;
this.myOption2 = option2;
//実行
this.myMethod();
},
//クラスのメソッド
myMethod: function() {
alert(this.myOption1 +" and "+ this.myOption2);
}
});
クラスの継承
Event.observe(window, 'load', function() {
new mySubClass("red");
});
var mySubClass = Class.create(myClassName,{
initialize: function($super, option) {
$super(option,'blue');
}
});
Sample
Event.observe(window, 'load', function() {
new mySampleClass ($("test"),"red");
});
var mySampleClass = Class.create({
initialize: function(element,color) {
this.element = element;
this.color = color;
this.addColor();
},
addColor: function() {
this.element.setStyle({color:this.color});
}
});
他にもフレームワークは色々とあるけど…
AdobeSpry、Dojo、MicrosoftAjax、YUI、Rico、MochiKit、Ext、Alfax、script.aclo.us…
似たようなもんだよな