Вопрос или проблема
У меня есть скрипт, который сокращает мое меню и добавляет выпадающий список с “+”, если в меню слишком много элементов, чтобы украсить длинные меню, например:
Без запущенного скрипта:
Который я вызываю в functions.php
с помощью:
function _s_scripts() {
wp_enqueue_script( 'main', get_template_directory_uri() . '/js/main_res.js', array( 'jquery' ), '', false );
}
add_action( 'wp_enqueue_scripts', '_s_scripts' );
К сожалению, это приводит к позднему выполнению и дерганности. Есть ли способ подключить этот скрипт к “как только закончено создание X части (меню)”, чтобы это сделать?
Эффект очень заметен для пользователя:
https://i.sstatic.net/9270D.jpg
и вот скрипт, только для тестирования, main_res.js
:
function sliceMenu(desired_len) {
var menu_len = document.querySelectorAll('#primary-menu > li').length;
if (menu_len > desired_len) {
var append_menu_el = document.createElement('div');
append_menu_el.innerHTML = ('<div id="js-cover-menu"><img class="plus" src="https://wordpress.stackexchange.com/questions/293747/$PATH/svg/plus_menu.svg" alt="more-menu"></div>').replace('$PATH', ABSPATH);
document.getElementById('primary-menu').parentNode.appendChild(append_menu_el);
let diff = menu_len - desired_len;
let sliced_lis = [...(document.querySelectorAll('#primary-menu > li'))].slice(-diff);
var js_menu_el = document.createElement('ul');
js_menu_el.setAttribute('id', 'js-cover-menu-dropdown');
document.getElementById('js-cover-menu').appendChild(js_menu_el);
js_cover_menu_el = document.getElementById('js-cover-menu-dropdown');
for(var i = 0, length = sliced_lis.length; i < length; i++) {
js_cover_menu_el.appendChild(sliced_lis[i]);
}
document.querySelectorAll('#js-cover-menu-dropdown > li > ul').forEach(node => node.remove());
} else {
return;
}
}
Во-первых, если вы не используете jQuery, то не передавайте jQuery
как зависимость функции wp_enqueue_script()
.
Теперь по вашему вопросу. Это не совсем связано с WordPress, но тем не менее. Вы не упомянули, как вызываете эту функцию, так как это единственное, что здесь имеет значение. Если вы выводите свой код позднее, например, в подвале, он не будет выполняться, пока не загрузится все, что перед этой частью. Моя рекомендация – использовать дочернюю тему и добавить код сразу после вывода вашего меню и вызвать функцию. Таким образом, скрипт выполнится сразу после того, как меню будет создано, и поскольку jQuery не требуется, вы не столкнетесь с проблемами его использования.
Похоже, ваш скрипт частично использует ванильный JavaScript. Если вы сможете избавиться от его зависимости от jQuery, вы можете просто вставить его прямо в тег скрипта в вашем футере.
Однако скрипты, которые выполняются на $( document ).ready(), всегда будут иметь такой эффект, если вы изменяете html страницы.
Ваши две решения: правильно написать скрипт на PHP, установив скрытые элементы с помощью CSS-классов, чтобы они не отображались при загрузке страницы, и использовать логику JavaScript для добавления обработчиков нажатий на “+”.
Еще один немного более хитрый вариант – скрыть div с помощью CSS, а в конце вашего JavaScript применить CSS-класс, который его показывает. Теперь страница будет загружаться без ничего, а через мгновение меню станет видимым. Это немного лучше, чем загрузка меню, выглядещего одним образом, и затем полностью изменяющегося после загрузки страницы.
Ответ или решение
Для того чтобы ваш скрипт JavaScript выполнялся первым среди других, вам следует уделить внимание ряду технических аспектов. Основные шаги, которые помогут добиться этого, включают правильную организацию скрипта, избавление от ненужных зависимостей, а также оптимизацию порядка загрузки и вызова скрипта.
Понимание контекста и проблемы
Ваш скрипт предназначен для более удобного представления длинных меню, создавая выпадающий пункт “+” в случае превышения заданного количества элементов. Однако позднее выполнение этого скрипта ведет к визуальному "дёрганию" интерфейса, которое заметно пользователю.
Текущая интеграция:
- Скрипт подключается через
functions.php
WordPress’а. - Указана зависимость от jQuery, которая может быть излишней для вашего кода, ведь ваш скрипт на чистом JavaScript.
- Позднее выполнение скрипта делает неправильным отображение при загрузке страницы.
Шаги к решению
1. Убираем зависимости от jQuery:
Ваш код выполняется на чистом JavaScript, поэтому удаление зависимости от jQuery поможет снизить время загрузки:
function _s_scripts() {
wp_enqueue_script('main', get_template_directory_uri() . '/js/main_res.js', array(), '', false);
}
add_action('wp_enqueue_scripts', '_s_scripts');
2. Обеспечьте раннюю загрузку скрипта:
Для предохранения скрипта от задержек, убедитесь, что его вызов происходит как можно быстрее после генерации меню. Вы можете добиться этого следующими методами:
-
Встраивание скрипта непосредственно после генерации меню:
Напишите PHP-шаблон для вашего меню, и вставьте вызов функции
sliceMenu()
непосредственно после HTML-кода меню в header.php, что обеспечит его мгновенное выполнение:<ul id="primary-menu"> <!-- Ваши элементы меню --> </ul> <script> document.addEventListener('DOMContentLoaded', function() { sliceMenu(5); // Задайте нужное количество элементов }); </script>
3. Работа с CSS для скрытия содержимого:
Для улучшения пользовательского опыта сразу скрывайте меню с помощью CSS:
#primary-menu {
display: none;
}
.loaded #primary-menu {
display: block;
}
В конце вашего JS-кода добавьте класс loaded
к body:
document.body.classList.add('loaded');
Заключение
Оптимизация порядка загрузки скрипта и удаление дополнительных зависимостей помогут вам минимизировать визуальные артефакты на вашем сайте. Следуя предложенным шагам, вы уменьшите потенциальные задержки в отображении, что способствует улучшению восприятия и функциональности вашего меню. Убедитесь, что весь ваш код поддерживает стандарты быстродействия и удобства, улучшая общее впечатление от вашего сайта.