Jquery Toggle Menu/Показать и скрыть функцию

Я использую меню боковой панели 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 %>

Ваша помощь приветствуется. Пожалуйста, смотрите пример рис ниже.

Спасибо Сэм

введите здесь описание изображения

Редактировать: чтобы устранить проблему с меню, просто переместите ‹% control Menu(2) %> выше и ‹% end_control %> ниже финишного элемента меню. Решение Js состоит в том, чтобы использовать новый Js Мэтта. Спасибо, Мэтт, Янк и Майло! Я ценю вашу помощь!


person grumpypanda    schedule 19.12.2011    source источник


Ответы (3)


Вы никогда не говорите своей системе не печатать стрелку вниз, если дочерний элемент не существует. Он добавляет стрелку к каждому 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");
  }

});

Сейчас у меня обеденный перерыв, и у меня нет времени всесторонне проверить это. Я не проверял, будет ли это работать.

РЕДАКТИРОВАТЬ: Измененный код после того, как Сэм вставил свой чистый HTML.

EDIT2: после того, как Сэм предоставил скрипку, я разветвил ее и внес исправления. Скрипт: http://jsfiddle.net/GvGoldmedal/Wp2em/

person Matt Moore    schedule 19.12.2011
comment
Привет Мэтт, большое спасибо за ваш ответ. В этой строке возникла ошибка $(div.menu › h3).each(funtion(){... и она все еще не работает. Я также предоставил свой HTML-код выше. Любые другие предложения? Я очень ценю вашу помощь . Спасибо. - person grumpypanda; 20.12.2011
comment
Сэм, я обновил код после просмотра твоего чистого HTML. Еще раз приношу извинения за то, что не могу эффективно проверить свои предложения, так как у меня ограниченное время. Если эта проблема не будет решена сегодня вечером, я воссоздам ее на своем локальном компьютере и выясню, что не так. Ваше здоровье. :) - person Matt Moore; 20.12.2011
comment
Привет, Мэтт, спасибо, первая строка все еще показывает ошибку, и она все еще не работает. Вот мой код jsfiddle.net/uuGxe/2, если у вас будет время позже. Огромное спасибо. - person grumpypanda; 20.12.2011
comment
Привет, Мэтт, спасибо за ответ, он работает с моей первой проблемой, которая показывает/скрывает стрелку, когда есть/нет подменю. Когда я реализовал это в Silverstripe, меню h3 без стрелок, например, категория 2, закрывает следующее меню, в данном случае категория 3, есть идеи, почему это так? Может ли кто-то сделать с функцией клика в js? Большое спасибо за вашу помощь. :) - person grumpypanda; 20.12.2011
comment
Я только что понял, почему меню в Серебряной Полосе было съедено. Мне нужно переместить ‹% control Menu(2) %› вверх на один делитель. Спасибо за ваше отличное исправление js. Меню уже работает. Спасибо! - person grumpypanda; 20.12.2011

Я не понимаю язык шаблонов, который вы используете для создания своего меню, но я мог бы помочь с jQuery. Было бы очень полезно, если бы вы могли предоставить окончательный сгенерированный HTML-код вашего меню.

Я предполагаю, что ваши элементы div являются пунктом меню, ваши элементы h3 — содержимым пункта меню, а ваш ul — подменю. Если это правильно, вы можете скрыть стрелки, добавив следующую строку в свою основную функцию:

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

Если вы находите этот код слишком медленным, вы можете идентифицировать меню без подменю на стороне сервера и дать им класс, что-то вроде menu_no_submenu, чтобы затем вы могли заменить сложный селектор в приведенном выше коде гораздо более быстрым '.menu_no_submenu' или, что еще лучше, скрыть всю стрелку в css.

person Miloš Rašić    schedule 19.12.2011
comment
Привет, Мило Расич, я разместил свой HTML-код выше. Это все еще не работает. Любые другие предложения? Большое спасибо! - person grumpypanda; 20.12.2011

Вы можете установить фон в коде шаблона, а не использовать 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 %>
person startupsmith    schedule 19.12.2011
comment
Привет Янкс, спасибо за ваш ответ. Я вижу, что вы пытаетесь сделать, но стрелка полностью исчезла, если вы не нажмете на нее, и каждый раз, когда я нажимаю на h3, у которого нет подменю, она все равно съедает меню внизу. Не уверен, почему? Любые другие предложения? Благодарю вас! - person grumpypanda; 20.12.2011
comment
Вероятно, это потому, что у вас есть $(this).next().slideToggle, что означает, что он будет переключать следующий элемент независимо от того, что это такое? Используйте if внутри вашего $('div.menu › h3'). щелкните, чтобы убедиться, что есть ‹ul class=second_level›, прежде чем вы сделаете слайдер. - person startupsmith; 20.12.2011
comment
РЕДАКТИРОВАТЬ: я вставил jquery в jsfiddle, и, похоже, он не ест меню внизу. Посмотрите здесь jsfiddle.net/DpPTZ, вроде все работает. - person startupsmith; 20.12.2011
comment
Привет, Янкс, извините, я новичок в этом, как мне вывести оператор if для функции щелчка? Огромное спасибо. - person grumpypanda; 20.12.2011
comment
Я знаю, что все это выглядит хорошо, когда это в html и js, но когда я реализую это в Silverstripe, меню внизу заменяется меню выше (они одного уровня). Я думаю, что ваше предложение по оператору if может помочь, но я не уверен, как это сделать. Какие-либо предложения? Спасибо, Янк. - person grumpypanda; 20.12.2011
comment
Привет Сэм. Silverstripe не должен влиять на это, если html тот же. Я бы посоветовал вам открыть новый вопрос об этой проблеме, поскольку он кажется отличным от вашего первоначального вопроса? Тогда, если возможно, было бы хорошо, если бы вы могли разместить живую страницу своего веб-сайта Silverstripe, которую люди могли бы использовать? - person startupsmith; 20.12.2011
comment
Я также пробовал это на jsfiddle, и он работает правильно. Я тоже думаю, что маловероятно, что Silverstripe может помешать работе html, css и js. Сэм, когда происходит подобное странное поведение, ты всегда должен проверять, учитываются ли изменения, которые ты вносишь в код. Откройте исходный код своей страницы и проверьте, генерируется ли правильный html и загружаются ли правильные версии файлов js и css. - person Miloš Rašić; 20.12.2011
comment
Спасибо, Янкс, и спасибо Мило Расичу. Это определенно групповой эффект. Я использовал Js-код Мэтта и следил за всеми вашими комментариями, ребята, оказалось, что мне нужно переместить ‹% control Menu(2) %› вверх на один div, чтобы решить проблему с меню, глупый я. Эй, большое спасибо за вашу помощь, вы молодцы, я очень ценю вашу помощь и последующие действия. :) - person grumpypanda; 20.12.2011