Плохо: функция [jquery] с WordPress - PullRequest
2 голосов
/ 16 апреля 2020

Я новичок в мире программирования, у меня была бы проблема спросить вас. Я надеюсь, что вы можете мне помочь. У меня проблема на сайте WordPress. Я использую тему, которая создает меню для «мобильной» версии, в которой для открытия меню используется следующая функция:

container.find( '.dropdown-toggle' ).click(
    function( e ) {
        var _this = $( this );
        e.preventDefault();
        _this.toggleClass( 'toggled-on' );
        _this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );
        _this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );
        _this.html( _this.html() === screenReaderText.expand ? screenReaderText.collapse : screenReaderText.expand );
    });

Конечно, все прекрасно работает, когда вы нажимаете на объект с классом .dropdown-toggle.

Теперь я хотел бы применить эту функциональность к написанию каждого элемента. Позвольте мне лучше объяснить, как создать подменю в WordPress, который я использую (href = #), это вызывает создание подменю, но когда я нажимаю на ссылку, подменю не открывается. В теме используется маленькая стрелка, чтобы открыть подменю. Я бы хотел, чтобы пользователь щелкнул ссылку href = #, чтобы открыть соответствующее подменю. html для меню имеет тип:

<ul>
    <li id="menu-item-2476" class="menu-item" aria-haspopup="true">
        <a href="#">menu 1</a>
        <button class="dropdown-toggle" aria-expanded="false"></button>
        <ul class="sub-menu">
            <li id="menu-item-435" class="menu-item">
                <a href="https://www.myhost.it">sub menu1</a>
            </li>
        </ul>
    </li>
</ul>

после нажатия на элемент .dropdown-toggle в html становится

<ul>
    <li id="menu-item-2476" class="menu-item" aria-haspopup="true">
        <a href="#">menu 1</a>
        <button class="dropdown-toggle toggled-on" aria-expanded="true"></button>
        <ul class="sub-menu toggled-on">
            <li id="menu-item-435" class="menu-item">
                <a href="https://www.myhost.it">sub menu1</a>
            </li>
        </ul>
    </li>
</ul>

Я пытаюсь создать новую функцию, копируя предыдущую, но не могу заставить ее работать, я заменяю .dropdwon-toggle на "#", но ничего, когда нажимаю по ссылке # он не открывается, и документ не заменяет классы css, такие как функция оригинала темы. Кто-то настолько хорош, что ты можешь помочь мне создать эту маленькую функцию? если вам нужно увидеть js темы, это ссылка LINK .

Заранее благодарен за любую помощь.

** ### UPDATE # ## **

спасибо за ответ " stackingjasoncooper " и " Хоанг Чан Сон " для редактирования пост, действительно извините, но это был мой первый пост в этом сообществе, и прежде всего я перевожу с Google ITA> ENG. Я попробовал изменение, но, к сожалению, оно не работает, или, скорее, оно помещает класс ".toggled-on" в тег "a" вместо тега "<ul class="sub-menu>", более того, как только вы нажимаете "* 1034" * "ссылка, надпись внутри исчезает, также вставляется поле aria-expanded="false", которое должно принадлежать" кнопке ". Я потерял его весь день, но безрезультатно, извините за мое невежество. Это html после нажатия на текст меню

    <ul><li id="menu-item-2476" class="menu-item" aria-haspopup="true">
        <a href="#" class="toggled-on" aria-expanded="false"></a>
          <button class="dropdown-toggle" aria-expanded="false"></button>
            <ul class="sub-menu">
                <li id="menu-item-435" class="menu-item">
                    <a href="https://www.myhost.it">sub menu1</a>
                </li>
            </ul>
         </li>
     </ul>

В первом сообщении я не вставил весь скрипт, может быть, есть какая-то проблема в коде до того, как скрипт вставлен в первый пост.

function( $ ) {
            var body = $( 'body' ), _window = $( window ),  nav, button, menu;

            button = $( '.menu-toggle' );
            menu   = $( '.nav-menu' );

            function initMainNavigation( container ) {

                // Add dropdown toggle that display child menu items.
                container.find( '.menu-item-has-children > a' ).after( '<button class="dropdown-toggle" aria-expanded="false">' + screenReaderText.expand + '</button>' );
                container.find( '.page_item_has_children > a' ).after( '<button class="dropdown-toggle" aria-expanded="false">' + screenReaderText.expand + '</button>' );

                // Toggle buttons and submenu items with active children menu items.
                container.find( '.current-menu-ancestor > button' ).addClass( 'toggled-on' );
                container.find( '.current-menu-ancestor > .sub-menu' ).addClass( 'toggled-on' );

                // Add menu items with submenus to aria-haspopup="true".
                container.find( '.menu-item-has-children' ).attr( 'aria-haspopup', 'true' );

                /* container.find( '.dropdown-toggle' ).click( */
                container.find( '.dropdown-toggle, ul:not(.sub-menu) > .menu-item a' ).click(
                    function( e ) {
                        var _this = $( this );
                        e.preventDefault();
                        _this.toggleClass( 'toggled-on, ' );
                        _this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );
                        _this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );
                        _this.html( _this.html() === screenReaderText.expand ? screenReaderText.collapse : screenReaderText.expand );
                    }
                );
            }

Я ищу руководство jquery и понимаю ( Я надеюсь ), что функция ".next" возвращает следующий соседний тег , Поэтому, если я запускаю в поле «<button>», следующее поле будет «<ul>» ( подменю ). ul на самом деле поле, которое должно получить класс ".toggled-on", чтобы быть открытым. Если то, что я понимаю, верно .... Я должен создать новую функцию, которая включает в себя только поле "a", но дважды (.next), это потому, что поле "подменю" состоит из двух тегов html после. Я также попытался вставить (.next.next), но ничего!

Еще раз спасибо за любой ответ.

- МОЕ РАЗРЕШЕНИЕ

Доброе утро, спасибо Вы все из сообщества. Мне удалось заставить его работать так, как я хотел. Мне пришлось вставить новый скрипт, используя .next() правильно или, по крайней мере, я надеюсь. Как только сценарий был реализован, я понял, что если я нажму href="#", браузер выведет экран вверх, я введу условие, и, похоже, оно работает. Еще раз спасибо всему сообществу!

        container.find( '.menu-item a' ).click(
            function( e ) {
                var _this = $( this );
                e.preventDefault();
                _this.next().next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );
                _this.next( '.dropdown-toggle' ).toggleClass( 'toggled-on' );
                _this.next().attr( 'aria-expanded', _this.next().attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );
                if ( _this.attr('href') == "#" ) {}
                else{
                   window.location.href = this; 
                }
            }
        );

1 Ответ

0 голосов
/ 16 апреля 2020

Нет необходимости воссоздавать эту функцию, если вы можете редактировать ее. Вы можете развернуть селектор jQuery в прослушивателе click в своей функции:

container.find( '.dropdown-toggle, .menu-item a' ).click(...

В основном эта строка говорит:

  1. Go в «контейнер» (элемент jQuery, определенный в другом месте)
  2. Найти внутри контейнера вещи имеют теги dropdown-toggle или a внутри вещей с классом menu-item
  3. Добавьте прослушиватель щелчка к этим вещам, чтобы при их нажатии происходило следующее ...

Хотя селектор .menu-item a может быть слишком широким и включать sub-menu a теги и сломать их (что e.preventDefault() остановит ссылки работать). Поэтому мы должны использовать jQuery, а не селектор , чтобы быть более точным c:

container.find( '.dropdown-toggle, ul:not(.sub-menu) > .menu-item a' ).click(...

a теги внутри вещей с классом menu-item, которые находятся непосредственно внутри ul, который НЕ имеет sub-menu класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...