Установка атрибута HTML-тега перед загрузкой - PullRequest
0 голосов
/ 15 сентября 2018

Я использую куки, чтобы запомнить предпочтения пользователя. По сути, у меня есть левая панель, которую можно свернуть или развернуть с помощью кнопки. Когда пользователь щелкает по нему, я запоминаю его состояние через cookie.

Теперь мне нужно синхронизировать начальную загрузку страницы с тем, что говорит cookie, чтобы предотвратить его резкое поведение.

Это класс в <body class="mini-navbar">. Этот класс либо есть, либо нет, в зависимости от состояния.

У меня есть все способы получить и установить cookie.

У меня вопрос, как я могу динамически добавить / удалить этот класс до загрузки страницы на основе файла cookie?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Вы можете использовать либо серверный код с синтаксисом Razor, либо чистый JavaScript для реализации вашего сценария.Смешивание JavaScript и серверного кода для файлов cookie иногда может привести к неожиданным результатам, поэтому используйте чисто серверный подход или подход с чистым JavaScript.

Двоичный файл cookie в моем примере называется bodyStyle и требуетзначение 1 или 0. Я создаю постоянный файл cookie, срок действия которого истекает через 30 дней с сегодняшнего дня и будет доступен / будет сохраняться на страницах вашего домена.Кроме того, вы можете добавить некоторую проверку условий при создании файла cookie или настроить его значение в обоих подходах в соответствии с вашими требованиями.

Пользовательский класс, который я добавляю в тело с использованием значения cookie, равен miniNavBar.

Подход на стороне сервера

Обычно тег body будет находиться в общем представлении, поэтому добавьте приведенный ниже код Razor в общий вид.

C # Razor-код для динамического задания класса тела с использованием двоичного файла cookie

@{
    //set bodyStyle cookie based on some condition using a if statement as per your requirements
    Response.Cookies["bodyStyle"].Value = "1";
    Response.Cookies["bodyStyle"].Expires = DateTime.Now.AddMinutes(2);
}

<body class="@(Response.Cookies["bodyStyle"].Value == "1" ? "miniNavBar" : "")">

Подход JavaScript

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

Код JavaScript для динамического задания класса тела с использованиемдвоичный файл cookie

<script type="text/javascript">

    //main cookie function that will contain your logic for creating the binary cookie
    function setBodyCookie() {
        //if perisistent cookie exists then do not create it         
        if (document.cookie.indexOf("bodyStyle=0") >= 0 || document.cookie.indexOf("bodyStyle=1") >= 0) {
               return;
        }

        //create body cookie if it does not exist
        //you can add an if statement here when creating a cookie based on your scenario
        var now = new Date();
        now.setTime(now.getTime() + 30 * 24 * 60 * 60 * 1000);//expire this in 30 days from now
        document.cookie = "bodyStyle=1;expires=" + now.toUTCString() + ";path=/";
    }

    $(document).ready(function () {
        //set binary cookie according to your requirements
        setBodyCookie();

        //add class to body if binary cookie has a value of 1
        if (document.cookie.indexOf("bodyStyle=1") >= 0) {
            $("body").addClass("miniNavBar");
        }
    });


</script>

Еще одним решением javascript, если вы хотите избежать мерцания, может быть размещение кода события готовности документа сразу после тега body в вашей разметке и удаление события готовности исходного документа.вы использовали, как показано ниже.Вы заметите, что готовый документ не используется в приведенном ниже коде.

<body class="expandedNavBar">
<script>
            //set binary cookie according to your requirements
            setBodyCookie();

            //add class to body if binary cookie has a value of 1
            if (document.cookie.indexOf("bodyStyle=1") >= 0) {
                //remove all classes that are already there or just remove the
                //the ones you like to
                $("body").removeClass();
               //add your class now
                $("body").addClass("miniNavBar");
            }
</script>

Другой альтернативой является то, что вы можете использовать класс .hide, чтобы избежать мерцания, поскольку класс тела изменяется в событии готовности документа.Это показано в примере кода ниже.

<style>
   .hide{ visibility:hidden}
</style>
<script>
 $(document).ready(function () {
            //set binary cookie according to your requirements
            setBodyCookie();

            //add class to body if binary cookie has a value of 1
            if (document.cookie.indexOf("bodyStyle=1") >= 0) {
                $("body").removeClass("hide");//remove the hide class
                $("body").addClass("miniNavBar");
            }
        });
</script>
<body class="hide">
0 голосов
/ 15 сентября 2018

если вы используете javascript для установки cookie, вы можете поместить javascript в раздел и установить класс (я использую jquery для примера)

if(document.cookie // cookie name)
{ 
    $("body").addClass('mini-navbar'); 
}

или если вы используете php или что-то еще, вы можете написать:

<body `<?php echo $COOKIE['bodyClass']; ?> `>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...