Я решил не копаться в вашем коде и попытаться исправить его, потому что я думаю, что есть гораздо лучший подход к созданию навигационных меню с простым плагином jQuery.Тем не менее, это не поможет вам решить вашу проблему с помощью кода, но, надеюсь, вы все равно найдете это полезным.
Итак, вот что я придумал.
HTML:
<ul class="nav-menu">
<li>
<a href="#">Menu 1</a>
<ul>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 2</a>
<ul>
<li><a href="#">Subsubmenu 1</a></li>
<li><a href="#">Subsubmenu 2</a></li>
<li><a href="#">Subsubmenu 3</a></li>
<li><a href="#">Subsubmenu 4</a></li>
</ul>
</li>
<li><a href="#">Submenu 3</a></li>
<li><a href="#">Submenu 4</a></li>
</ul>
</li>
<li>
<a href="#">Menu 2</a>
<ul>
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 2</a></li>
<li><a href="#">Submenu 3</a></li>
<li><a href="#">Submenu 4</a></li>
</ul>
</li>
</ul>
Код плагина:
(function($){
function traverseItems($items) {
$items.each(function(){
var $item = $(this),
$submenu = $item.children("ul").hide();
if ($submenu.length) {
$item.children("a").click(function(){
$submenu.toggle();
return false;
}).append(" \>");
traverseItems($submenu.children("li"));
}
});
}
$.fn.navMenu = function (options){
var defaults = {
showAllToggle: true
};
options = $.extend({}, defaults, options);
return this.each(function(){
var $this = $(this)
.addClass("nav-menu"),
$items = $this.children("li");
traverseItems($items);
if (options.showAllToggle) {
$showAll = $("<a></a>")
.attr("href", "#")
.addClass("show-all")
.text("Toggle all")
.toggle(function(){
$this.find("ul").show();
return false;
}, function(){
$this.find("ul").hide();
return false;
})
.wrap("<li></li>")
.parent()
.prependTo($this);
}
});
};
})(jQuery);
Использование:
$(function(){
$(".nav-menu").navMenu();
});
ВыЯ могу видеть все это в действии на jsFiddle .
Я могу развить этот ответ и разрезать его на куски, если потребуется.Если у кого-то есть какие-либо предложения или идеи о том, как это можно улучшить, я весь в ушах.