2013-07-03 76 views
0

真的,我正在查看代碼中的模式,並意識到它可能會被簡化。所以,這是最終的目標。這是我寫的一個插件,它根據某些數據屬性的存在調用不同的函數。根據變量調用不同的函數

var a = $.extend({},$.bcplugins.defaults,options); 
var b; 

// a variable for each plugin's data attribute 
var crumbsInstances = doc.find('[data-bcp-crumbs]'), 
    copyrightInstances = doc.find('[data-bcp-copyright]'), 
    activeNavInstances = doc.find('[data-bcp-activenav]'); 


// Determine wich functions get called 
if (crumbsInstances.length) { 
    crumbsInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     crumbs(a,b); 
    }); 
} 
if (copyrightInstances.length) { 
    copyrightInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     copyright(a,b); 
    }); 
} 
if (activeNavInstances.length) { 
    activeNavInstances.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     activeNav(a,b); 
    }); 
} 

這個插件將有越來越多的功能,隨着時間的推移。如果通過變量聲明,我可以減少到一個嗎?

+2

你還沒有真正問過問題。 –

回答

1

也許是這樣的:

function processInstance($obj, callFunc){ 
    if ($obj.length) { 
    $obj.each(function() { 
     b = {}; 
     b = $$.extend({}, b, $(this).data(a.dataOptions)); 
     callFunc(a,b); 
    }); 
    } 
} 

var crumbsInstances = doc.find('[data-bcp-crumbs]'), 
    copyrightInstances = doc.find('[data-bcp-copyright]'), 
    activeNavInstances = doc.find('[data-bcp-activenav]'); 

processInstance(crumbsInstances, crumbs); 
processInstance(copyrightInstances, copyright); 
processInstance(activeNavInstances, activeNav); 
+0

我喜歡那樣。然後每次添加一個新函數時,我都會簡單地調用processInstance。 –

1

爲了擴展以前的答案,並添加到您的評論關於使其成爲一個插件:

(function($) { 
    if (!$.goData) { 
     $.extend({ 
      goData: function() { 
       function go($this, cb) { 
        var a = $.extend({},$.bcplugins.defaults,options); 
        if ($this.length) { 
         $this.each(function(i) { 
          b = {}; 
          b = $.extend({}, b, $(this).data(a.dataOptions)); 
          // use of apply allows for element to be passed to function 
          cb.apply($this, [a, b]); 
         }); 
        } 
       } 

       go($(document).find('[data-bcp-crumbs]'), $.goData.methods.crumbs); 
       go($(document).find('[data-bcp-copyright]'), $.goData.methods.copyright); 
       go($(document).find('[data-bcp-activenav]'), $.goData.methods.activeNav); 
      } 
     }); 
     $.goData.methods = { 
      crumbs: function(a,b) { console.log(this, a, b); }, 
      copyright: function(a,b) { console.log(this, a, b); }, 
      activeNav: function(a,b) { console.log(this, a, b); } 
     } 
    } 
})(jQuery); 

// use 
$.goData(); 

當然這需要$.bcplugins.defaults是包括第一或你可以簡單地將其添加到該插件。