Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Показать\скрыть с сохранением состояния (https://javascript.ru/forum/misc/45095-pokazat%5Cskryt-s-sokhraneniem-sostoyaniya.html)

psfdek 14.02.2014 07:56

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

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

<a href="#" onclick="showFun()">Скрыть \ показать</a>
<div id="myShowBlock">1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 </div>

var visible = true;
function showFun() {
    if(visible) {
        document.getElementById('myShowBlock' ).style.display = 'none';
        visible = false;
    } else {
        document.getElementById('myShowBlock' ).style.display = 'block';
        visible = true;
    }
}

ruslan_mart 14.02.2014 08:13

var hide = window.localStorage.getItem('hide');
function showFun() {
   document.getElementById('myShowBlock').style.display = hide ? 'block' : 'none';
   window.localStorage.setItem('hide', (hide ^= 1));
}

if(hide) showFun();


Не тестировал, но работать должно. :)

psfdek 14.02.2014 09:32

Оно скрывает\показывает, но при перезагрузке сбрасывается тоже :(

рони 14.02.2014 10:03

psfdek,
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<a href="#" onclick="showFun()">Скрыть \ показать</a>
<div id="myShowBlock">1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 </div>

<script>
   var hide = window.localStorage.getItem('hide');
       hide = hide === null ? 1 : +hide;   //1 если самый самый  первый раз нужно  чтоб было открыто иначе 0
function showFun() {
   window.localStorage.setItem('hide', (hide ^= 1));
   document.getElementById('myShowBlock').style.display = hide ? 'block' : 'none';
   return false
}
   document.getElementById('myShowBlock').style.display = hide ? 'block' : 'none';

</script>
</body>

</html>

danik.js 14.02.2014 10:26

Во-первых, showFn (show - показать) - неудачное имя для функции, которая скрывает блок.
Во-вторых:
Цитата:

Сообщение от Ruslan_xDD
hide ^= 1

Что это такое? Не в обиду, но следующий раз накакаю в кармушку.

Мой вариант:
<!DOCTYPE HTML>
<html>
    <head>
      <title>Untitled</title>
      <meta charset="utf-8">
    </head>
     
    <body>
    <a href="javascript:toggleBlock()">Скрыть \ показать</a>
    <div id="myShowBlock">1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 </div>
     
    <script>
    (function() {
        var toggle = function(element, show) {
            element.style.display = show ? 'block' : 'none';
        };
        var block = document.getElementById('myShowBlock');
        var visible = localStorage.hasOwnProperty('visible') ? JSON.parse(localStorage.getItem('visible')) : true;
        toggle(block, visible);
        window.toggleBlock = function() {
            toggle(block, visible = !visible);
            localStorage.setItem('visible', visible);
        };
    })();
    </script>
</body>
 
</html>

рони 14.02.2014 10:30

Цитата:

Сообщение от danik.js
Во-первых, showFn (show - показать) - неудачное имя для функции, которая скрывает блок.
Во-вторых: Сообщение от Ruslan_xDD
hide ^= 1
Что это такое? Не в обиду, но следующий раз накакаю в кармушку.

параноик :cray:

ruslan_mart 14.02.2014 10:39

danik.js, преобразование в противоположное значение (true в false, false в true), знаю, что смотрится ужасно, но работает. :D

рони 14.02.2014 10:43

danik.js,
showFn нормальное название для функции которая работает с анимацией видимости элемента, hide ^= 1 супер решение, применял и буду применять если неподскажите лучше, единственное полезное это 17 строка в вашем коде кеширование элемента - остальное панты правильного пацана - но несмотря на всю правильность вашего кода он оставляет впечатление запутанности и тяжеловесности чтобы в него вникнуть нужно дополнительное усилие: бегать взглядом вверх вниз никакой последовательности.

ruslan_mart 14.02.2014 10:52

рони, +
hide ^= 1 и ~elemIndexOf('bla bla bla') очень удобно использовать, не понятно почему Данику это не нравится, типо якобы запутывает топик стартера, хотя сам какой-то запутанной фигни для такой простой задачи понаписал.

рони 14.02.2014 10:54

:write:
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<a href="#" onclick="return spell()">Скрыть \ показать</a>
<div id="myShowBlock">1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 </div>
<script>
   var hide = window.localStorage.getItem('hide'),
       hide = hide === null ? 1 : +hide,   //1 если самый самый  первый раз нужно  чтоб было открыто иначе 0
       block = document.getElementById('myShowBlock');
function show() {
   block.style.display = hide ? 'block' : 'none';
}
function spell() {
   window.localStorage.setItem('hide', (hide ^= 1));
   show();
   return false
}
show()
</script>
</body>
</html>


Часовой пояс GMT +3, время: 00:02.