【问题标题】:Javascript removeClass/toggleClass works on desktop but not responsive pageJavascript removeClass/toggleClass 适用于桌面,但不适用于响应式页面
【发布时间】:2020-05-31 10:49:15
【问题描述】:

我不久前购买了这个主题,并一直在对其进行拆分和修改以添加/删除功能。一旦从导航栏菜单中单击链接,页面上就会出现这个幻灯片菜单。问题是有一个 X 按钮来关闭菜单,当它被点击时应该从 #btn-offcanvas-menu 元素中切换/删除一个类(#btn-close-canvasmenu 是可点击元素);它适用于桌面,但不适用于响应式移动网站。在移动设备上切换/删除它的唯一方法是再次单击原始链接。我在这里查看了以下问题以及其他几个问题,包括尝试使用最接近/查找的选项,但似乎没有任何效果。我错过了什么?

期望的行为:当#btn-close-canvasmenu 链接被点击时,isLeft 类应该被切换/移除。它在桌面上,但不在移动设备上。

这是索引页的相关部分...

    <li id="recent-mobile"><!-- this is hidden by CSS on desktop -->
            <a id="btn-offcanvas-menu" href="#">Recent Results</a>
    </li>
    <li id="recent-results"><!-- this is hidden by CSS on mobile -->
        <div class="header-buttons pull-right hidden-xs hidden-sm">
            <div class="navright-button">
                <a href="#" id="btn-offcanvas-menu"><i class="fa fa-bars">  Recent Results</i></a>
            </div>
        </div>
    </li>

    <!-- Menu OffCanvas right begin -->
    <div class="navright-button">
        <div class="compact-menu-canvas" id="offcanvas-menu">
            <h3>menu</h3><a id="btn-close-canvasmenu"><i class="fa fa-close"></i></a>
            <nav>
                <ul class="clearfix">
                    <li><a href="index.html">Home</a></li>
                    <li><a href="features.html">Features</a></li>
                    <li><a href="pages.html">Pages</a></li>
                    <li><a href="portfolio.html">Portfolios</a></li>
                    <li><a href="shop.html">Shop</a></li>
                    <li><a href="blog.html">Blog</a></li>
                    <li><a href="contact.html">Contact Us</a></li>
                </ul>
            </nav>
        </div>
    </div>
    <!-- Menu OffCanvas right close -->

这是 javascript compact.js 文件的相关部分...

$("#btn-close-canvasmenu").on("click", function() {
    $("#offcanvas-menu").stop().animate({
        right: "-260px"
    }, 300), $("a#btn-offcanvas-menu").removeClass("isLeft")
});

$(document).on("click", "#btn-offcanvas-menu, #btn-offcanvas-menu-mobile", {} , function(a){
    var id = $(this).attr('id');
    if (id === "btn-offcanvas-menu-mobile") {
        $("#btn-close-canvasmenu").toggleClass("mobile");
    }

    return a.preventDefault(), $(this).hasClass("isLeft") ? $("#offcanvas-menu").stop().animate({
        right: "-260px"
    }, 300) : $("#offcanvas-menu").stop().animate({
        right: "0px"
    }, 300), $(this).toggleClass("isLeft"), false
});

编辑(2020 年 2 月 16 日修复):我编辑了 js 文件文件以反映这个更新的功能:$("#btn-close-canvasmenu").on("click", function()

基本上,修复它的原因是将选择器从 #btn-offcanvas-menu 更改为 #btn-offcanvas-menu。不知道为什么这与使用最接近/查找方法相反,但是一旦我这样做了,它就会正确切换/删除桌面和移动设备上的类。如果有人对为什么 a 对选择器产生影响有任何想法,我将不胜感激,因为我不是 js/jQuery 专家。否则,这可以被认为是关闭的。

【问题讨论】:

  • @Bhargav Rao:我进行了要求的编辑;请重新打开您关闭的问题。
  • 您的 HTML 似乎无效。我看不到关闭&lt;/ul&gt;,虽然我看到li,然后是divul 不能有除 li 以外的其他孩子。
  • @connexo:上面存在的唯一
      在导航关闭之前关闭。每个元素都是封闭的。
  • 不在您显示的代码中。
  • @connexo 我附加的代码中只有一个
      标签,它被代码中唯一的
    标签关闭。我只提供了索引的相关部分,而不是整个索引,因为其中一个模块最初关闭了这个问题,说只提供必要的内容。所以我将它编辑到与手头问题相关的部分。

标签: javascript jquery


【解决方案1】:

将 compact.js 文件中的选择器从 #btn-offcanvas-menu 更改为 a#btn-offcanvas-menu 解决了问题,虽然这有效,但正如 connexo 指出的那样,这是纠正问题的错误方法,原因是重复的 ID。

解决此问题的正确方法是更改​​移动导航栏本身,以便我可以使用专门用于仅出现在那里的移动的 id。

<nav id="mobile-menu" class="site-mobile-menu hidden-lg hidden-md">
    <ul>
        <li id="recent-mobile">
            <a href="#" id="btn-offcanvas-menu-mobile">Recent Results</a>
        </li>
    </ul>
</nav>

接下来,我将填充移动菜单 html 的 js 函数更改为使用 prepend 而不是 append,因此它填充了最近结果链接上方的所有内容...

$("#desktop-menu > ul").children().clone().prependTo($("#mobile-menu > ul")), $("#show-mobile-menu").on("click", function() {
    $(this).toggleClass("clicked"), $("#mobile-menu > ul").stop(true, true).slideToggle()
}); 

然后我调整了 js 函数,如果选择器是 #btn-offcanvas-menu-mobile 以供稍后使用,则将类切换为移动类以用于 #btn-close-canvasmenu...

$(document).on("click","#btn-offcanvas-menu,#btn-offcanvas-menu-mobile", {} , function(a){
    var id = $(this).attr('id');

    if (id === "btn-offcanvas-menu-mobile") {
        $("#btn-close-canvasmenu").toggleClass("mobile");
    }

    return a.preventDefault(), $(this).hasClass("isLeft") ? $("#offcanvas-menu").stop().animate({
        right: "-260px"
    }, 300) : $("#offcanvas-menu").stop().animate({
        right: "0px"
    }, 300), $(this).toggleClass("isLeft"), false
});

最后,我调整了关闭菜单的 js 函数来检查类以确定哪个 id 来切换 isLeft 类...

$(document).on("click","#btn-close-canvasmenu", {} , function(a){
    var id = $(this).attr('id');

    if ($(this).hasClass("mobile")) {
        var container = $("#btn-offcanvas-menu-mobile");
        $("#btn-close-canvasmenu").toggleClass("mobile");
    } else {
        var container = $("#btn-offcanvas-menu");
    }

    $("#offcanvas-menu").stop().animate({
        right: "-260px"
    }, 300), container.removeClass("isLeft")
});

【讨论】:

  • 您仍然有 重复的 ids,这是绝对必须修复
  • @connexo:事情是这样的:桌面有一个导航栏,javascript 使用它来填充移动导航栏的 html。 css 会根据屏幕大小隐藏其中一个导航栏,但总是有完全相同的两组
  • 。这就是它被复制的方式,但一组总是隐藏的。这就是为什么我认为切换只会影响可见 id 但我想不会。我刚刚重新设计了导航栏和 js,并将我的更改作为答案发布,因为我不再需要 js 选择器中的 a。感谢您的帮助。
  • #btn-offcanvas-menu 是骗子,这使得id 的选择变得困难。属性id 必须是唯一的 - 其他的都是class(显然不必是唯一的)。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签