Подтвердить что ты не робот

Сохранение состояния панели с несколькими файлами с помощью файлов cookie с $.cookie()

Я пытаюсь определить, как я могу сэкономить сворачиваемое состояние сбрасываемой панели, используя $.cookie.

Этот вопрос был полезен до сих пор, но все еще не хватает конечного решения.

Любые решения, которые я нашел до сих пор, сохранили только последнюю свернутую панель, поэтому, когда страница перезагружается, единственная сохраненная панель является последней.

Мне нужно сохранить все панели, которые были свернуты, а не только один.

Ссылка в плагин jCookie на Github.

Ссылка для демонстрации на JSFiddle


UPDATE

Было высказано предположение, что LocalStorage является более подходящим решением для того, чего я пытаюсь достичь. Если вы можете прокомментировать, почему и что такое локальное хранилище, это было бы высоко оценено.


ОБНОВЛЕНИЕ 2

из-за предположения, что локальное хранилище будет улучшением по сравнению с использованием файлов cookie для этой проблемы. Выбранный ответ основывался на этом. Однако, как упоминалось Робин, есть недостатки в использовании этого метода на сайтах HTTPS.


HTML

<div class="panel panel-default">
    <div data-toggle="collapse" data-target="#panel1" class="panel-heading collapsed">
        <h4 class="panel-title">
            <a> Panel 1 </a>
        </h4>
    </div>
    <div id="panel1" class="panel-collapse collapse">
        <div class="panel-body">
        </div>
    </div>
</div>


<div class="panel panel-default">
    <div data-toggle="collapse" data-target="#panel2" class="panel-heading collapsed">
        <h4 class="panel-title">
            <a> Panel 2 </a>
        </h4>
    </div>
    <div id="panel2" class="panel-collapse collapse">
        <div class="panel-body">
        </div>
    </div>
</div>


<div class="panel panel-default">
    <div data-toggle="collapse" data-target="#panel3" class="panel-heading collapsed">
        <h4 class="panel-title">
            <a> Panel 3 </a>
        </h4>
    </div>
    <div id="panel3" class="panel-collapse collapse">
        <div class="panel-body">
        </div>
    </div>
</div>

JQuery

$(".panel .panel-collapse").on('shown.bs.collapse', function ()
{
    var active = $(this).attr('id');
    $.cookie('activePanelGroup', active);
});

$(".panel .panel-collapse").on('hidden.bs.collapse', function ()
{
    $.removeCookie('activePanelGroup');
});

var last = $.cookie('activePanelGroup');
if (last != null)
{
    //remove default collapse settings
    $(".panel .panel-collapse").removeClass('in');
    //show the account_last visible group
    $("#" + last).addClass("in");
}
4b9b3361

Ответ 1

Это создаст файл cookie для каждой панели, когда он будет показан, и удалите cookie, когда панель будет скрыта.

$(".panel .panel-collapse").on('shown.bs.collapse', function ()
{
    var active = $(this).attr('id');
    $.cookie(active, "1");
});

$(".panel .panel-collapse").on('hidden.bs.collapse', function ()
{
    var active = $(this).attr('id');
    $.removeCookie(active);
});

Итак, при загрузке документа мы проверяем каждый файл cookie и расширяем панель.

$(document.ready(function(){
    var panels=$.cookie(); //get all cookies
    for (var panel in panels){ //<-- panel is the name of the cookie
        if ($("#"+panel).hasClass('panel-collapse')) // check if this is a panel
        {
            $("#"+panel).collapse("show");
        }
    }    
});

ИСПОЛЬЗОВАНИЕ LOCALSTORAGE

Однако, по мнению кого-то, использование localStorage может быть лучшим вариантом. localStorage отлично подходит для этого.

$(".panel .panel-collapse").on('shown.bs.collapse', function ()
{
    var active = $(this).attr('id');
    var panels= localStorage.panels === undefined ? new Array() : JSON.parse(localStorage.panels);
    if ($.inArray(active,panels)==-1) //check that the element is not in the array
        panels.push(active);
    localStorage.panels=JSON.stringify(panels);
});

$(".panel .panel-collapse").on('hidden.bs.collapse', function ()
{
    var active = $(this).attr('id');
    var panels= localStorage.panels === undefined ? new Array() : JSON.parse(localStorage.panels);
    var elementIndex=$.inArray(active,panels);
    if (elementIndex!==-1) //check the array
    {
        panels.splice(elementIndex,1); //remove item from array        
    }
    localStorage.panels=JSON.stringify(panels); //save array on localStorage
});

Когда вы загружаете страницу, получите значения localStorage и покажите панели.

$(document.ready(function(){
    var panels=localStorage.panels === undefined ? new Array() : JSON.parse(localStorage.panels); //get all panels
    for (var i in panels){ //<-- panel is the name of the cookie
        if ($("#"+panels[i]).hasClass('panel-collapse')) // check if this is a panel
        {
            $("#"+panels[i]).collapse("show");
        }
    }  
});

РЕДАКТИРОВАТЬ: Посмотрите, как это работает: FIDDLE

Ответ 2

Вы должны сохранить активные панели в массиве и сохранить их в файле cookie, вместо этого сохраняя только 1 id за раз.

Ваш JS должен выглядеть следующим образом:

var activePanels = []; // array for the active panels
$(".panel .panel-collapse").on('shown.bs.collapse', function ()
{   
    var active = $(this).attr('id');
    activePanels.push(active); // store the active panel id into the array
    $.cookie('activePanelGroup', activePanels); // add array to the cookie
    console.log($.cookie('activePanelGroup')); // display current active panels stored in the cookie
});

$(".panel .panel-collapse").on('hidden.bs.collapse', function ()
{
    var selectedPanel = $(this).attr('id');
    var index = activePanels.indexOf(selectedPanel);
    if (index > -1) // if id exists on the active panels array
      activePanels.splice(index, 1); // remove it on the active panels array
    $.cookie('activePanelGroup', activePanels); // add the updated active panels array to remove the old one
    console.log($.cookie('activePanelGroup')); // display current active panels stored in the cookie
});

var aPanels = $.cookie('activePanelGroup');  // retrieve all active panels 

if (aPanels != null)
{   
    //remove default collapse settings
    $(".panel .panel-collapse").removeClass('in');
    // put all active ids to array
    var arr = aPanels.split(",");
    // loop on each active panels
    $.each( arr, function( key, value ) {
      //show the account_last visible group
      $("#" + value).addClass("in");

      // store again the selected panels so it won't get reset on reload
      activePanels.push(value);
      $.cookie('activePanelGroup', activePanels);
    });
}

Fiddle

Ответ 3

У вас могут быть настройки в одном файле cookie (т.е. запятые) и обновить его при открытии-закрытии.

openPanels = $.cookie('activePanelGroup').split(",");

См. ваш отредактированный пример JsFiddle, работающий здесь.

ИЗМЕНИТЬ

Я согласен с Крисом. Я считаю это более элегантным решением для хранения всех значений в одном файле cookie, однако мы должны иметь в виду единственную ограничения размера файлов cookie. (Это зависит от браузера).

Ответ 4

<!-- when you have multiple levels of child-sections like this below - to hide/collapse or show and restore again -->
<!--here how I kept track of their id - ps. I have since removed the multiple -->
<!--tables but, it looked like this when I put this answer in -->

    <div class="panel-group" id="accordion">
        <div class="panel panel-default">
            <div class="panel-heading">
            </div>
            <div class="panel-body">
<!--TABLE 1-->
                <table class="table table-condensed" style="border-collapse: collapse;">
                    <tbody class="component-grp">
                        <tr data-toggle="collapse" data-parent="#accordion" data-target="#[email protected]" class="accordion-toggle">
                            <td colspan="10">
                                <div class="">
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td class="hiddenRow">
                                <div class="accordian-body panel-collapse collapse" id="[email protected]">
<!--TABLE 2-->
                                    <table class="table table-striped">
                                        <thead>
                                            <tr class="header">
                                                <th></th>
                                                <th>Position</th>
                                                <th>shape</th>

                                            </tr>
                                        </thead>
                                        <tbody class="component-row">
                                            <tr data-toggle="collapse" data-target="#[email protected]" class="accordion-toggle collapsed">
                                                <td>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td colspan="10" class="hiddenRow">                                                
                                                </td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </div>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>

        </div>

    </div>

Ответ 5

Я бы предпочел использовать localStorage, чем файлы cookie.

Вам просто нужно создать переменную в локальном хранилище для каждой связанной с ней панели, где вы сохраняете состояние панели.

При загрузке страницы просто зациклируйте все панельные классные объекты, проверяя ее связанную переменную в локальном хранилище и применяя соответствующие классы в зависимости от значения.