Jquery switch语句偶尔会起作用

时间:2011-12-09 00:42:45

标签: javascript jquery colors jquery-animate switch-statement

我是编写自己的jquery函数的新手,我觉得调试非常困难,因为在放入google时错误消息不太有用。

我有一个页面锚点的导航菜单,当点击每个页面时,屏幕会滚动到锚点,元素将根据哪一个改变颜色,悬停颜色也会改变。我认为非常简单。

滚动总是有效,动画偶尔会工作,而悬停工作通常我必须点击链接两次。返回false仅适用于您单击的第一个链接。

这使用scrollTo和animate-colors插件。

谁能告诉我我做错了什么?

$(".scrolltoanchor").click(function() {
                                $('a').removeClass('selected');
                                $(this).addClass('selected');
        $.scrollTo($($(this).attr("href")), {
            duration: 750
        });

        switch ($(this).attr("id")) {
            case 'personal':
            $('.scrolltoanchor').animate({color: '#E4D8B8'});
            $(".scrolltoanchor").hover(
            function() {
            $(this).css('color', 'blue');
            },function(){
            $(this).css('color', '#E4D8B8');
            });
            break;

            case 'achievements':
            $('.scrolltoanchor').animate({color: '#ffffff'});
            $(".scrolltoanchor").hover(
            function() {
            $(this).css('color', 'red');
            },function(){
            $(this).css('color', '#ffffff');
            });
            break;

            case 'skills':
            $('.scrolltoanchor').animate({color: '#dddddd'});
            $(".scrolltoanchor").hover(
            function() {
            $(this).css('color', 'orange');
            },function(){
            $(this).css('color', '#ffffff');
            });
            break;


        }

        return false;
    });

很抱歉要求成为勺子,但我已经遵循了我所学到的正确语法。有什么我应该知道的,就像我期望的那样停止这种工作吗?

编辑:对不起,我忘记了,我平均每次点击一次scrolltoanchor链接时出现此错误

未捕获的TypeError:无法读取未定义的属性“0”

我无法发现真实的模式。有时它似乎只发生在以前没有点击过的,有时不会。 感谢

2 个答案:

答案 0 :(得分:4)

你采取了错误的做法。

您应该将悬停处理程序绑定一次,然后根据单击的颜色决定颜色。

最简单的方法可能是将颜色数据存储在查找表中,其中键是元素的ID。

var ids = {
    personal: {
        over:'blue',
        out:'#E4D8B8'
    },
    achievements: {
        over:'red',
        out:'#ffffff'
    },
    skills: {
        over:'orange',
        out:'#dddddd'
    }
};
var current = ids.personal;

然后绑定处理程序一次,并使用单击的id来设置current颜色集。

var scroll_anchors = $(".scrolltoanchor");

scroll_anchors.hover( function() {
    $(this).css( 'color', current.over );
},function(){
    $(this).css( 'color', current.out );
});

scroll_anchors.click(function() {
     $('a.selected').removeClass('selected');
     $(this).addClass('selected');

     $.scrollTo($($(this).attr("href")), { duration: 750 });

     current = ids[ this.id ]; // set the current color set based on the ID

     scroll_anchors.animate({ color: current.out });

     return false;
});

答案 1 :(得分:2)

当您多次拨打.hover()时,您不会删除旧的事件处理程序,而只是添加一个新事件处理程序。每次都会调用每个处理程序。您需要先致电.unbind("hover")

$(".scrolltoanchor").unbind("hover").hover(function () {
    ...
});

您还可以绑定到switch语句之外的鼠标悬停以消除一些代码重复:

$(".scrolltoanchor").click(function () {
    $('a').removeClass('selected');
    $(this).addClass('selected');
    $.scrollTo($(this.href), {
        duration: 750
    });
   var off, on;
    switch (this.id) {
        case 'personal':
            off = '#E4D8B8';
            on = 'blue';
            break;
        case 'achievements':
            off = '#ffffff';
            on = 'red';
            break;
        case 'skills':
            off = '#dddddd';
            on = 'orange';
            break;
    }

    $('.scrolltoanchor')
        .animate({ color: off })
        .unbind("hover")
        .hover(function () {
            $(this).css('color', on);
        }, function () {     
            $(this).css('color', off);
        });

    return false;
});