2011-05-05 57 views
5

像这么多其他类似的问题在这里,我写我的第一个jQuery插件。 它旨在选取一个元素并用可点击的列表元素替换选项,以用作色板。 我的主要功能很好,但我需要添加调用另一种方法的功能,这将禁用某些选项。 我的问题是,当这样做时,我需要绑定一些点击元素并解除其他绑定。Jquery插件,从其他方法调用函数

目前我的原始绑定包含在我的'init'方法内的函数中。我需要能够从另一个“禁用”方法调用该函数。 因此,这里的一些代码:

(function($){ 

var methods = { 

    // Init method 
     init : function(options) { 
      // Set options 
      var 
       defaults = { 
         clickCallback: function(){} // Define empty function for click callback 
        } 
      , settings = $.extend({}, defaults, options) 


      // Function to bind options 
      function fnBindOptions(var1, var2, var3) { 
       // Stuff to bind elements 

        // Hit the click callback 
        settings.clickCallback.call(this); 

      } 

      return this.each(function() { 

       // Check that we're dealing with a select element 
       if(element.is('select')) { 

        // Loop through the select options and create list items for them 
        $('option', element).each(function() { 

         // Stuff to create list elements 

         // Bind click handler to the new list elements 
         fnBindOptions(var1, va2, var3); 
        }); 

       } 

      }); 

      // return 
      return this();    
     } 


    // Disable buttons method 
    , disable : function(options) { 

      // I need to access fnBindOptions from here 
      $(elementID).children('li').removeClass('disabled').each(function(){ 
       fnBindOptions(var1, var2, var3); 
      }); 

     } 
}; 

这里是我的问题:我需要禁用它之前调用每个选项绑定功能 - 但我不能从禁用方法中访问fnBindOptions - 因为fnBindOptions包括回调从“设置”变量中,我无法将其移动到“init”方法之外。

那么,有没有人有任何建议吗?

谢谢!要解决这个

回答

6

一种方法是把你的defaultssettingsbindOptions功能在methods对象(或在更广泛的范围内另一个对象),并相应地引用它们:

var methods = { 
    defaults: { 
     clickCallback: function() {} 
    }, 
    settings: {}, 

    bindOptions: function(var1, var2, var3) { 
     // Stuff to bind elements 
     // Hit the click callback 
     methods.settings.clickCallback.call(this); 
    }, 

    // Init method 
    init: function(options) { 
     methods.settings = $.extend({}, methods.defaults, options); 

     return this.each(function() { 
      if (element.is('select')) { 
       $('option', element).each(function() { 
        // Stuff to create list elements 
        // Bind click handler to the new list elements 
        methods.bindOptions(var1, va2, var3); 
       }); 
      } 
     }); 
    }, 

    // Disable buttons method 
    disable: function(options) { 
     $(elementID).children('li') 
        .removeClass('disabled') 
        .each(function() { 
      methods.bindOptions(var1, var2, var3); 
     }); 
    } 
}; 
+1

辉煌,这似乎很好地工作。谢谢!! – 2011-05-05 07:12:13

+0

很好的答案,肯定帮了我,谢谢。 – Asciant 2012-02-29 01:12:35

+0

我收到一条警告,提示“方法”可能尚未初始化,这是否会通过JSLint? – 2012-09-02 15:28:19