Вызов мобильного меню через AJAX

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #1 Евгений » 20.04.2024, 07:13

При проверке страниц сайта в PageSpeed Insights получили сообщение "Сократите размер структуры DOM 2 475 элементов".
Так, как сайт имеет большое количество категорий и подкатегорий, то лишь мобильное меню создает порядка тысячи элементова DOM.
Решили выводить мобильное меню лишь после нажатия на "Категории" посредством AJAX запроса. В mobile_menu.tpl

Код: Выделить всё

<ul class="second-nav">
    {if $controller != 'MainController'}
        <li>
            <a href="{url_generator route='main'}">
                {include file="svg.tpl" svgId="home_icon"}
                <span data-language="mobile_menu_home">{$lang->mobile_menu_home}</span>
            </a>
        </li>
    {/if}
    <li>
        <a>
            {include file="svg.tpl" svgId="catalog_icon"}
            <span data-language="mobile_menu_category">{$lang->mobile_menu_category}</span>
        </a>
        {function name=categories_tree4}
        {if $categories}
            <ul class="">
                {foreach $categories as $c}
                    {if $c->visible && ($c->has_products || $settings->show_empty_categories)}
                        {if $c->subcategories && $c->count_children_visible}
                            <li class="">
                                <a class="{if $category->id == $c->id} selected{/if}" href="{url_generator route='category' url=$c->url}" data-category="{$c->id}">
                                    {if $c->image}
                                        <span class="nav-icon">
                                            <img src="{$c->image|resize:20:20:false:$config->resized_categories_dir}" width="20" height="20" alt="{$c->name|escape}" />
                                        </span>
                                    {/if}
                                    <span>{$c->name|escape}</span>
                                </a>
                                {categories_tree4 categories=$c->subcategories level=$level + 1}
                            </li>
                        {else}
                            <li class="">
                                <a class="{if $category->id == $c->id} selected{/if}" href="{url_generator route='category' url=$c->url}" data-category="{$c->id}">
                                    {if $c->image}
                                    <span class="nav-icon">
                                            <img src="{$c->image|resize:20:20:false:$config->resized_categories_dir}" width="20" height="20" alt="{$c->name|escape}" />
                                        </span>
                                    {/if}
                                     <span>{$c->name|escape}</span>
                                </a>
                            </li>
                        {/if}
                    {/if}
                {/foreach}
            </ul>
        {/if}
        {/function}
        {categories_tree4 categories=$categories level=1}
    </li>
</ul>

меняем на

Код: Выделить всё

<ul class="second-nav">
    {if $controller != 'MainController'}
        <li>
            <a href="{url_generator route='main'}">
                {include file="svg.tpl" svgId="home_icon"}
                <span data-language="mobile_menu_home">{$lang->mobile_menu_home}</span>
            </a>
        </li>
    {/if}
    <li id="mobile-menu-category">
        <a href="#">
            {include file="svg.tpl" svgId="catalog_icon"}
            <span data-language="mobile_menu_category">{$lang->mobile_menu_category}</span>
        </a>
    </li>
</ul>
<div id="mobile-categories-container" style="display: none;"></div>


Перед </body> добавляем:

Код: Выделить всё

$(document).ready(function() {
    $('#mobile-menu-category').click(function(e) {
        e.preventDefault();

        $.ajax({
            url: 'url_to_your_categories_endpoint',
            type: 'GET',
            success: function(data) {

                $('#mobile-categories-container').html(data);
                $('#mobile-categories-container').show();
            },
            error: function(xhr, status, error) {
                console.error(error);
            }
        });
    });
});


Подскажите какой адрес серверного обработчика для вставки вместо url_to_your_categories_endpoint

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #2 korshunov » 20.04.2024, 08:00

Готового стандартно в CMS нет. Надо создавать самостоятельно все нужное...

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #3 Евгений » 20.04.2024, 12:12

Также заметили, что в мобильной и десктопной версии сайта разное количество DOM элементов.
А если точнее, то при просмотре исходного кода в браузере мобильной версии сайта мы видим структуру меню и из mobile_menu.tpl и desktop_categories.tpl, тогда как при просмотре исходного кода вбраузере десктопной версии сайта код mobile_menu.tpl уже отсутствует.
Пробывали содержимое desktop_categories.tpl помещать в условие {if !$is_mobile} ... {/if} или {if $is_mobile==false}, но еффекта не дает - в мобильной версии код из десктопной все еще присутствует.
Кто занает как побороть?

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #4 korshunov » 20.04.2024, 17:05

В стандартном шаблоне меню выводятся так:

{if $is_mobile == false || $is_tablet == true}
<nav class="fn_catalog_menu categories_nav hidden-md-down {if $controller == 'MainController' && !empty($global_banners)}categories_nav--show{/if}">
{include file="desktop_categories.tpl"}
</nav>
{/if}

<div class="fn_mobile_menu hidden">
{include file="mobile_menu.tpl"}
</div>

Вот и меняйте соответственно, если хотите в коде видеть только одно меню.
А вообще стандартно никакой отдельной мобильной версии нет, есть единый адаптивный дизайн...

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #5 Евгений » 21.04.2024, 07:50

korshunov писал(а):В стандартном шаблоне меню выводятся так:

{if $is_mobile == false || $is_tablet == true}
<nav class="fn_catalog_menu categories_nav hidden-md-down {if $controller == 'MainController' && !empty($global_banners)}categories_nav--show{/if}">
{include file="desktop_categories.tpl"}
</nav>
{/if}

<div class="fn_mobile_menu hidden">
{include file="mobile_menu.tpl"}
</div>

Вот и меняйте соответственно, если хотите в коде видеть только одно меню.
А вообще стандартно никакой отдельной мобильной версии нет, есть единый адаптивный дизайн...

Все верно, выводятся именно так, но логика условия почему то не работает. Ведь когда есть условие {if $is_mobile == false || $is_tablet == true}, то в мобильной версии (имеется ввиду, что код проверялся в браузере в средствах разработчика и был выбран режим мобильных устройств) код из desktop_categories.tpl должен отсутствовать, а он есть. Также там есть и код из mobile_menu.tpl. В результате в коде у нас дважды перечисляются все пункты и подпункты меню, что создает огромное количество лишних DOM элементов.

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #6 korshunov » 21.04.2024, 08:13

Евгений писал(а):...когда есть условие {if $is_mobile == false || $is_tablet == true}, то в мобильной версии ... код из desktop_categories.tpl должен отсутствовать, а он есть...

Ничего подобного. Если условие ЕСТЬ, это ничего не значит, и ничего такого быть не должно. Вот если условие ВЫПОЛНЯЕТСЯ (НЕ ВЫПОЛНЯЕТСЯ), тогда что-то должно быть согласно значению условия.

Похоже, что Вы не озаботились проверкой значения оного условия. Особенно в такой сложной ситуации

Евгений писал(а):...код проверялся в браузере в средствах разработчика и был выбран режим мобильных устройств...

когда реально одно устройство пытается выдать себя за другое.

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #7 Евгений » 21.04.2024, 09:13

Да, действительно - перепроверил исходный код на мобильном непосредственно и все отображается как надо. Выходит PageSpeed insights проводит проверку скорости тоже на эмуляторах мобильных устройств и как результат рисует огромное количество DOM элементов.


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 5 гостей