以下测试应该以警报窗口始终弹出的方式失败。然后有人试图调试它将改变弹出窗口逻辑,以防止窗口填写时窗口出现。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<form id="myform" action="javascript:alert( 'success! both form fields are filled in.' );">
<input id="name" name="name" type="text" /><br>
<input id="email" name="email" type="text" /><br>
<input type="submit" value="submit" />
</form>
<script type="text/javascript" >
$("#myform").submit(function (event) {
var messages = "";
if ($("#name").val() == "") {
messages += "Name is required.";
}
if ($("#email").val() == "") {
messages += "Email is required.";
}
if (messages.length != "") {
alert(messages);
}
});
</script>
</body>
但是,当两个表单都填写时,我看不到窗口。虽然当消息为空时这会因为字符串不为0而失败,但messages.length报告正确。
如果没有填写任何字段或只填写其中一个字段,那么我会看到弹出消息。但是,再次,我希望它一直弹出。
如果表单字段有数据,那么使窗口不弹出的一种更明显的方法是询问
var messages = "";
.....
if (messages != "0"){
alert(message);
当messages.length为0时,为什么它不会失败?
&#34;&#34;在javascript中等于0?
messages.length被认为是一个字符串,因此不是&#34; 0&#34; !=&#34;&#34;?
答案 0 :(得分:2)
是的,快速测试会在javascript中显示0等于“”。 alert(0 == "");
改为使用messages.length !== ""
看看这里看到==和=== Which equals operator (== vs ===) should be used in JavaScript comparisons?
之间的差异答案 1 :(得分:2)
在javascript中,空字符串等于0.阅读http://www.c-point.com/javascript_tutorial/jsgrpComparison.htm。 ==使用类型转换。在这种情况下你应该使用===。
答案 2 :(得分:1)
尝试
var messages = "";
if ($("#name").val().length == 0) {
messages += "Name is required. ";
}
if ($("#email").val().length == 0) {
messages += "Email is required. ";
}
if (messages.length != 0) {
alert(messages);
}
如果用户没有输入任何内容,则进行所有检查。您正在尝试检查用户是否在输入元素中输入了任何内容。因此,当您获得实际值时,您需要检查该值的长度; a&#34;&#34;将返回0,任何其他字符(无论是否有效),将返回整数。
答案 3 :(得分:0)
这会有什么问题:
if (messages !== "") {
alert(messages);
}
这两个都有效并且表示意图(即如果你有它就会显示一条消息),而后来有人在阅读你的代码时不会想知道你是否想要在原始代码中使用javascript的'truthy'值聪明一些,或者如果这是错的......
我会注意到你也没有做任何事情来阻止表单提交,你可能也需要这样的东西:
if (messages !== "") {
alert(messages);
event.preventDefault();
}
答案 4 :(得分:0)
要解决这个问题,了解JavaScript如何处理真值和假值非常重要。
这些值永远是&#34; falsy&#34;:
此列表中不包含的其他值将始终为&#34; truthy&#34;。这将包括&#34; 0&#34;和&#34;假&#34; (引号中)。
比较值
var foo = (false == 0); -- Will be true.
var bar = (false == ""); -- Will be true.
var baz = (0 == ""); -- Will be true.
对于您的示例,false将始终等于false,因此错误将永远不会生成。
解决这个问题的一种可能方法是使用严格不等于(!==)。这将匹配类型,而不仅仅是值。
E.g。
var foo = (false == 0); -- Will be true.
var bar = (false === 0); -- Will be false.
希望这有帮助。