2011-07-07 101 views
1

我试图改变一个按钮的状态,如果三个特定元素都应用了特定的类。javascript条件语句使用&&

此前,我只是简单地计算“完整”类的li的数量,但现在我需要更具体一些。

$("#signUp li").click(function(){ 
    $(this).addClass("complete"); 
    // if($("#signUp li.complete").length >= 3){ 

     if( $ ("#signUp li:first-child" && "#signUp li:nth-child(5)" && "#signUp li:nth-child(7)").hasClass("complete")) 
     { 
     $("#done").addClass("active"); 
     }; 
    }); 

我已经试过这和一些变体,但最好的结果是满足条件时设置在最后一里的类来“完成”

我一直关注着了一点,但无法找到符合我的情况的特定实例。

总是感谢令人敬畏的反应,教育和纠正我的业余方式。

回答

2

你的jQuery选择是无效的,你真正需要做的是这样的:

$("#signUp li").click(function(){ 
    $(this).addClass("complete"); 

    if(
     $("#signUp li:first-child").hasClass("complete") && 
     $("#signUp li:nth-child(5)").hasClass("complete") && 
     $("#signUp li:nth-child(7)").hasClass("complete")) 
    { 
     $("#done").addClass("active"); 
    } 
}); 

您当前的代码运行,只有当最后一个选择具有此类,因为琴弦被评价为一个布尔操作。这意味着以下进行:

"#signUp li:first-child" && "#signUp li:nth-child(5)" && "#signUp li:nth-child(7)" 

当此判断为真(它总是这样,因为非空字符串“truthy”),它只是返回最后一个评估值,这将是"#signUp li:nth-child(7)",所以你的整个陈述被编入:

if($("#signUp li:nth-child(7)").hasClass("complete")) { 
     $("#done").addClass("active"); 
    }; 
}); 
+0

非常感谢,解释它,我曾尝试过,但在每次挑战前没有“$”。 – Ichimonban

+0

这将是“#signUp李:nth-​​child(7)”这是不正确的......没有任何陈述是永远运行。整个字符串将首先被评估。这实际上传递给jquery。 – aepheus

+0

@aepheus - 当所有值都为真时,JavaScript将返回AND语句中的最后一个评估值。示例:http://jsfiddle.net/4zdBk/2/。 –

1

怎么样简单的声明是这样的:

 if($("#signUp li:first-child").hasClass("complete") 
       && $("#signUp li:nth-child(5)").hasClass("complete") 
       && $("#signUp li:nth-child(7)").hasClass("complete")){ 
      ... code 
     } 
1

这样的:

if( $ ("#signUp li:first-child" && "#signUp li:nth-child(5)" && "#signUp li:nth-child(7)").hasClass("complete")) 

应该是这样的(改善):

if( $ ("#signUp").find("li:first-child:not(.complete), li:nth-child(5):not(.complete), li:nth-child(7):not(.complete)").length == 3) 

“#signUp李:第一,孩子“& &”#signup li:n-child(5)“& &“#signUp li:n-child(7)”

的计算结果为true,因为& &是一个逻辑运算符。所以你真的在做$(true).hasClass(...)

0

使用not选择器来确定是否有任何不完整。

http://jsfiddle.net/

if ($("li:not(.complete)").length == 0) {} 
+0

这不具有相同的含义。 – aepheus

+0

@aepheus - 我认为这肯定是可行的,更容易理解和更容易维护。作为表单需求的变化,他不必增加越来越多的&&,他可以利用多个类,例如'complete'和'required'。 – mrtsherman

+0

我同意这是可行的。但是你必须考虑一个情况,即只有1,5和7完成时才能执行函数。如果2,3,4或6完成,则此代码将错误地禁止执行,但1,5,7则不执行。 – aepheus

0

敢肯定是不对的,你对字符串这不会给你所期望的结果做一个& &操作。然而,以下,将工作。

$ ("#signUp li:first-child").hasClass("complete") 
    && $("#signup li:nth-child(5)").hasClass("complete") 
    && $("#signup li:nth-child(7)").hasClass("complete") 
+0

其实不,这可能是一个工会而不是一个交集。忽略这个答案,与所有人一起去吧。 –

+0

如果其中任何一个课程已完成,则这将评估为真。 #signUp也需要在每个li之前。 – aepheus

+0

是的,我现在才意识到这一点。可能应该在发布之前对其进行测试。 –