我需要更新我的jQuery代码

时间:2013-03-30 17:42:58

标签: javascript jquery menu navigation

我从CSSTRICKS获得了一段代码,这是一条神奇的线条导航,它会在我的菜单项下放一条线,然后移过我悬停的那条。我希望它是这样的,当我点击菜单时,该行将停留在该菜单项,而不是像往常一样回到第一个。

该脚本使用类选择器来告诉默认情况下该行的位置。有了这个,我用jQuery做了一个toggleClass,它将类传递给单击的菜单项,但它没有更新。我必须重新加载页面才能更新。而且,它再次陷入了同样的境地。我希望有人知道如何做到这一点。这是我的代码:

$(window).bind("load", function () {
    var $el, leftPos, newWidth;
    $mainNav2 = $("#example-two");

    /*
    EXAMPLE ONE
*/

    /* Add Magic Line markup via JavaScript, because it ain't gonna work without */
    $("#line-menu").append("<li id='magic-line'></li>");

    /* Cache it */
    var $magicLine = $("#magic-line");

    $magicLine.width($(".current_page_item").width())
        .css("left", $(".active a").position().left)
        .data("origLeft", $magicLine.position().left)
        .data("origWidth", $magicLine.width());

    $("#line-menu li").find("a").hover(function () {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();

        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function () {
        $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
        });
    });
});

3 个答案:

答案 0 :(得分:1)

将魔术线移动到它自己的功能。编辑在下面评论。

  $(document).ready(function(){
        magicline();
    });

function magicline() {

    var $el, leftPos, newWidth,
        $mainNav = $("#example-one");
    //remove the old magic line before creating a new one.
    $("#magic-line").remove();
    $mainNav.append("<li id='magic-line'></li>");
    var $magicLine = $("#magic-line");

    $magicLine
        .width($(".current_page_item").width())
        .css("left", $(".current_page_item a").position().left)
        .data("origLeft", $magicLine.position().left)
        .data("origWidth", $magicLine.width());

    $("#example-one li a").hover(function() {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();
        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function() {
        $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
        });    
    });
}
//on click on a new menu item iterate through and remove the class
//then add the class back to the parent of the a clicked and recall the 
//magicline function
$('li a').on('click',function(){
    $('li').each(function(){ 
       $(this).removeClass('current_page_item');               
    });
    $(this).parent().addClass('current_page_item');
    magicline();
});

演示:http://jsfiddle.net/calder12/vtuKH/1/

PS。我使用了CSSTRICKS的代码,你必须更改id以匹配你的id。

答案 1 :(得分:1)

我或多或少地猜测CSS和标记,但这更简洁:

$(window).bind("load", function () {
    var $lineMenu = $("#line-menu"),
        $active = $lineMenu.children('.current_page_item'),
        $magicLine = $("<li id='magic-line'></li>");

    $magicLine
        .width($active.width())
        .css("left", $active.position().left)
        .appendTo($lineMenu);

    $lineMenu.on('mouseenter mouseleave click', 'li:not(#line-menu)', function (e) {
        var $el = e.type == 'mouseleave' ? $active : $(this);

        if (e.type == 'click') {
            $el.addClass('active').siblings().removeClass('active');
            $active = $el;
        } else {
            $magicLine.stop().animate({
                left: $el.position().left,
                width: $el.width()
            });
        }
    });
});

http://jsfiddle.net/userdude/tTsk6/

答案 2 :(得分:0)

该行回到原始位置,因为hover附有回调。在这种情况下,您需要做的是,当单击菜单项时,您需要避免该行转到原始位置。

这就是我要做的事情 -

附加点击处理程序,当用户点击菜单项时设置一个标志以显示该菜单已被选中。在hover的回调函数中检查此标志,如果设置则返回。否则,如果不是平面设置,请将线路移至先前位置。

var $magicLine = $("#magic-line");
var isClicked = false;  // to show whether menu is clicked or not

$magicLine.width($(".current_page_item").width())
    .css("left", $(".active a").position().left)
    .data("origLeft", $magicLine.position().left)
    .data("origWidth", $magicLine.width());

$("#line-menu li").find("a").hover(function () {
    $el = $(this);
    leftPos = $el.position().left;
    newWidth = $el.parent().width();

    $magicLine.stop().animate({
        left: leftPos,
        width: newWidth
    });
}, function () {
   if(!isClicked){         // if no item is clicked, take line to old position
      $magicLine.stop().animate({
          left: $magicLine.data("origLeft"),
          width: $magicLine.data("origWidth")
      });
    }else{                 // else, just keep it there  
       isClicked = false;
       return false;
    }
}).click(function(e){   // added click listener 
    isClicked = true;       // flag is set to indicate menu item is clicked.
    $magicLine.css({
        left: leftPos,
        width: newWidth
    });                             
});

首先,我认为unbinding hover会阻止调用回调但是没有成功。所以用旗帜试了一下。请阅读代码评论,我没有回答所有问题。