jQuery プラグインの書き方メモ
勉強のために超簡単な jQuery プラグインを書いてみたら、凄腕 JSer の方々に色々とご指導ご鞭撻いただいたので、忘れないようにメモる。
オレオレ jQuery プラグインテンプレート
(function($) {
$.fn.pluginName = function(options) {
/**
* Option
*/
options = $.extend({
opt1: 'val',
opt2: 'val'
}, options);
/**
* Core
*/
return this.each(function() {
// Process
});
/**
* Method
*/
function _methodName() {
};
};
}(jQuery));
/**
* Execute
*/
$(function() {
$(".foo").pluginName();
});
メソッドのまとまりを、コンストラクタの前と後ろのどっちに書くべきか、未だに迷い続けてる・・。関数リテラルだと前に書かないといけないし、function文なら前でも後ろでもいいぽいけど。
$.fn ってそもそも何なの・・
$.fn は $.prototype のエイリアスなのだそうです。
$.fn === $.prototype //=> true
jQuery オブジェクトをつくるときの $('.foo') とかいうのも、実は jQuery が裏で new をしていて、セレクタを引数にとって jQuery クラスのインスタンスを返していたらしい。これによって jQuery オブジェクトは、jQuery クラスで用意されている便利なメソッドが使えるようになってたわけですね。
なので、$.fn.pluginName というのは、jQuery クラスのプロトタイプに pluginName というメソッドを追加しているということになります。プラグインを読み込んで $(".foo").pluginName(); とか実行するっていうのも意味が分かった。なるほど。
(function($) {...}(jQuery)); で囲む
別の JavaScript のコードと変数名や関数名がぶつからないように、一番外を (function($) {...}(jQuery)); で囲むことにした。$.fn.pluginName = function(options){...}; の中ですべて完結するなら別に書かなくてもいいんだけど、もし何かを外に出したくなったときのために、あらかじめカプセル化することにしてみたけどしつこいかな・・?
return this; の位置
よくある jQuery プラグインだと、コードの最後に return this; って書かれてる場合が多いと思うけど、これはコンストラクタの this.each(function() {...}); の前に return をつけて、return this.each(function() {...}); ってしてる。
この方法だと、プラグインの頭の方で this を返していることが分かるメリットがあるそうです。
関数はループの外に
関数が .each の中にあると、ループ毎に関数が作られてしまうので、ループの外に置くようにします。
子要素から検索する
this を each で回して、その子要素から検索するという場合、書き方がいくつかあって、私はもともと $(".foo", this); って書いていたのだけど、.find() を使う方がおすすめらしい。this の書き忘れによる思わぬバグを防ぐというメリットがあるそうです。
.click よりも .on
まだこのへんちゃんと理解できてないけど .click(function(){...}); よりも .on('click', functiin() {...}); の方がいろいろ応用がきくそうです。.on 以外にも、.bind、.delegate とかあるけど、jQuery1.7 からは .on が推奨らしいのでコレ使ってみました。
そのあたりの詳しいことは、下記のページでわかりやすくまとめてあったすごい。
jQuery 1.7の更新内容をまとめたよ。 | Ginpen.com
教えてくれてありがとう!!!