以下脚本应仅验证某些输入字段,具体取决于用户在下拉框中所做的选择(var problem)。
我遇到的麻烦是当if语句运行于问题== 4(下面)并且用户填写了相应的cityid字段时,警报(警报#3)用于下一个if语句(问题== 5)被触发。如果用户从下拉列表中选择了问题== 5并且尚未填写模型字段,我只希望触发警报#3。
当if语句为问题== 5运行时,分别会发生同样的问题。
function ValidateSOR()
{
var user = document.SOR.User;
var problem= document.SOR.Problem;
var cityid = document.SOR.CityID;
var errors1 = document.SOR.ErrorCodes1;
var model = document.SOR.Model;
var errors2 = document.SOR.ErrorCodes2;
var software = document.SOR.SoftwareType;
if (user.value == "")
{
window.alert("Please enter your name.");
user.focus();
return false;
}
if (problem.selectedIndex < 1)
{
alert("Alert#1");
problem.focus();
return false;
}
if (problem.selectedIndex == 4)
{
cityid.focus();
}
else if (cityid.value == "")
{
alert("Alert#2");
cityid.focus();
return false;
}
if (problem.selectedIndex == 5)
{
model.focus();
}
else if (model.value == "")
{
alert("Alert#3");
model.focus();
return false;
}
if (problem.selectedIndex == 6)
{
software.focus();
}
else if (software.value == "")
{
alert("Alert#4");
software.focus();
return false;
}
return true;
}
答案 0 :(得分:3)
当你发现问题是#4时,你没有从函数返回。因此,因为 4,那么它不是5,因此该分支的“else”部分被采用。
编辑 - 好的,我们来看看代码:
if (problem.selectedIndex == 4) {
cityid.focus();
}
else if (cityid.value == "") {
alert("Alert#2");
cityid.focus();
return false;
}
if (problem.selectedIndex == 5) {
model.focus();
}
else if (model.value == "") {
alert("Alert#3");
model.focus();
return false;
}
如果指数为4,会发生什么?此代码运行:
cityid.focus();
那么什么?代码进入下一个if
语句:
if (problem.selectedIndex == 5) {
现在,如果我们刚刚注意到指数是4,那么它有多少等于5?零!因此,该比较保证为false
,因此我们转移到else
部分。显然,您的“model.value”是空字符串,因此if
语句成功。你得到警报。
我认为您的问题可以通过使代码的逻辑更符合验证过程的逻辑来解决:
if (problem.selectedIndex == 4 || cityid.value == "") {
cityid.focus();
return false;
}
这样,如果索引是4 或,如果城市ID值为空,那么您将把它视为城市ID的错误并退出该功能。之后会发生什么并不重要,因为return
在那时离开了函数。
答案 1 :(得分:1)
您应该重新构建每个IF:
if (problem.selectedIndex == 4 || cityid.value == "")
{
cityid.focus();
return false;
}
if (problem.selectedIndex == 5 || model.value == "")
//and so on
所以它返回任何一种方式而不会点击下一个if
语句