динамическое обновление css

302
08 ноября 2017, 01:02

Есть такой код:

  <nav>
    <div class="name">Законопроекты</div>
    <?php if (isset($_SESSION['logged_user'])) { ?>
    <ul>
      <a id="exit" href="#"><li>Выход</li></a>
    </ul>
    <?php } else { ?>
    <ul>
      <a data-fancybox data-options='{"src": "#login", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Вход</li></a>
      <a data-fancybox data-options='{"src": "#register", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Регистрация</li></a>
    </ul>
    <?php } ?>
  </nav>

То есть когда человек залогинен видно одно, когда нет - другое. Логин происходит без перезагрузки страницы, от чего данное меню меняется только после принудительного обновления страницы. Как сделать так, чтобы меню менялось моментально без перезагрузки в зависимости от наличия данных в сессии php?

Answer 1

Есть несколько вариантов, как это сделать.

Вариант первый:

  1. Два стиля CSS - например, signIn && notSignIn.
  2. В HTML коде заранее выводите два варианта (залогинен/не залогинен) и применяете к нему свои стили.

Напримеp:

CSS:

.signIn{
visibility: visible;
//other styles
}
.notSignIn{
visibility:collapsed; //or hidden
//other styles
}

HTML & PHP:

  <nav>
<div class="name">Законопроекты</div>
<?php if (isset($_SESSION['logged_user'])) { ?>
<ul class="notSignIn">
  <a id="exit" href="#"><li>Выход</li></a>
</ul>
<ul class="signIn">
  <a data-fancybox data-options='{"src": "#login", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Вход</li></a>
  <a data-fancybox data-options='{"src": "#register", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Регистрация</li></a>
</ul>
<?php } else { ?>
<ul class="signIn">
  <a id="exit" href="#"><li>Выход</li></a>
</ul>
<ul class="notSignIn">
  <a data-fancybox data-options='{"src": "#login", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Вход</li></a>
  <a data-fancybox data-options='{"src": "#register", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Регистрация</li></a>
</ul>
<?php } ?>

Потом после Ajax запроса, Вы просто подменяете классы для Ваших ul. Классы можно назвать visible и notVisible соответсвенно. Или вообще сделать один класс visible:

.visible{
visibility: visible !important;
}

а к элементам применить visibility:hidden

Вариант второй:

На стороне бэкенда (тот скрипт, где Ваш Аjax "логинит" пользователя), сделать примерно следующее:

<?php 
/*
* Check auth
* $isAuth = **auth result**(true/false)
*/
if($isAuth){
   return 
      "<ul><a id="exit" href="#"><li>Выход</li></a></ul>";
} else {
   return 
      "<ul>
           <a data-fancybox data-options='{"src": "#login", "touch": false, "toolbar" : false, "smallBtn" : false}'href="javascript:;"><li>Вход</li></a>
           <a data-fancybox data-options='{"src": "#register", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Регистрация</li></a>
      </ul>"
}

В JS (JQuery же используете?):

success: function(data) { //часть JQuery Ajax call'a 
    $('#authWrap').html(data);
},

Код HTML/PHP страницы:

<nav>
  <div class="name">Законопроекты</div>
  <div id="authWrap">
   <?php if (isset($_SESSION['logged_user'])) { ?>
      <ul>
         <a id="exit" href="#"><li>Выход</li></a>
      </ul>
   <?php } else { ?>
      <ul>
         <a data-fancybox data-options='{"src": "#login", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Вход</li></a>
         <a data-fancybox data-options='{"src": "#register", "touch": false, "toolbar" : false, "smallBtn" : false}' href="javascript:;"><li>Регистрация</li></a>
      </ul>
   <?php } ?>
  </div>
</nav>

Таким образом, при вызова Ajax функции в зависимости от результата Вы будете подменять содержимое <div id="authWrap"></div>.

Полезные ссылки:

  1. Замена содержимого div'a с помощью JQuery;
  2. Замена содержимого div'a без JQuery;
  3. Ajax функция JQuery на англ. (оф. документация);
  4. Ajax функция JQuery на русском.
READ ALSO
MySQL Can&#39;t find file: &#39;./bd/tabletemp.frm&#39; (errno: 2)

MySQL Can't find file: './bd/tabletemp.frm' (errno: 2)

Есть пхп скрипт, есть таблица в БД MySQL

246
pc-сервер android-клиент

pc-сервер android-клиент

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

232
Ошибка при установке Μaven [требует правки]

Ошибка при установке Μaven [требует правки]

Ребята, помогите что не такУстанавливаю Μaven

240
Spring Security: DelegatingFilterProxy переполняет стек

Spring Security: DelegatingFilterProxy переполняет стек

Настраиваю Spring Security и столкнулся с проблемой когда в конфигурации указано доступ к определенным адресам предоставлять только при авторизации...

384