1

現在、jquery ガイドラインに従って記述された 2 つのプラグインがあります: http://docs.jquery.com/Plugins/Authoring

あるプラグインから名前空間イベントを発生させ、別のプラグインでキャッチするベスト プラクティスの方法は何ですか? ここの jsfiddle で状況のカットダウン バージョンを設定しました: http://jsfiddle.net/cMfA7/ - HTML と Javascript は以下のとおりです。

HTML:

<div id="container">
    <button id="click">Click Me!</button>
    <div id="result"></div>
</div>

Javascript:

/* ===========================
    Plugin that triggers event:
   =========================== */
(function( $ ){

  var methods = {
     init : function( options ) {

       return this.each(function(){
         $("#click").bind('click.pluginTrigger', methods.trigger);
       });

     },
     trigger : function( ) { 
         // TODO: Trigger to go here?

     }
  };

  $.fn.pluginTrigger = function( method ) {

    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    

  };

})( jQuery );

/* ===========================
    Plugin that handles event:
   =========================== */
(function( $ ){

  var methods = {
     init : function( options ) {

       return this.each(function(){
           // TODO: Binding on pluginTrigger event to go here (and call methods.result method below)?

       });

     },
     result : function( ) { 
        $("#result").text("Received!");
     }
  };

  $.fn.pluginBinder = function( method ) {

    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    

  };

})( jQuery );

/* ===============
    Initialisation
   =============== */
$("#container").pluginTrigger();
$("#container").pluginBinder();
4

1 に答える 1

2

名前空間は実際には適用されません。唯一の要件は、2つのプラグインがイベントの名前に同意することです。私の提案は、イベントをトリガーするプラグインがイベントの名前を持つ変数を持つことです。次に、消費者はその名前を使用できます。

// within your pluginTrigger plugin
var eventName = "pluginTriggerEvent";
$.fn.pluginTrigger.eventName = eventName;

// within your trigger method:
$(this).trigger(eventName);

// -------------------------------
// within your pluginBinder plugin init method:
$(this).on($.fn.pluginTrigger.eventName, methods.result);
于 2013-03-06T16:04:03.110 に答える