4

DIVを使用してHTML選択ボックスをカスタムドロップダウンに変換するプラグインを作成しました。

すべてうまくいきますが、もう少し良くしたいと思います。私のjsFiddleを参照してください

プラグインの最後に、slideDownOptionsとslideUpOptionsの2つのメソッドがあります。これらをプラグインの外部で使用できるようにして、他のイベントがアクションをトリガーできるようにします。

これを行う方法、より具体的にはプラグイン内とプラグインの外部の両方からメソッドを呼び出す方法について少し混乱しています。

どんな助けでも常に感謝します

4

2 に答える 2

13

オブジェクト指向コードを使用してプラグインをリファクタリングすることを検討してください。これにより、jQuery UI API のようなプラグイン用の API を作成できます。したがって、次のようなプラグイン メソッドにアクセスできます。

$('select').customSelect(); // apply plugin to elements
$('select').customSelect('resetOpacity'); // call method resetOpacity();
$('select').customSelect('setOpacity', 0.5); // call method with arguments

このようなプラグインを作成するための基本的なテンプレートは次のようになります。

// plugin example
(function($){
    // custom select class
    function CustomSelect(item, options) {
        this.options = $.extend({
            foo: 'bar'
        }, options);
        this.item = $(item);
        this.init();
    }
    CustomSelect.prototype = {
        init: function() {
            this.item.css({opacity:0.5});
        },
        resetOpacity: function() {
            this.setOpacity('');
        },
        setOpacity: function(opacity) {
            this.item.css({opacity:opacity});
        }
    }

    // jQuery plugin interface
    $.fn.customSelect = function(opt) {
        // slice arguments to leave only arguments after function name
        var args = Array.prototype.slice.call(arguments, 1);
        return this.each(function() {
            var item = $(this), instance = item.data('CustomSelect');
            if(!instance) {
                // create plugin instance and save it in data
                item.data('CustomSelect', new CustomSelect(this, opt));
            } else {
                // if instance already created call method
                if(typeof opt === 'string') {
                    instance[opt].apply(instance, args);
                }
            }
        });
    }

}(jQuery));

// plugin testing
$('select').customSelect();

JS フィドルの作業: http://jsfiddle.net/XsZ3Z/

于 2012-10-14T08:14:33.147 に答える
4

コードを機能させるには、コードをリファクタリングする必要があります。jQuery Boilerplateの使用を検討してください。

;(function ( $, window, undefined ) {

  var pluginName = 'convertSelect',
  document = window.document,
  defaults = {
    propertyName: "value"
  };

  function Plugin( element, options ) {
    this.element = element;
    this.options = $.extend( {}, defaults, options) ;

    this._defaults = defaults;
    this._name = pluginName;

    this.init();
  }

  Plugin.prototype = {

    // Private methods start with underscore
    _generateMarkup: function() {

      // you can access 'this' which refers to the constructor
      // so you have access the all the properties an methods
      // of the prototype, for example:
      var o = this.options

    },

    // Public methods
    slideDownOptions: function() { ... }

  }

  $.fn[ pluginName ] = function ( options ) {
    return this.each(function () {
      if (!$.data( this, 'plugin_' + pluginName ) ) {
        $.data( this, 'plugin_' + pluginName, new Plugin( this, options ) );
      }
    });
  };

}(jQuery, window));

次に、次のようにパブリック メソッドを呼び出すことができます。

var $select = $('select').convertSelect().data('plugin_convertSelect');
$select.slideDownOptions();

私は自分のプロジェクトで同様の問題を抱えていました。最近、あまりにも多くのメソッドで jQuery 名前空間を汚染していたため、全体をリファクタリングする必要がありました。jQuery Boilerplate は非常にうまく機能します。これは公式の jQuery ガイドに基づいていますが、多少のひねりがあります。このプラグイン パターンの動作を見たい場合は、https://github.com/elclanrs/jq-idealforms/tree/master/js/srcをご覧ください。

于 2012-10-14T08:21:59.460 に答える