Переключение между двумя div с кукисами с использованием jQuery - PullRequest
4 голосов
/ 14 сентября 2011

У меня есть функция для переключения между двумя делениями (.grid и .list) с помощью кнопки (#button).

HTML:

<a href="#" id="button">Change view</a>
<div class="grid">GRID</div>
<div class="list">LIST</div>

JQuery:

$('.list').hide();
$('.grid').show();
$('#button').toggle(function() {
    $('.grid').hide();
    $('.list').show();
    return false;
}, function() {
    $('.list').hide();
    $('.grid').show();
    return false;
});

Как добавить поддержку файлов cookie, чтобы состояние переключения сохранялось и отображалось соответственно после загрузки страницы? Когда пользователь загружает страницу в первый раз, должен отображаться вид сетки.

Я перепробовал много вариантов из предыдущих тем, но все они потерпели неудачу.

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Просто установите и получите значение cookie и соответственно переключайте элементы (fiddle: http://jsfiddle.net/bpcJd/1/):

function setCookie(name, value, lifetime_days) {
    var exp = new Date();
    exp.setDate(new Date().getDate() + lifetime_days);
    document.cookie = name + '=' + value + ';expires=' + exp.toUTCString() + ';path=/';
}

function getCookie(name) {
    if(document.cookie) {
        var regex = new RegExp(escape(name) + '=([^;]*)', 'gm'),
        matches = regex.exec(document.cookie);
        if(matches) {
            return matches[1];
        }
    }
}

// show list if cookie exists
if(getCookie('showlist')) {
    $('.list').show();
    $('.grid').hide();
} else {
    $('.list').hide();
    $('.grid').show();
}   

// click handler to toggle elements and handle cookie
$('#button').click(function() {
    // check the current state
    if($('.list').is(':hidden')) {
        // set cookie
        setCookie('showlist', '1', 365);
    } else {
        // delete cookie
        setCookie('showlist', '', -1);
    }
    // toggle
    $('.list').toggle();
    $('.grid').toggle();
    return false;
});
1 голос
/ 14 сентября 2011

Если вы используете jQuery $.cookie, примерно так будет работать:

var $layouts = $('.list, .grid'), // cache objects
    $button = $('#button');       // to avoid overhead

$button.click(function(e, className){
    e.preventDefault();
    if(typeof className != 'undefined')
        $('.'+className).hide();
    $layouts.toggle();

    // set cookie to hold the state
    $.cookie('shown_type', ($layouts.eq(0).is(':visible') ? 'list' : 'grid'));
});

// check to see if a cookie exists for the app state
var shown_type = $.cookie('shown_type');
if(shown_type == 'list' || shown_type == 'grid'){
    $button.trigger('click', [shown_type]); // yes, a cookie exist, show this layout
} else{
    $button.trigger('click', ['list']); // no, a cookie does not exist, show list by default
}

Демо . Чтобы проверить, работает ли он, нажмите один раз на переключатель, чтобы установить для него сетку, затем скопируйте URL-адрес и откройте новую вкладку, сетка должна иметь отображаемый макет.

0 голосов
/ 14 сентября 2011

Если вы используете jquery cookie-плагин , вы можете сделать:

var visible = false;
if ($.cookie('grid') === 'true'){
    visible = true;
}
$('.list').toggle(!visible);
$('.grid').toggle(visible);


$('#button').click(function(){

    $.cookie('grid', $('.grid').is(':visible') , {expires: 365});
    $('.grid').toggle();
    $('.list').toggle();
});

скрипка здесь: http://jsfiddle.net/aXCSq/

Этот экран отображает список в первый раз, а затем сохраняет видимость ".grid" в файле cookie

...