我在使用Bootstrap和WordPress实现下拉菜单时遇到了困难.我使用过滤器将‘DropDown-Togger-Split’类添加到具有子菜单的菜单项的链接元素中.然而,在配置后,下拉菜单的行为并不像预期的那样.当我点击第一个下拉切换菜单项时,会出现所有子菜单,而不仅仅是相关菜单项的子菜单.也许你可以看看这张图片:

enter image description here

说明:

WordPress过滤器用法:我正在使用NAV_MENU_LINK_ATTRIBUTES和NAV_MENU_ITEM_TITLE过滤器来修改具有子菜单的菜单项上的链接元素的属性和内容.我的目标是将DropDown-Togger-Split类添加到链接元素中,并更改这些菜单元素的HTML struct 以满足Bootstrap的要求.以下是代码:

 add_filter( 'nav_menu_link_attributes', function( $atts, $item, $args, $depth ) {
    // Cek jika menu item memiliki submenu

    if ( in_array( 'menu-item-has-children', $item->classes ) ) {
        $args->before = '<div class="btn-group" style="flex-direction: row-reverse;">';
        // $args->before .= '<a href="'.$item->url.'" class="nav-link">'.$item->title.'</a>';
        $atts['class'] .= ' dropdown-toggle dropdown-toggle-split';
        // Tambahkan data-toggle dan aria-haspopup ke atribut
        $atts['data-toggle'] = 'dropdown';
        $atts['aria-haspopup'] = 'true';
    }
    // Kembalikan array $atts yang telah dimodifikasi
    return $atts;
}, 10, 4 );

add_filter( 'nav_menu_item_title', function( $title, $item, $args, $depth ) {
    // Cek jika menu item memiliki submenu
    if ( in_array( 'menu-item-has-children', $item->classes ) ) {
        // Bungkus judul dengan elemen <span> yang memiliki class visually-hidden
        $title = '<span class="visually-hidden">' . esc_html__( 'Toggle Dropdown', 'your-text-domain' ) . '</span>';
        // Tambahkan elemen <a> untuk tautan menu
        $title .= '<a href="' . esc_url( $item->url ) . '" class="nav-link">' . esc_html( $item->title ) . '</a>';
        // Tambahkan div penutup untuk btn-group
        $args->after = '</div>';
    }
    // Kembalikan judul yang telah dimodifikasi
    return $title;
}, 10, 4 );

由于这段代码,我得到了具有相同aria-Labelledby="Menu-Item-Dropdown-179"的重复的‘ul Dropdown-Menu show’.

以下是html元素:

<li id="menu-item-179" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-2 current_page_item menu-item-has-children dropdown active menu-item-179 nav-item">
    <div class="btn-group" style="flex-direction: row-reverse;">
        <a href="#" data-toggle="dropdown" aria-expanded="false" class="dropdown-toggle nav-link dropdown-toggle dropdown-toggle-split" id="menu-item-dropdown-179" aria-current="page" aria-haspopup="true">
            <span itemprop="name"><span class="visually-hidden">Toggle Dropdown</span></span>
        </a>
        <a href="http://localhost/wc_course/sample-page/" class="nav-link">Sample Page</a>
    </div>
    <ul class="dropdown-menu show" aria-labelledby="menu-item-dropdown-179">
        <li id="menu-item-187" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-187 nav-item">
            <div class="btn-group" style="flex-direction: row-reverse;">
                <a itemprop="url" href="http://localhost/wc_course/sample-page-2/" class="dropdown-item dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true">
                    <span itemprop="name"><span class="visually-hidden">Toggle Dropdown</span></span>
                </a>
                <a href="http://localhost/wc_course/sample-page-2/" class="nav-link">Sample Page 2</a>
            </div>
            <ul class="dropdown-menu show" aria-labelledby="menu-item-dropdown-179">
                <li id="menu-item-188" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-188 nav-item">
                    <div class="btn-group" style="flex-direction: row-reverse;">
                        <a itemprop="url" href="http://localhost/wc_course/winter-warm-up-sale/" class="dropdown-item"><span itemprop="name">Winter Warm-up Sale</span></a>
                    </div>
                </li>
            </ul>
        </li>
    </ul>
</li>

这是我的Java脚本文件:

import $ from 'jquery';

class scriptNavbar {
    constructor() {
        this.events();
    }

    events() {
        $(document).ready(() => {
            $('.main-menu .dropdown-toggle').on('click', function (e) {
                e.preventDefault();
                // Close other dropdown-menus within the same level
                $(this).closest('.menu-item-has-children').siblings('.menu-item-has-children').find('.dropdown-menu').removeClass('show');
                // Toggle class for the clicked dropdown-menu
                $(this).closest('.menu-item-has-children').find('.dropdown-menu').toggleClass('show');
            });
        
            // Close dropdown-menus when clicking outside of them
            $(document).on('click', function (e) {
                if (!$(e.target).closest('.main-menu .dropdown').length) {
                    $('.main-menu .dropdown .dropdown-menu').removeClass('show');
                }
            });
            // Prevent closing the dropdown-menu when clicking inside it
            $('.main-menu .dropdown-menu').on('click', function (e) {
                e.stopPropagation();
            });
        });        
    }
}

export default scriptNavbar;

我怀疑这个问题源于重复的‘下拉菜单显示’元素,但我无法找到解决方案,因为WordPress Bootstrap NavWalker会自动生成这些元素的递增数字.如能协助解决这一问题,我们将不胜感激.提前感谢您的帮助!

我预计在单击下拉切换菜单项时,只会出现与该特定菜单项相关联的子菜单.换句话说,我预计下拉功能将按预期运行,显示相关的子菜单以响应用户交互.然而,尽管实施了修改,但无论点击了哪个下拉切换菜单项,下拉菜单都会同时显示所有子菜单.

推荐答案

我try 复制与您的代码类似的内容

$(document).ready(() => {
    $('.main-menu .dropdown-toggle').on('click', function (e) {
      e.preventDefault();
      //#######################################################################
      //##i cannot check this because your html does not have enough elements##
      //#######################################################################
      // Close other dropdown-menus within the same level
      $(this).closest('.menu-item-has-children').
        siblings('.menu-item-has-children').
        find('.dropdown-menu').removeClass('show');
      //###################################################################### 
        
      
      //if you want to use $.toggle() you need to remember that toggle() and toggleClass()
      // are not the same function:
      // $.toggle() use css style 
      //$.toggleClass() add / remove class
      // so if you use $.toggle() you need to check css display and "reset" content on "display=none"
      //=========================================================================================
      var heroBros=$(this).closest('.menu-item-has-children').find('.dropdown-menu');
      var hero=heroBros.first();

      // Toggle class for the clicked dropdown-menu
      hero.toggle('show',function(){
      
        //hide child when hide main=======================
        if($(this).css("display")=='none')heroBros.hide();
        //================================================
        
      });
           
    });

    // Close dropdown-menus when clicking outside of them
    $(document).on('click', function (e) {
    /*
        if (!$(e.target).closest('.main-menu .dropdown').length) {
            $('.main-menu .dropdown .dropdown-menu').removeClass('show');
        }
     */
    });
    // Prevent closing the dropdown-menu when clicking inside it
    $('.main-menu .dropdown-menu').on('click', function (e) {
        e.stopPropagation();
    });
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<ul class="main-menu">
<li id="menu-item-179" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-2 current_page_item menu-item-has-children dropdown active menu-item-179 nav-item">
    <div class="btn-group" style="flex-direction: row-reverse;">
        <a href="#" data-toggle="dropdown" aria-expanded="false" class="dropdown-toggle nav-link dropdown-toggle dropdown-toggle-split" id="menu-item-dropdown-179" aria-current="page" aria-haspopup="true">
            <span itemprop="name"><span class="visually-hidden">Toggle Dropdown</span></span>
        </a>
        <a href="#" class="nav-link">Sample Page</a>
    </div>
    <ul class="dropdown-menu " aria-labelledby="menu-item-dropdown-179">
        <li id="menu-item-187" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-187 nav-item">
            <div class="btn-group" style="flex-direction: row-reverse;">
                <a itemprop="url" href="#" class="dropdown-item dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true">
                    <span itemprop="name"><span class="visually-hidden">Toggle Dropdown</span></span>
                </a>
                <a href="#" class="nav-link">Sample Page 2</a>
            </div>
            <ul class="dropdown-menu" aria-labelledby="menu-item-dropdown-188">
                <li id="menu-item-188" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-188 nav-item">
                    <div class="btn-group" style="flex-direction: row-reverse;">
                        <a itemprop="url" href="" class="dropdown-item"><span itemprop="name">Winter Warm-up Sale</span></a>
                    </div>
                </li>
            </ul>
        </li>
    </ul>
</li>
</ul>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>

Javascript相关问答推荐

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

RxJS setTimeout操作符等效

在React中获取数据后,如何避免不必要的组件闪现1秒?

如何在Angular中插入动态组件

在JavaScript中声明自定义内置元素不起作用

编辑文本无响应.onClick(扩展脚本)

使用Java脚本导入gltf场景并创建边界框

本地库中的chartjs-4.4.2和chartjs-plugin-注解

从页面到应用程序(NextJS):REST.STATUS不是一个函数

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

无法避免UV:flat的插值:非法使用保留字"

在Odoo中如何以编程方式在POS中添加产品

是否可以将异步调用与useState(UnctionName)一起使用

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

对不同目录中的Angular material 表列进行排序

如何使pdf.js上的文本呈现为可选?

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0

单击子按钮时将活动切换类添加到父分区

Select 所有输入.值