2012-05-06 6 views
2

次のパターンを使用してjqueryプラグインを作成していますが、bar関数が本来の値を返すようにしたいのですが、代わりに$(this)が返されるようです。
コードに問題がありますか?jQueryプラグイン関数に組み込み値を返させる方法

(function($){ 

    var Foo = function(elements, options){ 
    ... ... 
    } 


    Foo.prototype = { 

     constructor: Foo, 

     bar: function(){ 
      var value = ...   
      // do something here 
      return value; 
     }, 

    } 

    $.fn.foo = function (option, kwargs){ 
     return this.each(function(){ 
      var $this = $(this), 
       data = $this.data('foo'), 
       options = typeof option == 'object' && option 

      if (!data) $this.data('foo', (data = new Foo(this, options))) 
      if (typeof option == 'string') return data[option](kwargs) 
     })    
    } 


})(jQuery) 
+0

固有:「事自体から切り離せない固有の生得、、、必須」* * ...私はしないでくださいそれを得る – Hubro

+0

@Codemonkeyは、intのような値だけを返します。ここで文字列を返すようにします – Jensen

+0

謝辞ありがとうございました – Hubro

答えて

5

いいえ、コードは正しいです。問題は、現在、常にjQueryセレクタ(戻り値this.each)を返すように設定されていることです。代わりに、あなたの関数の結果を返すには、あなたはとても似$.fn.fooのためにあなたの機能を変更することができます:

$.fn.foo = function (option, kwargs){ 
    var retval = null; 

    this.each(function(){ 
     var $this = $(this), 
      data = $this.data('foo'), 
      options = typeof option == 'object' && option 

     if (!data) $this.data('foo', (data = new Foo(this, options))) 
     if (typeof option == 'string') { 
      retval = data[option](kwargs); 
     } 
    }) 

    if (!retval) { 
     retval = this; 
    } 

    return retval; 
} 
+0

それは動作します。ありがとう。 – Jensen

1

外部関数では、return this.each(...); `を書きました。

this.eachは常に(連鎖のために)呼び出すjQueryオブジェクトを返します。それを渡すコールバックの戻り値は無視されます。

コールバックから値を返す場合は、その値を変数に入れてから、eachを呼び出した後に変数を返します。 (これはeachが非同期ではないため動作します)。
2つの要素を持つjQueryオブジェクトに対してメソッドが呼び出された場合の対処方法を理解する必要があります。 eachコールを完全に取り除きたい場合があります。

+0

jQueryオブジェクトではなく、文字列またはintを返す方法は? – Jensen

+0

@ Jensen:あなたのメソッドから '.each'以外のものを' return'することによって。私の答えの後半を参照してください。 – SLaks

関連する問題