2013-02-22 4 views
5

連鎖可能な関数を書くにはどうしますか?$ .fnを汚染しないでください。私のプラグインの中で使うための関数を書くだけです。出来ますか?ローカルで使用するためのjquery連鎖関数の書き方は?

$('.myclass').makeSomething().andOneMoreFunction().andLast(); 

正しいアプローチですか?

UPD。 私の場合は最善の解決策は、拡張メソッドです:

String.prototype.getMyLength = function(){return this.length;} 

そして今、私はこのような任意の文字列にこの機能を適用することができます。

var mystring = "test"; 
mystring.getMyLength(); 

それとも

"teststring".getMyLength() 

そして、それはチェーン可能にします:

String.prototype.getMe = function(){return this;} 
"string".getMe().getMe().getMe().getMe().getMe(); 

お返事ありがとうございます!

答えて

5

あなたは必要なものをチェーンすることができます。 $.fnを自分で定義する場合は、機能の最後にreturn thisを入力することが重要です。

自分でJavaScriptを書きたい場合は、チェーンすることもできます。それはただあなたが返すものに依存します。したがって、他のオブジェクトを返すと、そのオブジェクトからチェーンすることができます。これには戻り値が使用されます。機能上

var obj = { 
    test : function(){ 
     alert("Y"); 
     return this; 
    }, 
    test2 : function(){ 
     alert("2"); 
     return this; 
    } 
} 
obj.test().test2(); // And so on since it returns this 

jQueryのプラグインAPI

$.fn.test = function(){ 
    var methods = { 
     method0 : function(){ 
      alert("method0"); 
      return this; 
     } 
    }; 
    return methods; 
} 
var api = $("obj").test(); // Returns methods 
api.method0(); // Calling a function from the returned methods. 
// OR 
$("obj").test().method0(); 

jQueryのはもうチェーン可能ではありません。したがって、あなた自身のAPIを返すので、$("obj").test().addClass("test")を使用することはできません!

+1

しかし、問題は '$ .fn'を汚染することなくそれを行う方法です。プラグインで内部的にしかそれらの関数を使いたくなく、名前の衝突を避けたいのであれば、それは非常に合理的だと思います。 – 11684

+1

[警告 'を介して' 'console.log']を試してください(0120-338-331) –

+1

私の例2は質問に答えますか?私は、チェーンを使用する2つの例を挙げました。 2番目はAPIを返します。したがって、この方法でも内部的に使用することができます。あなたの戻り値だけに依存します。 @PaulS。これはちょうど擬似コードです。 – Niels

0

a.foo()を呼び出すと、thisaに設定して、関数fooが呼び出されます。これをあなたの利益に利用することができます。

また、の式a.foo()は、関数内からreturn dに評価されます。

したがって、は、ちょうどthisを返します。

その後a.foo()aに戻って評価され、(a.foo()).bar()aa.bar() ...つまりチェーンオペレーションを呼び出し、その後a.foo()を呼び出すのと同じになります!

$.fnは特に魔法のようなものではありません—これは、あなたがしようとしているのと同じ方法で上記のロジックを単純に使用します。

3

プラグインの関数の最初のパラメータを使用して選択方法を指定することで、汚染を回避できます。

(function() { 
    var o = { // object holding your methods 
     'bar': function() {console.log('bar', this); return this;}, 
     'foobar': function() {console.log('foobar', this); return this;} 
    }; 
    $.fn.foo = function (method /*, args*/) { 
     return o[method].apply(
      this, 
      Array.prototype.slice.call(arguments, 1) // pass your args 
     ); 
    }; 
}()); 

、その後

$('something').foo('bar').foo('foobar'); 
/* 
bar, thisobj 
foobar, thisobj 
*/ 

例えばあなたがあまりにも、通常通りjQueryオブジェクトへのアクセスを維持するこの方法です。

関連する問題