0

一連のCookieの値を格納する次の変数があります。

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

Cookieと変数の名前は、ページにあるいくつかの要素のIDでもあるため、たとえば次のようになります。<div id="filterDate"></div>

私がやりたいのは、最小限(つまり、可能な限り少ないコード)で、openの値があるかどうかを確認し、ある場合は内部でコードを実行することです。

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で機能するようにするにはどうすればよいですか?

4

3 に答える 3

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');
    }
}
于 2012-08-15T13:44:50.690 に答える
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]]();}

1つの関数のみを実行する場合は、cookieMapの作成をスキップして、必要な成功トリガーを実行し、その時点でforループを中断することができます。

于 2012-08-15T13:46:50.720 に答える
0

Cookie名の配列を作成してから、オブジェクト(key:pair値のマップ)を生成します。ここで、キーは配列からのアイテムであり、値は適切な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));
​
于 2012-08-15T13:52:31.510 に答える