JQuery addClass不使用switch语句,并且是指令

JQuery addClass不使用switch语句,并且是指令,jquery,Jquery,addClass在某些情况下对我来说似乎不起作用。请查看以下代码: $("#my-div-container .my-sub-div li a").live('mouseover', function(e){ e.preventDefault(); var li_parent_elem = $(this).parent(); li_parent_elem.siblings().removeClass(); switch(true) {

addClass在某些情况下对我来说似乎不起作用。请查看以下代码:

$("#my-div-container .my-sub-div li a").live('mouseover', function(e){
    e.preventDefault();

    var li_parent_elem = $(this).parent();
    li_parent_elem.siblings().removeClass();

    switch(true)
    {
        case (li_parent_elem.is("#my-div-container .my-sub-div li:first-child") == true):
            //alert("First");
            li_parent_elem.addClass("first");
        break;

        case (li_parent_elem.is("#my-div-container .my-sub-div li:last-child") == true):
            //alert("Last");
            li_parent_elem.addClass("last");
        break;

        default:
            //alert("Mid");                     
            li_parent_elem.addClass("mid");
    }
});
addClass不适用于前两个case语句,只适用于默认值。但是,当我取消对alert指令的注释时,我得到了正确的警报,因此我知道条件语句正在工作


我不确定这里出了什么问题,我希望能得到一些帮助。

我认为您不需要在那里安装开关(而且开关看起来很坏!)。请尝试以下方法:

if (li_parent_elem.is("#my-div-container .my-sub-div li:first-child"))
    li_parent_elem.addClass("first");
else if (li_parent_elem.is("#my-div-container .my-sub-div li:last-child"))
    li_parent_elem.addClass("last");
else 
    li_parent_elem.addClass("mid");

我不认为你真的需要一个开关(而且那个开关看起来很坏!)。请尝试以下方法:

if (li_parent_elem.is("#my-div-container .my-sub-div li:first-child"))
    li_parent_elem.addClass("first");
else if (li_parent_elem.is("#my-div-container .my-sub-div li:last-child"))
    li_parent_elem.addClass("last");
else 
    li_parent_elem.addClass("mid");
改进:

$('#my-div-container .my-sub-div').delegate('li a', 'mouseover', function(e) {
    e.preventDefault();

    var items = $(this).parent().siblings('li');

    items.removeClass().addClass(function() {
        return $(this).is(':first') ? 'first' : ($(this).is(':last') ? 'last' : 'mid');
    });
});
改进:

$('#my-div-container .my-sub-div').delegate('li a', 'mouseover', function(e) {
    e.preventDefault();

    var items = $(this).parent().siblings('li');

    items.removeClass().addClass(function() {
        return $(this).is(':first') ? 'first' : ($(this).is(':last') ? 'last' : 'mid');
    });
});

在做了一点修改之后,我似乎找到了一个解决方案,尽管我不太喜欢它,因为我不明白为什么它能工作,而以前的代码不能

以下是修改后的代码:

$("#my-div-container .my-sub-div li a").live('mouseover', function(e){
e.preventDefault();

var li_parent_elem = $(this).parent();
li_parent_elem.siblings().removeClass();

switch(true)
{
    case (li_parent_elem.is("#my-div-container .my-sub-div li:first-child") == true):
        //alert("First");
        li_parent_elem.removeAttr("class").addClass("first");
    break;

    case (li_parent_elem.is("#my-div-container .my-sub-div li:last-child") == true):
        //alert("Last");
        li_parent_elem.removeAttr("class").addClass("last");
    break;

    default:
        //alert("Mid");                     
        li_parent_elem.addClass("mid");
}
});
我仍然不知道为什么即使我删除了switch语句并在我以前的代码中使用if-else,它仍然不起作用,但它确实起作用了


可能是一个bug或什么的。

经过一点修改,我似乎找到了解决这个问题的方法,尽管我并不喜欢它,因为我不明白为什么它能工作,而以前的代码不能

以下是修改后的代码:

$("#my-div-container .my-sub-div li a").live('mouseover', function(e){
e.preventDefault();

var li_parent_elem = $(this).parent();
li_parent_elem.siblings().removeClass();

switch(true)
{
    case (li_parent_elem.is("#my-div-container .my-sub-div li:first-child") == true):
        //alert("First");
        li_parent_elem.removeAttr("class").addClass("first");
    break;

    case (li_parent_elem.is("#my-div-container .my-sub-div li:last-child") == true):
        //alert("Last");
        li_parent_elem.removeAttr("class").addClass("last");
    break;

    default:
        //alert("Mid");                     
        li_parent_elem.addClass("mid");
}
});
我仍然不知道为什么即使我删除了switch语句并在我以前的代码中使用if-else,它仍然不起作用,但它确实起作用了


可能是一个bug什么的。

就像我说的,切换条件有效,所以这不能解决问题。但为了更好的衡量,我尝试了它,正如预期的那样,它没有改变任何事情。谢谢你的建议,我同意。我认为你的话太过分了:。switch语句的作用是将一个值与另一个值进行比较。这有点像说“当我的值等于开关位中的值时”,然后做点什么。也就是说,你不需要在每一个case语句中都显式地声明比较。我并不真正关心它在工作时的外观,使用我之前提到的警报测试,它可以作为一个条件语句工作。我只需要弄清楚为什么addClass()在案例中不起作用,即使alert()起作用。就像我说的,切换条件起作用,所以这并不能解决问题。但为了更好的衡量,我尝试了它,正如预期的那样,它没有改变任何事情。谢谢你的建议,我同意。我认为你的话太过分了:。switch语句的作用是将一个值与另一个值进行比较。这有点像说“当我的值等于开关位中的值时”,然后做点什么。也就是说,你不需要在每一个case语句中都显式地声明比较。我并不真正关心它在工作时的外观,使用我之前提到的警报测试,它可以作为一个条件语句工作。我只需要弄清楚为什么addClass()在案例中不起作用,即使alert()起作用。谢谢,但这实际上不起作用。请注意:first和:first child是不同的,并且:first child是基于HTML的结构方式所需要的。另外,each()的迭代不是我所需要的,因为我试图将class()添加到鼠标上方的单个项中。当我将鼠标悬停在一个“中间”项上时,您提供的代码会将class()添加到多个同级,这违背了我尝试执行的全部目的。很酷,我肯定误解了您要查找的内容。很难理解-->“只要它能工作,我真的不关心它的外观”。我会尝试修正这个咒语,编写更完善的代码,这样其他程序员就可以查看它并了解您要做的事情。不过,感谢这些代码片段,它们让我想到了delegate()函数,这在我的词汇表中并不存在。别误会我的意思,我喜欢经过修饰的代码,但我更喜欢在代码开始工作时这样做,在我使它变得更优雅之前我了解发生了什么,这就是我要说的,也就是说,在我考虑将其作为三元运算符以减少行大小之前,我想确保我的if-else语句工作正常。谢谢,但这实际上不起作用。请注意:first和:first child是不同的,并且:first child是基于HTML的结构方式所需要的。另外,each()的迭代不是我所需要的,因为我试图将class()添加到鼠标上方的单个项中。当我将鼠标悬停在一个“中间”项上时,您提供的代码会将class()添加到多个同级,这违背了我尝试执行的全部目的。很酷,我肯定误解了您要查找的内容。很难理解-->“只要它能工作,我真的不关心它的外观”。我会尝试修正这个咒语,编写更完善的代码,这样其他程序员就可以查看它并了解您要做的事情。不过,感谢这些代码片段,它们让我想到了delegate()函数,这在我的词汇表中并不存在。别误会我的意思,我喜欢经过修饰的代码,但我更喜欢在代码开始工作时这样做,在我使它变得更优雅之前我了解发生了什么,这就是我要说的,也就是说,在我考虑将其作为三元运算符以减少行大小之前,我想确保我的if-else语句工作正常。你能发布一些html吗,也许试着设置一个我们可以尝试和修复的?你可以发布一些html,也许试着设置一个我们可以尝试和修复的?