Сбой при использовании переменных JS в меню WordPress

#javascript #jquery #wordpress #wp-nav-menu-item

#javascript #jquery #wordpress #wp-nav-menu-item

Вопрос:

Я использую wp_nav_menu для загрузки меню WordPress следующим образом:

 <?php
                wp_nav_menu(
                    array(
                        'theme_location' => 'menu-1',
                        // 'menu_id'        => 'primary-menu',
                        // 'menu_class'  => 'menu-desktop',
                        'items_wrap' => '<ul id="primary-menu" class="menu-desktop">%3$s <li class="toggle-search"><i class="material-icons search-toggle-icon">search</i><div class="nav-search"><form role="search" method="get" id="searchform" action="'.home_url( '/' ).'"><input type="text" value="Search KILJ" name="s" id="s" /><button type="submit" id="searchsubmit"><i class="material-icons">search</i></button></form></div></li</ul>',
                    )
                );
                ?>
  

Я попытался назначить переменную javascript классам ‘search-toggle-icon’ и ‘nav-search’ и использовать эти переменные для переключения видимости. Выполнение этого не работает. Если я не использую переменные JS и просто ссылаюсь на классы css ‘search-toggle-icon’ и ‘nav-search’, отображение / скрытие js работает, но если я создаю переменные и пытаюсь использовать переменные js для отображения / скрытия, это не работает.

Я создал пример CodePen, показывающий, что использование переменных в меню, НЕ созданном WordPress, работает нормально, но если я использую ТОТ ЖЕ код javascript с меню, созданным wp_nav_menu(), он завершается с ошибкой.

если я консоль.регистрируйте переменные, консоль отображает эти узлы просто отлично, даже с ‘display: none’, который выполнял jquery .hide() — он просто фактически не скрывает div на веб-странице. Как будто jquery запускается до полной загрузки веб-сайта и консоли.журнал переменной отображает измененный jquery html, даже если этот измененный HTML (добавление display: none;) отсутствует в живом HTML.

Вот мой код javascript, который не работает из-за использования переменных для двух классов (search-toggle-icon и nav-search). Если я переключу все ссылки на эти переменные на просто имя класса, все будет отлично работать.

 'use strict';
$(document).ready(function(){

    var navSearchBox = document.querySelector('.nav-search');
    var searchIcon = document.querySelector('.search-toggle-icon');

    var isNavMobile = window.matchMedia( '(max-width: 1060px)' );

    // Define a callback function for the event listener.
    function handleNavMediaQueryChange( e ) {

        if ( e.matches ) {
            //show nav search on mobile
            $( navSearchBox ).show();
            $( navSearchBox ).attr( 'aria-expanded', 'true' );
            $( navSearchBox ).attr( 'aria-hidden', 'false' );
        } else {
            //hide nav search on desktop
            $( navSearchBox ).hide();
            $( navSearchBox ).attr( 'aria-expanded', 'false' );
            $( navSearchBox ).attr( 'aria-hidden', 'true' );
            $( searchIcon ).off( 'click' ).on( 'click', function(){
                var iconText = $(".nav-search").is(':visible') ? 'search' : 'close';
                $(searchIcon).text(iconText);
                $( navSearchBox ).slideToggle();
                $( navSearchBox ).attr( 'aria-hidden', $( '.nav-search' ).attr( 'aria-hidden' ) === 'false' ? 'true' : 'false' );
        
            });
        }
    }

    // Run the isNavMobile change handler once.
    handleNavMediaQueryChange( isNavMobile );

    // Add the callback function as a listener to the query list.
    isNavMobile.addEventListener( 'change', handleNavMediaQueryChange );

});
  

Я пытался протестировать создание переменных js и выполнять действия с этими переменными для элементов на моей странице, которые НЕ являются частью WP_NAV_MENU, и они отлично работают. Это просто использование переменных js для элементов в wp_nav_menu(), которые не работают.

Есть ли что-то в wp_nav_menu, из-за чего переменные JS не работают должным образом? Нужно ли мне сделать что-то еще, чтобы страница была загружена и готова перед использованием этих переменных? Интересно, если я консоль.зарегистрируйте эти переменные, они успешно покажут мне правильный узел, Но выполнение JS (показать / скрыть и т. Д.) Не работает.

Комментарии:

1. как вы загружаете этот js-код в WordPress?

2. @mikerojas в functions.php вот так: wp_deregister_script('jquery'); wp_enqueue_script('jquery', get_template_directory_uri() . '/js/jquery-3.5.1.min.js', array(), null, true); wp_enqueue_script( 'kilj-script', get_template_directory_uri() . '/js/scripts.js', array('jquery'), _S_VERSION, true );