私がやろうとしているのは、マルチレベルのメニューを作ることです。メニューには、ユーザーが必要とする数のサブメニューを含めることができます。最初は一番上のメニューのみを表示したいのですが、ユーザーが 1 つの項目をクリックした後、メニューを下にスライドさせてその項目のサブメニューを表示したいと考えています。次に、ユーザーはそれらの項目の 1 つをクリックして、次のサブメニューを展開することができます。
そのため、3 番目のサブメニューに到達した後、サブレベルのアニメーションを処理するのがややこしくなりました。最初からやり直して、ロジックを処理するメニューのクラスを作成することにしました。私はJavaScriptクラスを初めて使用しますが、これまでのところ私が持っているものは次のとおりです:
function Menu(ul, parent){
$ul = $(ul);
this.lis = [];
this.parent = parent || false;
$ul.children('li').each(function(i, li){
this.lis.push(new Li(li, this));
});
}
function Li(li, menu){
$li = $(li);
if($li.children('div').length)
this.submenu = new Menu($($li.children('div')[0]).children('ul')[0], menu);
else
this.submenu = false;
}
var m = new Menu($('#menu'));
このサブメニューに使用しているアニメーションも典型的ではありませんslideDown
。メニューを下にスライドさせてから、サブメニューをフェードインさせます。したがって、HTML では、サブメニューを div、slideDown
div、そしてfadeIn
ul でラップしました。したがって、ここに私の HTML がどのように見えるかを示します (任意のレベルに任意の数の項目があり、任意の数のレベルが存在する可能性があることを思い出してください):
<ul>
<li>
Menu Item 1
<div>
<ul>
<li>
Submenu Item 1
</li>
<li>
Submenu Item 2
<div>
<ul>
<li>Sub-Submenu Item 1</li>
<li>Sub-Submenu Item 2</li>
</ul>
</div>
</li>
<li>
Submenu Item 3
</li>
</ul>
</div>
</li>
<li>Menu Item 2</li>
</ul>
<li>
項目がメニューのどこにあるかを知ることができるクラスを書きたかったのです。そのため、アニメーションを使用してメニューを閉じて別の部分を開く必要がある場合、自分でコードを追跡する代わりに、単純なクラス呼び出しを使用することができました。明らかに、私はこのコードを書き始めたばかりですが、方法がわからないため、この部分を乗り越えることができません。
に が追加され、次にMenu Item 1
が追加されますが、項目 2 が追加されず、エラーが発生するため、新しい Menu オブジェクトを作成しているため、追跡が失われているようです。そのため、この作業を行うために何ができるかわかりません。誰か説明してくれませんか?this.lis
Submenu Item 1
Uncaught TypeError: Cannot call method 'push' of undefined
this