【问题标题】:Jquery Toggle Menu / Show and Hide functionJquery 切换菜单/显示和隐藏功能
【发布时间】:2011-12-19 19:36:57
【问题描述】:

我使用的是 Jquery Toggle 侧边栏菜单,因此菜单中有一个向下箭头可将菜单向下推以在每次单击时显示子菜单。我的问题是当没有子菜单/子菜单时,向下箭头仍然显示,当你点击它时,它会吃下面的同级菜单。我正在使用 Silverstripe 中的菜单。如何使箭头仅在有子菜单/子菜单时显示?

/------------------------------------------ ----这是我的切换菜单 js---------------------------------------- ----------/

$(document).ready(function() {

$('.second_level').hide();

$("div.menu > h3").css("background", "url(themes/tutorial/images/menuarrowdown.gif) no-repeat right");

$('div.menu > h3').click(function() {

$(this).next().slideToggle('fast', function() {

//set arrow depending on whether menu is shown or hidden
if ($(this).is(':hidden')) {

$(this).prev().css("background", "url(themes/tutorial/images/menuarrowdown.gif) no-repeat right");
} else {
$(this).prev().css("background", "url(themes/tutorial/images/menuarrowup.gif) no-repeat right");
}
return false;
});
});
});

/------------------------------------这是我的 html 代码-- --------------------------------------------/

<div id="productmenu"> <!-- productmenu starts -->
<div class="menu">                      
  <h3><a href="#">Category 1</a></h3>
    <ul class="second_level">
      <li><a href="page.html">Option 1</a></li>
      <li><a href="page.html">Option 2</a></li>
   </ul>
</div> <!-- /menu -->

<div class="menu">

   <h3><a href="#">Category 2</a></h3>

</div> <!-- /menu -->

<div class="menu">
  <h3><a href="#">Category 3</a></h3>
     <ul class="second_level">
      <li><a href="page.html">Option 1</a></li>
       <li><a href="page.html">Option 2</a></li>
      <li><a href="page.html">Option 3</a></li>
    </ul>
</div> <!-- /menu -->
</div><!-- /productmenu -->

/------------------------------------这是我的页面.ss- ---------------------------------------------/

  <% control Menu(2) %>

     <h3><a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a></h3>

        <% if Children %>   <ul class="second_level">
              <% control Children %>
               <li class="$LinkingMode"><a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a></li>
              <% end_control %></ul>

        <% end_if %>
  <% end_control %>

感谢您的帮助。请参阅下面的示例图片。

谢谢 山姆

编辑:要解决吃掉菜单的问题,只需将 移动到菜单的结束 div 上方和 下方。 Js 解决方案是使用 Matt 的新 Js。谢谢马特、伊恩克和米洛!感谢您的帮助!

【问题讨论】:

    标签: php javascript jquery content-management-system silverstripe


    【解决方案1】:

    如果不存在子项,您永远不会告诉系统不打印向下箭头。它将箭头添加到菜单中存在的每个 H3 中,并且从不考虑它是否有子级。所以我们需要检查每个菜单项是否有子项。以下应该做到这一点:

    $("div.menu").each(function(){
    
      if($(this).children().length > 1) // See if the H3 is the only child
      {
          $(this).children("H3").css("background", "url(themes/tutorial/images/menuarrowdown.gif) no-repeat right");
      }
    
    });
    

    目前我正在午休,没有时间对此进行全面测试。我没有证实这会起作用。

    编辑:Sam 放入纯 HTML 后修改的代码。

    EDIT2:Sam 提供小提琴后,我将其分叉并进行了更正。小提琴:http://jsfiddle.net/GvGoldmedal/Wp2em/

    【讨论】:

    • 嗨,马特,非常感谢您的回复。这一行出现了一个错误 $("div.menu > h3").each(funtion(){... 它仍然无法正常工作。我在上面也提供了我的 html 代码。还有其他建议吗?我真的很感激你的帮助。谢谢。
    • Sam,我在查看了您的纯 HTML 后更新了代码。再次道歉,由于时间有限,我无法有效地测试我的建议。如果这个问题到今晚还没有解决,我会在我的本地重新创建它并找出问题所在。干杯。 :)
    • 嗨,马特,谢谢,我的第一行仍然显示错误并且它仍然无法正常工作。如果您以后有时间,这是我的代码jsfiddle.net/uuGxe/2。谢谢大家。
    • 嗨,马特,感谢您的回复,它正在处理我的第一个问题,即当有/没有子菜单时显示/隐藏箭头。当我将它实现到 Silverstripe 时,无箭头 h3 菜单(例如类别 2)在这种情况下为类别 3 关闭下一个菜单,关于为什么会这样的任何想法?会不会有人跟js中的点击功能有关?非常感谢您的帮助。 :)
    • 我刚刚弄清楚为什么 Silverstripe 的菜单被吃光了。我需要将 向上移动一个 div。感谢您出色的 js 修复。菜单现在正在工作。谢谢!
    【解决方案2】:

    我不了解您用于创建菜单的模板语言,但我可以帮助您使用 jQuery。如果您能提供最终生成的菜单的 html,将会有很大帮助。

    我假设你的 div 元素是一个菜单项,你的 h3 元素是一个菜单项内容,你的 ul 是一个子菜单。如果这是正确的,您可以通过在主函数中添加以下行来隐藏箭头:

    $('div.menu:has(ul.second_level) > h3').css('background', '');
    

    如果你发现这段代码太慢,你可以在服务器端识别没有子菜单的菜单,并给它们一个类,比如 menu_no_submenu,这样你就可以用更快的速度替换上面代码中的复杂选择器' .menu_no_submenu' 或者,更好的是,在 css 中隐藏整个箭头。

    【讨论】:

    • 嗨 Milo Rasic,我现在已经把我的 html 代码放在上面了。它仍然无法正常工作。还有其他建议吗?非常感谢!
    【解决方案3】:

    您可以在模板代码中设置背景,而不是使用 jQuery。

    创建一个包含背景的 css 类。

    .menuHeader { background: url("themes/tutorial/images/menuarrowdown.gif") no-repeat scroll right center transparent; }
    

    如果菜单有子菜单,则在您的模板代码中将类设置为 h3。

    <% control Menu(2) %>
        <% if Children %>   
          <h3 class="menuHeader"><a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a></h3>
        <ul class="second_level">
              <% control Children %>
                <li class="$LinkingMode"><a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a></li>
              <% end_control %>
        </ul>
       <% else %>
            <h3><a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a></h3>
       <% end_if %><% end_control %>
    

    【讨论】:

    • 您好 Ianks,感谢您的回复。我可以看到您要做什么,但是除非您单击箭头,否则箭头会完全消失,并且每次单击没有子菜单的 h3 时,它仍然会吃掉下面的菜单。不知道为什么?还有其他建议吗?谢谢!
    • 这可能是因为你有 $(this).next().slideToggle 这意味着它会切换下一个元素,不管它是什么?在你的 $('div.menu > h3').click 中使用 if 来检查是否有
        在你进行滑动切换之前。
    • 编辑:我将 jquery 粘贴到 jsfiddle 中,它似乎并没有吃掉下面的菜单。看看这里jsfiddle.net/DpPTZ 它似乎工作正常。
    • 嗨 Ianks,对不起,我是新手,如何为 click 函数输出 if 语句?谢谢大家。
    • 我知道它在 html 和 js 中看起来都不错,但是当我将它实现到 Silverstripe 时,下面的菜单被上面的菜单占用(它们是同一级别的)。我认为您对 if 语句的建议可能会有所帮助,但我不确定该怎么做。有什么建议么?谢谢伊恩克。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多