0

我搜索了很多,但我仍然不确定,这是做我想做的最好的方法。我正在编写一个 jQuery 插件,它已经工作了,但现在我想改进我的代码,因为我在编写这个插件时了解了更多的功能。

作为基础,我从官方 jQuery 页面http://docs.jquery.com/Plugins/Authoring 获取代码(插件选项)

我不会在这里使用我自己的代码,因为来自 jQuery 的代码已经足够我的问题了

(function( $ ){

  var methods = {
    init : function( options ) { 
      var defaults = {
        value1: '',
        value2: ''
       };
       var options = $.extend(defaults, options);
       return this.each(function(){
         value3 = $(this).parent();
       });
    },
    log : function( ) {
      console.log(value3);
      console.log(defaults.value1);
    }
  };

  $.fn.my_plugin = function( method ) {

    // Method calling logic
    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 );

这就是我的插件的结构。它现在非常剥离;)现在我想做这样的事情:

$('#element1').my_plugin({value1 : 1, value2 : 2});
$('#element2').my_plugin({value1 : 3, value2 : 4});

现在我想在控制台中记录值(不完全是我真正想要做的,但对于我的问题,这又足够了)

此外,我想使用这样的功能

$('#element1').my_plugin('log');
$('#element2').my_plugin('log');

这是我的第一个问题。当我在日志函数中时,如何从初始化函数中获取变量?最好的方法是什么?

我试图像这样设置全局值:

(function( $ ){
  var defaults = {
    value1: '',
    value2: ''
  };
  var methods = {
    init : function( options ) { 
       return this.each(function(){
         value3 = $(this).parent();
       });
    },
    log : function( ) {
      console.log(value3);
      console.log(defaults.value1);
    }
  };

但是如果我这样做并使用$('#element1').my_plugin('log');,我只能从第二个初始化中获得默认值$('#element2').my_plugin({value1 : 3, value2 : 4});

所以这是我的第二个问题:如何为每个初始化使用特定变量?

我希望很清楚,我想知道什么。我仍在学习 jQuery 并尽我所能,并搜索了很多如何解决我的这个结构的问题。我想使用这种结构,因为它是 jquery 的官方结构,我喜欢做正确的事情:P

也想很快在这里看到一些答案:)
谢谢你的帮助,
朱利安

如果有人对基本插件结构感兴趣 - 这是我现在用于插件的内容:)

(function( $ ){

  var methods = {
    init : function( options ) {
        console.log('init');
      var defaults = {
        value1: '',
        value2: ''
      };
      var options = $.extend(defaults, options);        
      return this.each(function(){
                var $this = $(this);
        var data = $this.data('test');
        var parent = $this.parent();
        var element = $this;

        if (!data) {
            var data = {};
            $.each(options, function(key, value) {
                data[key] = value;
            });
            data["parent"] = parent;
            data["element"] = element;
                    $this.data('test', data);
        }

        $this.test('log');

       });
    },

    log : function() {
        console.log('log');
        return this.each(function(){
            var $this = $(this);
        var data = $this.data('test');
        console.log(data);
      });
    }
  };

  $.fn.test = 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.test' );
    }    
  };
})( jQuery );
4

1 回答 1

0

如果你想保持“这个”干净,请使用 $.data。

于 2012-07-10T15:54:03.183 回答