jQuery 基本 (2)

関数とかメソッドの定義の仕方が良く分からないので、調べてみた。まとめると、こんな感じかな?

関数定義

function をつけて定義する。引数はカンマ区切りで複数指定できるし、なければ省略も可能。戻り値は return で返す。一番、シンプルな書き方がこれ。

function foo(arg) {
  // 処理
};

ちなみに関数を変数に代入させて保持させることができる。こんな感じ。

var foo = function(arg) {
  // 処理
};

メソッド定義

jQuery オブジェクトにメソッドを追加する場合、$.fn に対して定義する。

(function($) {
  $.fn.foo = function(arg) {
     // 処理
  };
})(jQuery);

たとえば jQueryオブジェクトにlogメソッドを追加する場合、こんな感じに書く。メソッド内ではthisでjQueryオブジェクトを呼び出せる。

(function($){
  $.fn.log = function() {
    console.log(this);
  }   
})(jQuery);

jQuery(function($) {
  $("div").log();  // コンソールへのログ出力
});

任意の引数

必須の引数は arg1, arg2 のように定義して、それ以外はハッシュ形式で渡す。
$.extend(arg1, [arg2, …]) はarg1にarg2を上書きするので、デフォルト値のハッシュを準備しておいて、そこに options をマージするのが良さそう。ちなみに $.extend の最後の || {} は options がない場合のエラー対策。

(function($) {
  $.fn.foo = function(arg1, arg2, options) {
    var defaults = {opt1: "def1", opt2: 111, opt3: true };
    var opts = $.extend(defaults, options || {});
    console.log(opts.opt1 + " " + opts.opt2 + " " + opts.opt3);
  }
})(jQuery);

jQuery(function() {
  $('div').foo("req1","req2", {opt1: "opt1", opt2:222});
});

リフレクションっぽいメソッド実行

普通にメソッドを実行する場合、こんな感じに書く。

$('div').foo("あああ");

同じ意味で、こんな書き方ができるらしい。

$('div')['foo']("あああ");

何がうれしいかというと処理を動的に変更できるってこと。たとえば

<dt>用語:</dt>
<dd>説明だよー。</dd>

があって、この <dd> 部分の表示を show/hide で切り替える場合、こんな感じに書く。

jQuery(function(){
  $('dt').click(function(){
    target = $(this).next();
    if (target.is(':visible')) {
      target.hide();
    } else {
      target.show();      
    }
  })
})

切り替えをアニメーション表示にする場合、fadeIn/fedeOut でこんな感じに書き換える。

jQuery(function(){
  $('dt').click(function(){
    target = $(this).next();
    if (target.is(':visible')) {
      target.fadeOut(300);
    } else {
      target.fadeIn(300);      
    }
  })
})  

これらをリフレクションっぽい書き方にすることで、切り替え形式を選択できるようになる。こんな感じ。

(function($){
  $.fn.effect = function(options){
    opts = $.extend({show: 'show', hide: 'hide', duration: null}, options || {});
    target = $(this).next();
    if (target.is(':visible')) {
      target[opts.hide](opts.duration);
    } else {
      target[opts.show](opts.duration);      
    }
  };
})(jQuery);

show/hide の動作をさせたい場合、こんな感じ、

jQuery(function($){
  $('dt').click(function(){
    $(this).effect();
  });
});

fadeIn/fadeOut の動作をさせたい場合、effect にパラメータを渡して、こんな感じに書く。

jQuery(function($){
  $('dt').click(function(){
    $(this).effect({show: 'fadeIn', hide:'fadeOut', duration: 300});
  });
});

プラグインとか作りたくなると必要になるテクニッックっぽい。 :-)

おまけ

JavaScript では this (DOMオブジェクト) を自己参照できる。jQuery オブジェクトの方が扱いやすいので $(this) として使う。

$(this).html("コメント").css("color","red");

$(this) を繰り返し使う場合、self に代入して書くと可読性が良くなる。

var self = $(this);
self.html("コメント").css("color","red");