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>

danik.js 14.02.2014 11:07

Цитата:

Сообщение от рони
showFn нормальное название для функции которая работает с анимацией видимости элемента

Расскажи это разработчикам jQuery(да и любой нормальной либы). Нафига они назвали функцию переключения видимости как toggle? А функция show у них может только показывать блок, но не скрывать. ПАЧИМУ????

Цитата:

Сообщение от рони
если неподскажите лучше

hide = !hide (понимаю так: было видимо - стало невидимо. было невидимо - стало видимо). А ваше hide ^= 1 как читать?

Цитата:

Сообщение от Ruslan_xDD
~elemIndexOf('bla bla bla') очень удобно использовать, не понятно почему Данику это не нравится

Я помнится уже спорил на эту тему с кем-то. Вроде с Deff'ом. Разрешился спором тем, что я кинул ссылку на спор в комментариях хабра. Щас искать лень.
Цитата:

Сообщение от Ruslan_xDD
хотя сам какой-то запутанной фигни для такой простой задачи понаписал

Что именно не нравится? Что последовал правилу "выноси повторяемый код в функцию"? Или что закэшировал результат функции getElementById?
Или что избавился от бесполезной записи в localStorage при инициализации (когда visible == false) ?

danik.js 14.02.2014 11:10

Цитата:

Сообщение от рони
}
function spell() {

Это ты уже типа решил потроллить меня? ;)
Цитата:

Сообщение от рони
return false

И кому ты возвращаешь результат?

А еще срать в глобал не принято, если не в курсе :)
Цитата:

Сообщение от рони
window.localStorage

Пиши тогда window.document.getElementById, че уж там..

рони 14.02.2014 11:20

Цитата:

Сообщение от danik.js
И кому ты возвращаешь результат?

ссылке -- поправил onclick="return spell()"
Цитата:

Сообщение от danik.js
Или что избавился от бесполезной записи в localStorage при инициализации (когда visible == false) ?

это непонял
твоё hide = !hide заставляет тебя лишний раз парсить данные.

ruslan_mart 14.02.2014 11:27

Цитата:

Сообщение от danik.js
А ваше hide ^= 1

Кому надо - тот поймёт. У каждого свой стиль написания кода, если мне удобнее и нравится так писать, то я буду так писать и мне плевать что ты думаешь по этому поводу. Раз ты такой правильный, то это просто позор для твоих профессиональных знаний:

Цитата:

Сообщение от danik.js
<a href="javascript:toggleBlock()">Скрыть \ показать</a>

По крайне мере мне не нравится, поэтому в следующий раз в кормушку накакаю! :D

danik.js 14.02.2014 11:36

Цитата:

Сообщение от рони
это непонял

Ну такая штука у Ruslan_xDD в примере происходит.
Цитата:

Сообщение от рони
твоё hide = !hide заставляет тебя лишний раз парсить данные.

Она по логике должна быть булевой. Чем плох парсинг (кроме того, что в localStorage каким-то неведомым образом окажется некорректный JSON)?

danik.js 14.02.2014 11:38

Цитата:

Сообщение от Ruslan_xDD
По крайне мере мне не нравится, поэтому в следующий раз в кормушку накакаю!

Мне тоже не нравится) Но это лучше чем ссылка, ведущая в никуда.
По логике это вообще кнопка (<button>), и писал бы я разметку - я бы писал именно <button>

Цитата:

Сообщение от Ruslan_xDD
У каждого свой стиль написания кода, если мне удобнее и нравится так писать, то я буду так писать

Ради бога ) Пиши ) Но в карму насру :D

рони 14.02.2014 12:37

danik.js,
window.localStorage вот с этим вопрос - иногда без window почемуто несрабатывает -- с чем это связано незнаю - браузеры на самообновлении - подумал может не у меня одного эта проблема поэтому оставил -- также как раньше несрабатывало обращение к элементу по id -
сейчас по id работает но душа радуется что вы научились писать document.getElementById, потому что считаю что если переменная инициализирована элементом это видно и понятно -- а откуда взялась глобальная переменная ещё вопрос элемент это или просто переменная.Спасибо за внимание! :thanks:

psfdek 16.02.2014 18:14

Всем спасибо!!
Всем добра!!!!
Ваши варианты работают!


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