2011-12-04 10 views
6

たとえば、プラグインが適用された<select>からオプションが選択されたときに実行されるコールバック関数が必要なjQueryプラグインを作成しています。

私はこのように、あなたはそれを渡すオプションで関数を定義することを可能にするプラグインを見てきました:

$('div.foo').pluginBar({ 
    option1: 'red', 
    someEvent: function() { 
     // Do stuff 
    } 
}); 

私はプラグインのコードでデフォルトsomeEvent関数を定義することができるようにしたいが、もしユーザーが渡すオプションにその関数を定義すると、デフォルト関数を上書きする必要があります。これは$.extend()で可能ですか、間違った場所を見ていますか?

私はplugin authoringチュートリアルを見てきましたが、機能のデフォルト動作をどこでも拡張するとは限りません。私はinit:関数の使い方を読んだことがありますが、関数(の中にプラグインの名前空間)を定義し、プラグインに渡されるオプションで変更することができます。

+1

@ T.J.Crowder申し訳ありません、もっと個人的な欲求不満コメントでした。削除されます。 – Zirak

+0

JavaScript(他のほとんどの主要な現在の言語とは異なり)は、ファーストクラスのオブジェクトです。つまり、これを含め、他の種類のオブジェクト参照で実行できる関数参照でも同じことができます。答えは、どのように実証するのかを示しますが、取り除く重要なポイントは、関数参照はオブジェクト参照と同様の値であることです(オブジェクト参照であるため)。それは非常に便利です。 :-) –

+0

@ T.J.Crowder説明をありがとう。 – Bojangles

答えて

15

は、ここでの例です。

+1

++++高速回答。すべての友達におすすめ! #1^_ ^(真剣に、しかし、素晴らしい仕事) –

+0

ありがとうダーリン。私はこれがシンプルだとうれしいです。 – Bojangles

+0

ちょっと分かりましたが、私は分かち合うと思っていました - someEvent関数で 'div.foo'を利用できるようにするには、 "this"を引用符なしでパラメータとして渡してください。フィドル - http://jsfiddle.net/taytayevanson/LY3K7/ –

0

はい、関数値を持つオブジェクトを拡張できます。

var originalFunction = function() { 
    alert('original'); 
} 

var a = { 
    foo: 'bar', 
    func: originalFunction 
}; 

var b = { 
    foo: 'baz', 
    func: function() { 
     alert('ok'); 
    } 
}; 

var c = $.extend({}, a, b); 

c.func(); // alerts 'ok' 

は、JavaScriptでは、多くの場合、機能と他の値の間に実用的な違いがないので、あなたは、などの機能を扱うことができますでしょう他のオブジェクトまたはデータ型。

(function($) { 
    $.fn.pluginBar = function(options) { 
     var settings = $.extend({ 
      someEvent: function() { 
       alert('default'); 
      } 
     }, options); 

     return this.each(function() { 
      settings.someEvent(); 
     }); 
    }; 
})(jQuery); 

$('div.foo').pluginBar({ 
    option1: 'red', 
    someEvent: function() { 
     alert('custom'); 
    } 
}); 

プラグインをアップ配線するときにsomeEventを指定しない場合、デフォルトの1が使用されます。

8

javascriptでは、関数はファーストクラスのオブジェクトです。意味は、あなたがあなたのような他の変数の関数を使用することができます:あなたが見ることができるように

//making an anonymous function, and assigning it to a variable 
var meep = function() { 
    return 'meep'; 
}; 

//passing a function as a parameter 
[ 'moop' ].map(meep); //['meep'] 

//assigning it in an object literal 
var weirdNoises = { 
    'meep' : meep, 

    'slarg' : function() { 
     return 'slarg'; 
    } 
}; 

weirdNoises.meep(); //'meep' 
weirdNoises.slarg(); //'slarg' 

//you can also return functions 
function meeper() { 
    return meep; 
} 
function slarger() { 
    return function() { 
     return 'slarg'; 
    }; 
} 

//meeper returns a function, so the second() means "execute the function 
// that was returned" 
meeper()(); //'meep' 
slarger()(); //'slarg' 

を、機能は他の値のようなものです。したがって、関数になる既定のオプションを定義し、他のものと同じようにオーバーライドすることができます。

$.fn.weirdNoise = function (options) { 
    var defaults = { 
     makeNoise : function() { 
      return 'Rabadabadaba'; 
     }, 
     isSilly : true 
    }; 

    return $.extend(defaults, options); 
}; 

var raba = $('foobar').weirdNoise().makeNoise(); 
raba.makeNoise(); //'Rabadabadaba' 
raba.isSilly; //true 

var shaba = $('foobar').wierdNoise({ 
    makeNoise : function() { 
     return 'Shabadabadoo'; 
    } 
}); 
shaba.makeNoise(); //'Shabadabadoo' 
shaba.isSilly; //true 

実際の例ですが、その点を説明していると思います。