2

次の方法で、いくつかの一般的なアプリケーション固有のアクションをjQuery プラグインに移動しようとしています。

$.fn.extpoint = function() {...}

しかし、いくつかの拡張ポイントを宣言したくありません。

$.fn.extpoint1 = function() {...}
$.fn.extpoint2 = function() {...}
...

代わりに、次のような構文シュガーを使用したいと思います。

$("#id").extpoint.func1().extpoint.func2()

定義付き:

$.fn.extpoint = {}
$.fn.extpoint.func1 = function() {
    this.val();
    this.data("ip");
    ...
    return this;
}

そして呼び出します:

$("#id").extpoint.func1(...)

this評価時に、元の jQuery オブジェクトの代わりに ( 、、... 要素$.fn.extpointを持つ辞書) を指します。func1func2func1

jQuery プラグインを拡張可能にすることはできますか?

PS。関数名を最初の引数として渡し、拡張ポイントへの呼び出しを$.fn.extpoint実装することができます (名前と実装の間の関連付けを内部辞書に保存します)。$.fn.extpoint('extend', func)その場合、ユースケースは次のようになります。

$("#id").extpoint('func1', ...).extpoint('func2', ...)

しかし、私はより多くの構文糖衣を作る方法を探しています...

4

2 に答える 2

2

私が求めるタスクは実行するのが難しいです。

公式ドキュメントは次のように述べています。

jQuery.fnどのような状況でも、単一のプラグインがobjectで複数の名前空間を要求するべきではありません:

(function( $ ){
  $.fn.tooltip = function( options ) { 
    // THIS
  };
  $.fn.tooltipShow = function( ) {
   // IS
  };
  $.fn.tooltipHide = function( ) { 
    // BAD
  };
})( jQuery );

$.fn名前空間が乱雑になるため、これは推奨されません。これを解決するには、プラグインのすべてのメソッドをオブジェクト リテラルに集め、メソッドの文字列名をプラグインに渡して呼び出す必要があります。

this別のアプローチは、http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.jsのようにリンクを維持することです

したがって、呼び出しは次のようになります。

$.fn.addPlugin('test2', {
    __construct : function(alertText) { alert(alertText); },
    alertAttr   : function(attr) { alert($(this).attr(attr)); return this; },
    alertText   : function() { alert($(this).text()); return this; }
});

$('#test2').bind('click', function() {
     var btn = $(this);

     btn.test2('constructing...').alertAttr('id').alertText().jQuery.text('clicked!');

     setTimeout(function() {
             btn.text('test2');
     }, 1000);
});

関連リンク:

古いスタイルのプラグイン拡張:

于 2013-03-13T22:01:19.613 に答える
1

プラグインの作成の概要は次のとおりですあなたが求めているのは「連鎖」と呼ばれるものだと思います。これが jQuery を非常に使いやすくしている理由であり、正しく実装していることを確認したいのは良いことです。

連鎖に関してプラグインを開発する際に覚えておくべき重要なことは、常にreturn this;メソッドから行うことです。それこそが、あなたが連鎖を続けることを可能にするものです。

于 2013-03-13T15:15:21.897 に答える