4

先週 jQuery でコーディングを始めたばかりで、メニューを適切に機能させる方法を理解するのに助けが必要です。それぞれ独自のメニューを持つ 3 つのタブがあります。ページが表示されると、メニューとサブメニューが自動的に表示されます。表示されたら、ユーザーはタブの上にカーソルを置いて他のサブメニューを表示できます。ホバーを停止すると、元のサブメニューが表示されます。

私の問題は、他のタブのサブメニューを表示することはできますが、ユーザーがサブメニュー項目をクリックするためにサブメニューを開いたままにしておくことができないことです。他のチュートリアルでは、サブメニューが親要素内にネストされている場合にのみこれを行う方法を示していますが、メニュー構造のコードにはサブメニューがネストされていません (これは、プロジェクトに参加したときのコードです)。ユーザーがそれぞれのタブにカーソルを合わせた場合、サブメニューを開いたままにする方法はありますか?

ここに私のメニューHTMLがあります:

    <div id="navigation">
        <div id="main-nav">
            <div id="kids"><a href="../images/nav1.png"></a></div>
            <div id="community"><a href="../images/nav2.png"></a></div>
            <div id="about"><a href="../images/nav3.png"></a></div>
        </div>
    </div>

    <div id="sub-nav"> 
        <ul class="menu-1 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>
        <ul class="menu-2 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>
        <ul class="menu-3 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>

これまでの私のjQueryは次のとおりです。

// For JS users, display sub menus by default
$(".requiresJS").css("display","block");

var startMenu

//hide all sub menus
$("#sub-nav ul").hide();

// check URL for about, community or kids and set startMenu with correct term
if(window.location.href.indexOf("about") != -1){startMenu = "about"}
else if(window.location.href.indexOf("community") != -1){startMenu = "community"}
else{startMenu = "kids"}

// highlight correct category tab
$("div#main-nav #" + startMenu).addClass("selected");

// show correct starting menu
$("#sub-nav ul.menu-" + startMenu).show('slide', {direction: 'right'}, 600).effect("bounce", { times:1,direction:"right",distance:13 }, 300);

// show correct menu on mouseover of div
$("div#main-nav div").mouseover(function() {

    $("#sub-nav ul").stop(true, true)
    $("#sub-nav ul").hide();

    var currentId = $(this).attr('id');

    $("#sub-nav ul.menu-" + currentId).show();      
});

$("div#main-nav div").mouseover(function() {
        $("#sub-nav ul").stop(true, true)
        $("#sub-nav ul").hide();
        var currentId = $(this).attr('id');
        $("#sub-nav ul.menu-" + currentId).show();      
});
4

2 に答える 2

6

同様のケースがあり、mouseover イベントを別の mouseenter イベントと mouseleave イベントに分割することで解決しました。疑似コード/アウトラインだけですが、あなたのケースでは次のようなものを試してください:

$("div#main-nav div").mouseenter(function() {
   // Check if sub menu is open, return if it is allready open
   // (I add a 'menu_open' class to sub menu when it is opened)

   // Code to hide open submenues
   // Code to open selected submenu      
});

次に、mouseleave とそのイベントの toElement プロパティを使用して、マウスポインタがどこに移動したかを確認します。サブ メニューに移動した場合は何もせず、すべてのサブ メニューを閉じない場合は何もしません。サブメニューでも mouseleave イベントをフックする必要があることに注意してください。このようなもの:

$("#main-nav div").mouseleave(function (event) {
   var toElem = $(event.toElement);
   if (toElem.closest("div.sub-nav").id=="subnav") return; // Prob nicer way to do this...point is to check if mouse enters a submenu, and if so stay open.
   // Close all open submenues, e.g. 
   $("#sub-nav ul").hide();
 });

 $("#subnav ul").mouseleave(function (event) {
    var toElem = $(event.toElement);
    if (toElem.closest("div.sub-nav").id=="subnav") return; // Check if entering submenu
    if (toElem.closest("div#main-nav")) return; // Check if entering main menu
    // Close all open submenues, e.g.
    $("#sub-nav ul").hide();
 });

これがあなたの助けになることを願っています。これを自分で解決しただけなので、それを磨く時間がありませんでした。これを行うためのより良い、よりきれいな方法があると確信しています。

于 2011-12-09T14:55:14.437 に答える
4

私も同様の状況にありましたが、残念ながら、「適切な」親子構造に対応するためにメニュー全体を再フォーマットできませんでした。

セレクターでサブメニューを呼び出すだけでも、ホバー状態の間は「開いた」ままになります。

http://jsfiddle.net/K5P9Z/

例 -

jQuery(document).ready(function($) {

$('#kids, .menu-1').hover(function() {
    $('.menu-1').show();
}, function() {
    $('.menu-1').hide();
});
 $('#community, .menu-2').hover(function() {
    $('.menu-2').show();
}, function() {
    $('.menu-2').hide();
});
 $('#about, .menu-3').hover(function() {
    $('.menu-3').show();
}, function() {
    $('.menu-3').hide();
});

});​
于 2012-11-29T15:48:27.263 に答える