2011-02-04 1 views
4

を学ぼうとだから私はこの例に基づいてプラグインの方法コレクションを実装する方法を学習しようとしている:私は理解できない何http://docs.jquery.com/Plugins/Authoringは、jQueryのプラグインの開発に

は、プラグインのデフォルトで拡張されたオプションを取得する方法です個々のメソッドに送信されます。

私は元のオプションは、ここでの方法にかなり確信して送信されますよ:

return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); 

それでは、どのようにデフォルトでこれらの引数を拡張することができますか?例では、実際にこれを行う方法を定義していない...

var methods = { 
     init : function(options) { 

      return this.each(function(){ 
       $(window).bind('resize.tooltip', methods.reposition); 
      }); 

     } 
} 

はまた、ここでのオーサリング・ページをプラグインの例からのコードは次のとおりです。

(function($){ 

    var methods = { 
    init : function(options) { 

     return this.each(function(){ 
     $(window).bind('resize.tooltip', methods.reposition); 
     }); 

    }, 
    destroy : function() { 

     return this.each(function(){ 
     $(window).unbind('.tooltip'); 
     }) 

    }, 
    reposition : function() { // ... }, 
    show : function() { // ... }, 
    hide : function() { // ... }, 
    update : function(content) { // ...} 
    }; 

    $.fn.tooltip = function(method) { 

    if (methods[method]) { 
     return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
    } else if (typeof method === 'object' || ! method) { 
     return methods.init.apply(this, arguments); 
    } else { 
     $.error('Method ' + method + ' does not exist on jQuery.tooltip'); 
    }  

    }; 

})(jQuery); 

答えて

3

をretriev私の前の答えは、私が以前考えられていたよりもマークに近かったように見えます。

はい、この行は引数に渡している:

return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 

.apply()を使用して、あなたは、メソッドを呼び出して、そのコンテキスト(this値)を変更し、それを引数の代わりに、個々のコレクションを与えることができます。引数を渡す必要があるかどうかわからない場合は便利です。

だから、あなたがダウンし、このように上記の行を破ることができます。

// reference the arguments passed to the plugin 
var args = arguments; 

    // eliminate the first one, since we know that's just the name of the method 
args = Array.prototype.slice.call(arguments, 1) 

    // call the method that was passed, 
    // passing along the Array of the arguments (minus the first one), 
return methods[method].apply(this, args); 

// Note that it is being called from the context of "this" which is the jQuery object 

をので、プラグインは、このように呼ばれていた場合:

$('.someElem').tooltip('destroy', 'someArg', 'anotherArg'); 

コードが"destroy"方法を見つけるだろう、のオフスライス"destroy"残りの引数の配列に沿って"destroy"を呼び出します。

+1

うん!間違いなく私が知りたかったことの一部。したがって、残っている唯一のことは、プラグインによってデフォルト設定で渡されたオプション(引数)を拡張する場合です。私はこれがinitメソッドの中から起こらないことを期待していますが、もしそうであれば、リテラル内の他のメソッドの中でどのようにアクセスできますか? – Jeff

+0

@ジェフ:プラグインに完全に依存します。それぞれのメソッドを別々に扱い、引数を受け入れる必要があるかどうか(または単一のオプション引数)、そしてデフォルトを持つべきかどうかを判断する必要があります。ですから、 'init'がデフォルトを持つオプションを持つのが理にかなっているなら、そこで行います。他のメソッドのいずれかが独自の引数を必要とする場合は、自分自身を受け入れます。これはあなたが意味するものなのですか、間違ったトラックにいますか? – user113716

+0

...私は、このチュートリアルでは、プラグインを開発する際の特定のパターンの例を挙げています。これは唯一の方法ではありませんが、呼び出す必要のあるメソッドが複数ある場合は、すべての名前を1つのプラグインの下に置きます。 – user113716

1

あなたは$.extend(existingObject || {} (new object), oneObject, secondObject, nthObject)

var mydefaults = { myDefaultArg : "foo" } 
var inputOptions = { myDefaultArg : "Somethin else" } 

var options = $.extend({}, mydefaults, inputOptions); 

options.myDefaultArg == "Somethin else"; 
を使用

データにアクセスしたり、データを保存するには、データメソッド

を使用することができます。 eプラグイン、 "this"はjquery要素要素です。データを保存することができます。

$(this).data("pluginname.somedataname", data); 

し、それを

var data = $(this).data("pluginname.somedataname"); 
+0

右、私は拡張機能の使い方を理解しています。私はおそらく私が持つことができるように質問をしなかったでしょう。私の質問は、最初の$( 'el')。tooltip(options)からオプションを渡す方法と、 "method"リテラル内からそれらにアクセスする方法です。 – Jeff

+0

は私のアップデートを使用できますか? – Luke