javascript如果变量为真

问题描述:

我不确定是否误解了True/False在Javascript中的工作方式。 在我的JQuery脚本下面我宣布6个变量为false。 如果正则表达式验证条件是好的,那么我重新声明变量为真。 底部是一个简单的alert()告诉我什么时候所有的变量都是真的。javascript如果变量为真

验证条件正在工作(删除/添加类),但警报不显示。这就是为什么我不确定我是否搞乱了真假部分。

$('#password1').keyup(function() { 
var checkLength = false; 
var checkLetter = false; 
var checkCaps = false; 
var checkNum = false; 
var checkSymbol = false; 
var checkSpace = false; 

var pswd = $(this).val(); 


//validate the length 
if(pswd.length < 6){ 
$('#length').removeClass('valid').addClass('invalid'); 
}else{ 
$('#length').removeClass('invalid').addClass('valid'); 
checkLength = true; 
} 

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
checkLetter = true; 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
checkCaps = true; 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
checkSymbol = true; 
} 

//validate no spaces 
if(pswd.match(/\s/)){ 
$('#spaces').removeClass('valid').addClass('invalid'); 
}else{ 
$('#spaces').removeClass('invalid').addClass('valid'); 
checkSpace = true; 
} 

// here is where I'm concerned I'm wrong 
if(checkLength == true && checkLetter == true && checkCaps == true && checkNum == true && checkSymbol == true && checkSpace == true){ 
    alert("All good"); 
} 

}); 

有人会检查我吗?

+4

*永远不会写'== true'。它几乎总是多余的,如果不是,你的脚本需要重构。 – 2012-08-08 15:18:51

+0

你可以做一个jsfiddle吗? – SomeKittens 2012-08-08 15:19:38

+1

我想你刚刚得到了一些错误的条件。例如,如果密码包含从'a'到'z'的任何字母,则不要将'checkLetter'设置为'true'。 '.match'如果**不匹配,则返回'null'。 – 2012-08-08 15:20:54

起初,没有必要编写checkLength == truecheckLength就足够了,因为它们都是布尔变量。

其次,在您的某些情况下,您可以指定类invalid,但将var设置为true,而在其他情况下,则可以将var设置为true。每个check... = true应与class = valid位于同一分支。 此外,我个人会修改有效性条件,在ifelse分支中拥有所有积极事件,但不会像现在这样混合使用。最后,我总是尽量避免重复的代码。有很多地方你可以重构,但你可以轻松地开始在一个单独的函数中设置类。

看到它的工作in this fiddle

$('#password1').keyup(function() { 
 
    var checkLength = false; 
 
    var checkLetter = false; 
 
    var checkCaps = false; 
 
    var checkNum = false; 
 
    var checkSymbol = false; 
 
    var checkSpace = false; 
 

 
    var pswd = $(this).val(); 
 

 

 
    //validate the length 
 
    // reverse the condition, to have the valid state in the if branch as well 
 
    if(pswd.length >= 6){ 
 
    setValid('#length'); 
 
    checkLength = true; 
 
    }else{ 
 
    setInvalid('#length'); 
 
    } 
 

 
    //validate letter 
 
    if(pswd.match(/[A-Za-z]/)){ 
 
    setValid('#letter'); 
 
    checkLetter = true; 
 
    }else{ 
 
    setInvalid('#letter'); 
 
    } 
 

 
    //validate capital letter 
 
    if(pswd.match(/[A-Z]/)){ 
 
    setValid('#capital'); 
 
    checkCaps = true; 
 
    }else{ 
 
    setInvalid('#capital'); 
 
    } 
 

 
    //validate number 
 
    if(pswd.match(/\d/)){ 
 
    setValid('#number'); 
 
    checkNum = true; 
 
    }else{ 
 
    setInvalid('#number'); 
 
    } 
 

 
    //validate symbols 
 
    if(pswd.match(/[^a-zA-Z0-9]/)){ 
 
    setValid('#symbol'); 
 
    checkSymbol = true; 
 
    }else{ 
 
    setInvalid('#symbol'); 
 
    } 
 

 
    //validate no spaces 
 
    if(!pswd.match(/\s/)){ 
 
    setValid('#spaces'); 
 
    checkSpace = true; 
 
    }else{ 
 
    setInvalid('#spaces'); 
 
    } 
 

 
    function setValid(e){$(e).removeClass('invalid').addClass('valid')} 
 
    function setInvalid(e){$(e).removeClass('valid').addClass('invalid')} 
 

 
    if(checkLength && checkLetter && checkCaps && checkNum && checkSymbol && checkSpace){ 
 
    alert("All good"); 
 
    } 
 
    console.log("keyup"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="password1" type="text">

+0

您编辑的最后一点不正确。该测试适用于符号,不适用于字符串开头的字母数字字符。 – 2012-08-08 15:29:03

+0

@Charmander ty,解决了这个问题 – Christoph 2012-08-08 15:34:14

所有这些都check* = true在错误的地方:

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
checkLetter = true; 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
checkCaps = true; 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
checkSymbol = true; 
} 

插入下面的if(在那里它们被认为是有效的),如else反对(在那里它们被视为无效)的块中的语句:

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
checkLetter = true; 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
checkCaps = true; 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
checkSymbol = true; 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
} 

而且,虽然有编写验证的更好的方法,这是你的片断类似,但更加简洁的版本:

$("#password1").keyup(function() { 
    var pswd = $(this).val(); 
    var checkLength = pswd.length >= 6; 
    var checkLetter = /[A-Za-z]/.test(pswd); 
    var checkCaps = /[A-Z]/.test(pswd); 
    var checkNum = /\d/.test(pswd); 
    var checkSymbol = /[^A-Za-z0-9]/.test(pswd); 
    var checkSpace = !/\s/.test(pswd); 

    $("#length") .removeClass("valid invalid").addClass(checkLength ? "valid" : "invalid"); 
    $("#letter") .removeClass("valid invalid").addClass(checkLetter ? "valid" : "invalid"); 
    $("#capital").removeClass("valid invalid").addClass(checkCaps ? "valid" : "invalid"); 
    $("#number") .removeClass("valid invalid").addClass(checkNum ? "valid" : "invalid"); 
    $("#symbol") .removeClass("valid invalid").addClass(checkSymbol ? "valid" : "invalid"); 
    $("#spaces") .removeClass("valid invalid").addClass(checkSpace ? "valid" : "invalid"); 

    if(checkLength && checkLetter && checkCaps && checkNum && checkSymbol && checkSpace) { 
     alert("All good"); 
    } 
}); 

对我来说,似乎你的任务是有效的语句。不管他们是否按照你想要的方式设置是另一回事。

这很可能是其中一个标志没有按照您希望设置的方式设置。要检查这一点,你可以提醒每个标志(checkCaps等),以确认每个值的设置都是你想要的。如果所有的真实/错误都是正确的,那么问题将出现在最终的if语句中。

正如许多人所建议的,删除== true是个不错的主意。由于Javascript是动态输入的,因此它有一个轻微的可能性,它不会将您的标志视为布尔值,而是作为别的东西。

如果删除== true不起作用,您可以检查不同的标记对以查看哪个标记使整个语句为false。