2010-12-13 2 views
1

Я просто пытаюсь создать простое меню переключения с помощью jQuery, но не могу заставить его работать.jQuery toggle menu click through problems

В его нынешнем состоянии он не скользит тумблер

HTML:

<ul id="menu"> 
    <li><a href="one.html">One</a> 
     <ul> 
      <li><a href="one-one.html">one one</a></li> 
      <li><a href="one-two.html">one two</a></li> 
      <li><a href="one-three.html">one three</a></li> 
     </ul> 
    </li> 
    <li><a href="two.html">Two</a></li> 
    <li><a href="three.html">Three</a> 
     <ul> 
      <li><a href="three-one.html">three one</a></li> 
      <li><a href="three-two.html">three two</a></li> 
      <li><a href="three-three.html">three three</a></li> 
     </ul> 
    </li> 
    <li><a href="four.html">Four</a></li> 
</ul> 

JS:

$(document).ready(function() { 

    // Hide the sub menu items first 
    $("ul#menu > li > ul").hide(); 

    // On click 
    $('ul#menu > li').click(function() { 

     // If there are sub items toggle them & prevent default click action 
     if (('ul#menu > li').has('ul').length > 0) { 
      $('ul#menu > li > ul').slideToggle("slow"); 
      return false; 
     }; 

    }); 
}); 

мне нужно, чтобы скользить тумблер, но и обрабатывать щелчки соответствующим образом, так что элементы родительского списка не нажимают, но элементы подменю переходят на соответствующие страницы.

ответ

0

Это будет делать то, что вы хотите, если я правильно понимаю ваш вопрос:

$(document).ready(function() { 

    // Hide the sub menu items first 
    $("ul#menu > li > ul").hide(); 

    // On click 
    $('ul#menu > li > a').click(function() { 
     if($('ul', $(this).parent()).children().length) { 
      $('ul', $(this).parent()).slideToggle("slow"); 
      return false; 
     } else { 
      return true; 
     } 
    }); 
    $('ul#menu > li').click(function(e) { 
     // If there are sub items toggle them & prevent default click action 
     if ($(e.target).is("li")) { 
      // or (e.target == this) if you don't want child li's to toggle 
      $('ul', this).slideToggle("slow"); 
      return false; 
     } else { 
      return true; 
     } 

    }); 
}); 

Вы можете проверить его здесь: http://jsfiddle.net/5fNbh/

Обновление: позаботится о дополнительных случаях, указанных в комментариях.

+0

I дал это тест как локально, так и с помощью JSFiddle, но он, похоже, не работал. Нажав на каждый пункт меню, просто перейдите на эту страницу без переключения слайдов (?) – Ian

+0

Ian: Я предположил, что это то, что вы хотели, так как ваши якорные метки имел конкретные цели (one.html и т. д.). Я изменил свой ответ, так что щелчок на якорях верхнего уровня не будет следовать их целям. – vls

+0

Простите, я должен был указать. Я просто имитирую действие Выход CMS I pl a использовать его, с которым связывают родителей, даже если им не нужно никуда идти, если у них есть дети. Есть еще одна небольшая проблема, хотя в том списке элементов, у которых НЕ есть дети, также отключены ссылки. Есть ли способ проверить, имеет ли элемент списка дочерние элементы, а если нет, то сохраните ссылку? Спасибо за вашу помощь. – Ian

0

The

return false; 

добавляет e.preventDefault() (и остановить распространение) в < li> вместо < тег>. пересвязать нажмите на < а> или сделать

$('#menu') 
    .find('li').has('ul') 
    .find('a').click(function() { return false; }); 

(см < а> теперь получает возвращение ложным?)

+0

Ах хороший момент. Я изменил его на следующее: $ ('ul # menu> li> a'). Click (function() { – Ian

+0

Мне все еще нужно получить часть слайд-слайдов. – Ian

0
+0

Спасибо за ссылки, но я не глядя на плагины или меню эффектного эффекта. Я просто хочу понять, почему он не работает и не основывается на основах оттуда. Для меня важнее понять, почему, чем использовать плагин, который сделает это для меня. – Ian