Сохранение состояния панели с несколькими файлами с помощью файлов 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");
}
Ответы
Ответ 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.
Вам просто нужно создать переменную в локальном хранилище для каждой связанной с ней панели, где вы сохраняете состояние панели.
При загрузке страницы просто зациклируйте все панельные классные объекты, проверяя ее связанную переменную в локальном хранилище и применяя соответствующие классы в зависимости от значения.