5

$.fn を汚染せずに連鎖可能な関数を作成するには? プラグイン内で使用するためだけに関数を記述します。出来ますか?

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

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

アップデート。私の場合の最善の解決策は、拡張メソッドです。

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();

答えてくれてありがとう!

4

3 に答える 3

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 チェーン可能ではなくなりました。$("obj").test().addClass("test")独自の API を返すため、 を使用することはできません。

于 2013-02-22T16:58:35.610 に答える
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 オブジェクトにも通常どおりアクセスできます。

于 2013-02-22T17:16:15.557 に答える
0

を呼び出すa.foo()と、関数foothisset toで呼び出されaます。これを有利に利用できます。

また、式 は、関数内からa.foo()取得したものに評価されることを思い出してください。return

だから、ただ戻ってthisください。

その後、a.foo()に評価されa、を呼び出し(a.foo()).bar()てから呼び出すことと同等になります ... つまり、!に対する連鎖操作です。a.foo()a.bar()a

$.fn特に魔法のようなものではありません — 単に上記のロジックをあなたがやろうとしているのと同じように使っているだけです.

于 2013-02-22T17:00:52.837 に答える