2012-08-15 66 views
0

我有一个存储一组Cookie值以下变量:基于jQuery饼干打开和关闭面板

var filterDate = $.cookie('filterDate'); 
    var filterArea = $.cookie('filterArea'); 
    var filterCategory = $.cookie('filterCategory'); 
    var filterType = $.cookie('filterType'); 
    var filterLevel = $.cookie('filterLevel'); 
    var filterAge = $.cookie('filterAge'); 
    var filterAttendance = $.cookie('filterAttendance'); 

饼干和变量的名称,也即是对一些元素的ID该页面,例如:<div id="filterDate"></div>

我想要做的事情是非常微小的(即尽可能少的代码)检查是否有任何打开的值,如果是的话,然后运行里面的代码。

if (filterDate == 'open' || filterArea == 'open' || filterCategory == 'open' || filterType == 'open' || filterLevel == 'open' || filterAge == 'open' || filterAttendance == 'open') { 
    $('#' + filter).find('.menuBox.nav ul').show(); 
    $('#' + filter).find('.menuBox.nav p').hide(); 
    $('#' + filter.find('h3 span').addClass('active'); 
} 

如何获得上述为filter适用于所有的Cookie的工作,而不必重复它每个Cookie和面板?

回答

2

紧凑的解决方案可能是:

//The array below allows you to easily add new filters 
var filterNames = ["filterDate", "filterArea", ..., "filterAttendance"]; 
for (var i in filterNames) { 
    var filterName = filterNames[i]; 
    var filterStatus = $.cookie(filterName); 
    if (filterStatus == 'open') { 
     $('#' + filterName).find('.menuBox.nav ul').show(); 
     $('#' + filterName).find('.menuBox.nav p').hide(); 
     $('#' + filterName.find('h3 span').addClass('active'); 
    } 
} 
+0

非常好。真的很好,最小。谢谢。 – Cameron 2012-08-15 13:49:57

+0

不客气;-) – Claudix 2012-08-15 13:50:42

0

我并不清楚,如果你正在寻找触发基于过滤器名称不同的功能。如果是这样,您可以存储映射到您的Cookie的所有函数,然后迭代Cookie的名称,如果为true,则触发相关函数:例如,

var cookieList = ["filterDate", "filterArea"...]; 
var cookieMap = {"filterDate"=filterDateFn, "filterArea"=filterAreaFn...}; 

for (var i=0; i<numCookies; i++) { 
if ($.cookie(cookieList[i]) == "open") {cookieMap[cookieList[i]]();} 

如果你只是想运行一个功能,那么你可以跳过制作cookieMap,只是运行任何你想要的成功触发,则打破了在这一点上循环。

0

制作一个cookie名称数组,然后生成一个对象(key map map对),其中 这些键是数组中的项目,并且这些值是适当cookie的值。 然后使用循环遍历数组/对象:

var filters = ['filterA', 'filterB', 'filterC'], 
    cookies1 = {}, 
    cookies2 = {}; 
for(var i = 0, f; f = filters[i++];) { 
    // really here will be $.cookie(f); instead of 'open': 
    cookies1[f] = cookies2[f] = 'open'; 
} 

// make one of second cookies set 'closed' for testing purpose: 
cookies2['filterA'] = 'closed'; 

function allOpen(cookies) { 
    for(var i in cookies) { 
     if(cookies[i] != 'open') { 
      return false; 
     } 
    } 
    return true; 
} 

alert(allOpen(cookies1) + ', ' + allOpen(cookies2)); 
​