6

プラグインの書き込みを少し分岐させたいと思っており、それらを「名前空間」できるようにしたいと決めました。$.methodこれまでのところ、ものをに書き換えるのは$.namespace.method簡単でした。

私が抱えている問題は、のような要素メソッドを作成することですが$('element').method()、名前空間を使用することです。たとえば$('element').namespace.method()。いくつかの回避策を試して作成できますが、そのメソッド内から$.fn.namespace.method呼び出すと、取得したいものではなく、取得するだけです。this$.fn.namespace'element'

例: を呼び出す場合$('body').namespace.test()、メソッド内で、要素testになりたいthis<body></body>

これをどのようにやってのけるかを考え出す助けは大歓迎です。いつものことを考えすぎているだけなのかもしれません。

現在、これまでのところ、うまく機能していないようなものに対して可能な回避策を試み$('body').namespace().method()ています... :P

4

4 に答える 4

2

お勧めしませんが、 への呼び出しごとに新しいオブジェクトを生成できますnamespace()

(function($){

    var plugin = {
        test: function (){
            console.log(this);
        }
    };

    var methods = Object.keys( plugin );

    $.fn.namespace = function (){

        var self = this,
            localMethods = {};

        $.each(methods, function () {
            localMethods[ this ] = plugin[ this ].bind(self);
        });

        return localMethods;
    };

}(jQuery));

これがフィドルです:http://jsfiddle.net/WaXzL/


古いブラウザーの場合はポリフィルObject.keysするか、methods配列を手動で作成することができます。

同じことがbind言えます:ポリフィルするかcall、手動で。

古いブラウザで動作するバージョンは次のとおりです。

(function($){

    var plugin = {
        test: function (){
            console.log(this);
        }
    };

    var methods = [];

    for ( var i in plugin ) {
        if ( plugin.hasOwnProperty(i) ) {
            methods.push(i);
        }
    }

    $.fn.namespace = function (){

        var self = this,
            localMethods = {};

        $.each(methods, function (i, method) {
            localMethods[ method ] = function () {
                plugin[ method ].call( self );
            };
        });

        return localMethods;
    };

}(jQuery));

そして、ここにフィドルがあります:http://jsfiddle.net/WaXzL/1/

于 2013-07-17T15:48:06.877 に答える
2

する代わりにどうですか:

$('element').namespace.method()

あなたはそれを単純化して行います

$('element').namespace('method')

代わりは?これははるかに簡単です:

(function($){
    var methods = {
        test: function(a, b){
            console.log(this, a, b);
        }
    };

    $.fn.namespace = function(method){
        var params = Array.prototype.slice.call(arguments, 1);
        return methods[method].apply(this, params);
    };
}(jQuery));

次に、次のようにします。$('body').namespace('test', 1, 2);

于 2013-07-17T15:59:55.380 に答える
2

より良い解決策は、メイン メソッドを 1 つだけにして、メソッド名を文字列として渡すことです。

(function($){

    var plugin = {
        test: function (){
            console.log(this);
        },
        otherTest: function (){
            console.log(this);
        }
    };

    $.fn.namespace = function (method){
        var args = Array.prototype.slice.call(arguments, 1);
        return plugin[ method ].call(this, args);
    };

}(jQuery));

これがフィドルです:http://jsfiddle.net/yYNDH/

于 2013-07-17T16:05:06.360 に答える