【问题标题】:Jquery switch statement works occasionallyJquery switch 语句偶尔会起作用
【发布时间】:2012-01-16 09:43:56
【问题描述】:

我对编写自己的 jquery 函数还是很陌生,我发现调试它非常困难,因为错误消息在输入谷歌时并没有太大帮助。

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

滚动总是有效,动画偶尔有效,悬停有效通常我必须点击链接两次。 return 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;
    });

很抱歉要求被灌输,但我遵循了我所学的正确语法。有什么我应该知道的事情正在阻止我所期望的工作吗?

编辑:对不起,我忘记了,我在(平均)每秒点击滚动锚链接时收到此错误

未捕获的类型错误:无法读取未定义的属性“0”

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

【问题讨论】:

  • 我看起来在您单击其中一个链接之前不会应用悬停,这是正确的吗?如果 return false 没有取消点击事件,那么您的处理程序中有错误(但我找不到它)。
  • 我要补充一点:你经常使用$('.scrolltoanchor')。如果结果永远不会改变(即它总是返回相同的节点),那么您最好将结果存储在一个变量中,这将使您的脚本更快,尽管我怀疑您只会看到几个节点的任何性能问题,只是要记住的事情;)
  • 是的,我基本上希望在单击链接时更改整个站点的配色方案,更改具有该类的元素的颜色,因此是的,单击链接时悬停颜色会发生变化。感谢您提供有关性能的提示,这将是节点的范围

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


【解决方案1】:

你采取了错误的方法。

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

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

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

然后绑定一次handler,使用点击的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;
});

【讨论】:

  • 我没有勇气写这篇文章,所以在这里我至少可以做一个支持。
  • 谢谢@Jon。我完全明白你的意思。
  • 很好,我用一些漂亮的代码完成了我的答案的编辑,却发现你打败了我。惊人的相似代码。我会删除我的。
  • 这对我来说很棒,全新的领域。我确实理解它,但我不明白为什么悬停功能不起作用,我让每个 .scrolltoanchor 仅在第一次悬停时闪烁为橙色(可能是因为这是现有的 css 设置),然后永久更改无论“出”是什么。当我检查警报时,正在设置“结束”,但它没有被使用。
  • 没关系,它只是选择器中的一个空格。太棒了,非常感谢!
【解决方案2】:

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

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

还可以在switch语句之外绑定hover来消除部分代码重复:

$(".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;
});

【讨论】:

  • 好的,谢谢,我刚刚尝试在每种情况下添加 $(this).unbind('hover') (在新的悬停功能之前),然后我尝试在切换之前添加一次陈述。都没有奏效。我也试过 $(this).unbind('mouseenter mouseleave')。 ?
  • 不是$(this).unbind("hover")。您需要取消绑定所有链接。使用$('.scrolltoanchor').unbind('hover')。
  • 谢谢。另外,感谢您提供与上述类似的代码!
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多