2012-07-10 29 views
0

我搜索了很多,但我仍然不確定,這是做我想做的最好的方式。 我正在寫一個jQuery插件,它已經工作,但現在我想改善我的代碼,因爲我在編寫這個時知道了更多的功能。如何在jquery插件中處理變量的正確(完美)方式?

以此作爲基礎我從http://docs.jquery.com/Plugins/Authoring官方的jQuery頁面的代碼(插件選項)

我不會在這裏用我自己的代碼,因爲從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'); 

這是我的第一個問題。如何在init函數中獲取變量時,何時在日誌函數中?什麼是最好的方式來做到這一點?

我試圖建立全球性這樣的價值觀:

(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});

因此,這裏是我的第二個問題:我如何爲每個init使用特定的變量?

我希望它很清楚,我想知道的。我仍然在學習jQuery並給予我最大的幫助,並且搜索了很多如何解決這個結構的問題。我想用這樣的結構,因爲它是從jQuery的官方之一,我喜歡做的事情吧:P

想太多這裏很快就會看到一些答案:)
感謝您的幫助,
朱利安

如果某人interessted成基本插件結構 - 這是我用我的插件現在:)

(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); 

回答

0

使用$。數據,如果你想保持「這個」乾淨。

+0

你的意思是這樣的: '$( '#元素1')的數據( '值',{值1: '1',值3: '3'});' 我想到這一點,但我認爲會有更優雅的方式來做到這一點。在其他插件中沒有經常看到這一點 - 另一方面,大多數插件不需要像$('element')。my_plugin('log')這樣的函數,並且只使用David的那個結構 – KddC 2012-07-10 16:03:24

+0

似乎是最好的辦法。謝謝 – KddC 2012-07-11 07:07:39