【问题标题】:Show Hidden Sub-Menu OnClick By Avoiding Link Of Parent Menu通过避免父菜单的链接显示隐藏的子菜单
【发布时间】:2020-05-03 05:19:51
【问题描述】:

我正在做一个项目,最糟糕的是我无法编辑我的项目的 HTML 代码。我只能编辑 CSS/JavaScript。我的项目是我有一个使用<ul><li>... 的菜单列表,其中也有子列表。完整的 HTML 代码如下...

<ul class="main_list">
 <li class="parent">
  <a href="##########">Menu-1</a>
   <ul class="children">
    <li><a href="##########">SubMenu-1</a></li>
    <li><a href="##########">SubMenu-2</a></li>
    <li><a href="##########">SubMenu-3</a></li>
   </ul>
 </li>
 <li><a href="##########">Menu-2</a></li>
 <li><a href="##########">Menu-3</a></li>
 <li><a href="##########">Menu-4</a></li>
 <li class="parent">
  <a href="##########">Menu-5</a>
   <ul class="children">
    <li><a href="##########">SubMenu-1</a></li>
    <li><a href="##########">SubMenu-2</a></li>
    <li><a href="##########">SubMenu-3</a></li>
   </ul>
  </li>
</ul>

这是我无法编辑的 HTML 代码。我只能编辑或添加 CSS/JavaScript。在这里,我想隐藏所有 children 菜单,并在单击父菜单时显示。但是当我们点击那里的父菜单时,它会转到父菜单上的外部链接。那么有什么办法或解决方案...???

更新: 请记住,我也希望父菜单链接也能正常工作。我有一个想法,在父菜单前面添加一些文本,例如show/hide,并制作一些 JavaScript 来打开其子菜单,在这种情况下,如果我们直接单击父菜单链接,它也将起作用。现在我们可以使用 JavaScript 在父菜单前面添加一些文本/图标,因为我无法编辑 HTML 吗?

【问题讨论】:

  • 让子菜单在:hover上出来?如果这不是一个可能的解决方案,请创建一个 JSFiddle,以便我们可以使用它。
  • event.preventDefault() 在您的点击功能中
  • @Rvervuur​​t 是的,我可以用:hover 处理它,但我想在点击后保持打开状态。
  • @empiric 我也希望父菜单链接也能正常工作... :(
  • 打开菜单并保持父链接正常工作似乎是相互矛盾的目标。如果单击菜单项打开子菜单,则父链接不应该工作(否则浏览器会在用户与子菜单交互之前导航离开页面)。您可以在具有子项的菜单项旁边附加某种下拉箭头 - 单击父项将导航到它的链接,但单击箭头会打开子菜单。

标签: javascript jquery html css menu


【解决方案1】:

您的点击功能:

$('.main_list .parent > a').on('click', function(event){
    event.preventDefault();

    var href = $(this).attr('href'); // save the href for further use
    $(this).siblings('.children').show(); //or whatever show-function you want to use

   window.location.href = href; //if you want to user to be redirected
   //OR
   window.open(href,'_blank'); //for opening a new tab

});

对于您的第二个请求,您可以执行以下操作:

$(document).ready(function{
    $('.main_list .parent').prepend('<span class="show">Show</span>');
});

那么您在上面的点击处理程序中的选择器将是:

$('.show')

Demo

【讨论】:

  • @MuhammadHassan 我在回答中添加了我的小提琴
  • 是的,您可以通过.addClass()ref 向元素添加多个类。
  • 要在链接后添加文本,您可以使用.append() 而不是.prepend()
【解决方案2】:

通过 JavaScript 缓存你的父点击事件,然后使用 event.preventDefault() 停止重定向,然后你可以做一些逻辑来显示/隐藏菜单项。

$(document).ready(function(){
    $.each('.parent', function(){
          $(this).prepend('<div class="clickableBox"></div>');
    })

    $(document).on('click', '.clickableBox', function(event){       
       //show/hide logic here
    })
})

【讨论】:

  • 在这种情况下,您应该在 .parent 类元素之前或之后添加一个 div 框,并在用户单击添加的框时执行您的显示/隐藏元素。所以我现在会更新我的答案
  • 这里不需要$.each,如api[...]to the beginning of each element in the set of matched elements中所述
  • 是的,您可以在没有每个功能的情况下获得您的功能。这是小提琴link
  • @eXpas 是的。您的 FIDDLE 是正确的,但所选答案具有更多功能。也为你休息 VoteUP....
【解决方案3】:

根据我上面的评论...

在带有子项的菜单项旁边添加一个下拉箭头 - 点击父项将导航到它的链接,但点击箭头会打开子菜单

JSfiddle DEMO

CSS:

ul.children {
    display: none;
}

查询:

$(function(){
    $('li.parent').each(function(){
        $(this).children('a').after('<img src="http://upload.wikimedia.org/wikipedia/commons/f/f7/Arrow-down-navmenu.png" />');
    });

    $('li.parent img').on("click",function(){
        $(this).siblings('ul.children').toggle();
    });
});




EDITED JQUERY(带箭头图像切换):

$('li.parent img').on("click",function(){
    if($(this).hasClass('open')) {
        $(this).removeClass('open');
        $(this).attr('src','Arrow-down.png');
    } else {
        $(this).addClass('open');
        $(this).attr('src','Arrow-up.png');
    }
    $(this).siblings('ul.children').toggle();
});

Updated DEMO

【讨论】:

  • 你的代码也如我所愿。您还可以在切换单击时更改箭头图像以看起来更棒...???
  • 是的,您只需在点击功能中切换箭头图像。查看updated fiddle here(我也会将其添加到上面的答案中)。
  • 酷。您分享了另一个答案,但 StackOverFlow 只有一个选项可以选择正确。休息投票给你... :)
【解决方案4】:

由于我看不到完整的 HTML,我的行为就像 main_list 是唯一的。

// Get all anchors in menu
var anchors = document.getElementsByClassName('main_list')[0].getElementsByTagName('a');
// Change HREF to do nothing
for(a in anchors){
    a.href = "javascript:void(0);
}
// Do other stuff

在所有内容加载完毕后,让该代码在页面末尾运行。将href 更改为javascript:void(0) 将不会执行任何操作。

【讨论】:

  • 你不能点击让它不工作,然后在不修改你的HTML的情况下工作。
【解决方案5】:

以下对我有用:)

jQuery(function( $ ){
 $(document).ready(function(){
  $('.main_list a').click(function (e) {
    if ($(this).parent().children('ul').is(':visible') != true) {
        $(this).parent().children('ul').show();
        e.preventDefault();
        return false;
     }
   })
  });
});

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2010-11-18
    • 2014-09-22
    相关资源
    最近更新 更多