6

プラグインオーサリングのjqueryドキュメントを読み、それに精通しています。ただし、与えられた例は常に、以前に一致した要素のセットで動作します。次の両方を実行できる関数を作成したいと思います。

// example usage of my to-be-created plugin function

// this is the way described in the docs, and I know how to do that
$("a").myFunction ()

// but I also want to be able to call the function without a collection:
$.myFunction ();

操作するコレクションなしでが呼び出された場合$.myFunction ()、一致する要素の独自のコレクションが作成されます。これは一種の初期化プロセスです(ただし、必ずしも1回だけ実行する必要はありません)。また、$.myFunction ()連鎖性を維持する必要があります。

私が達成したいことの擬似コード:

// [...]
function myFunction (): {
    if (notCalledOnACollection) {
        // this should run when called via $.myFunction ()
        $elements = $("a.myClass");
    }
    else {
        $elements = $(this);
    }
    return $elements.each (function () {
        // do sth. here 
    });
}

私は本当にすべての関数の実装/機能を単一の関数定義内に保持し、jQueryオブジェクト内の2つの別々の場所に2つの別々に名前が付けられた関数または2つの同じ名前の関数を持たないようにしたいです。

そしてもちろん、実行するステートメントmyFunction (do_init)のブランチを示すパラメーターを追加することもできますifが、それは私の引数リストを乱雑にします(複数のプラグインにそのアプローチを使用したいのでmyFunction ()、簡単にするためにここで省略した引数があります)。

何か良い提案はありますか?

4

1 に答える 1

8

プラグイン定義に別の参照を追加するだけで、標準のプラグインコードを簡単に使用できます。

(function( $ ) {
    $.myPlugin = $.fn.myPlugin = function(myPluginArguments) {
        if(this.jquery)
            //"this" is a jquery collection, do jquery stuff with it
        } else {
            //"this" is not a jquery collection
        }
    };

    $.fn.myPlugin.otherFunc = function() {
    };
})( jQuery );

ここでの唯一の違いは、$.myPlugin =jqueryのセレクター関数を実行せずにプラグインを直接呼び出すことができる部分です。他の関数またはプロパティが必要であると判断した場合は、プラグインのプロパティとしてそれらを作成できます。

使用法:

//using a selector (arguments optional)
$(".someClass").myPlugin();

//using the options variable - or whatever your arguments are
$.myPlugin({id: "someId"});

//accessing your other functions/properties
$.myPlugin.otherFunc();
于 2012-09-14T07:20:22.117 に答える