我试图得到它,如果我输入一个以空格结尾的名称,文本字段将变为红色。大多数代码都工作,它只有一种方法似乎不起作用。
问题必须在最后一个索引部分的某处?
var NamePass = true;
function ValidateName() {
var BlankPass = true;
var GreaterThan6Pass = true;
var FirstBlankPass = true;
var BlankMiddleName = true;
if (document.getElementById('Name').value == "") {
BlankPass = false;
}
var Size = document.getElementById('Name').value.length;
console.log("Size = " + Size);
if (Size < 7) {
GreaterThan6Pass = false;
}
if (document.getElementById('Name').value.substring(0, 1) == " ") {
FirstBlankPass = false;
}
var LastIndex = document.getElementById('Name').value.lastIndexOf();
if (document.getElementById('Name').value.substring((LastIndex - 1), 1) == " ") {
FirstBlankPass = false;
}
string = document.getElementById('Name').value;
chars = string.split(' ');
if (chars.length > 1) {} else
BlankMiddleName = false;
if (BlankPass == false || GreaterThan6Pass == false || FirstBlankPass == false || BlankMiddleName == false) {
console.log("BlankPass = " + BlankPass);
console.log("GreaterThan6Pass = " + GreaterThan6Pass);
console.log("FirstBlankPass = " + FirstBlankPass);
console.log("BlankMiddleName = " + BlankMiddleName);
NamePass = false;
document.getElementById('Name').style.background = "red";
} else {
document.getElementById('Name').style.background = "white";
}
}
答案 0 :(得分:3)
lastIndexOf
获取字符的最后一个索引,而不是字符串中的最后一个索引。我认为您打算使用length
代替:
var lastIndex = document.getElementById('Name').value.length;
然而,另一个问题是substring
采用了开始和结束索引,而不是起始索引和子字符串长度。您可以改用substr
,但charAt
更容易:
if (document.getElementById('Name').value.charAt(lastIndex - 1) == " ") {
FirstBlankPass = false;
}
现在,对于一些通用的代码改进。不是从true
处的所有变量开始并有条件地将它们设置为false
,而只需将它们设置为条件:
var NamePass = true;
function ValidateName() {
var value = document.getElementById('Name').value;
var BlankPass = value == "";
var GreaterThan6Pass = value.length > 6;
var FirstBlankPass = value.charAt(0) == " ";
var LastBlankPass = value.charAt(value.length - 1) == " ";
var BlankMiddleName = value.split(" ").length <= 1;
if (BlankPass || GreaterThan6Pass || FirstBlankPass || LastBlankPass || BlankMiddleName) {
console.log("BlankPass = " + BlankPass);
console.log("GreaterThan6Pass = " + GreaterThan6Pass);
console.log("FirstBlankPass = " + FirstBlankPass);
console.log("BlankMiddleName = " + BlankMiddleName);
NamePass = false;
document.getElementById('Name').style.background = "red";
} else {
document.getElementById('Name').style.background = "white";
}
}
还有几点需要注意:
camelCase
变量名而不是PascalCase
变量名称可能是个好主意,后者通常是为构造函数保留的blah == false
应该写成!blah
if
后跟else
也可以替换为if (!someCondition)
true
或false
,而不是设置全局变量NamePass
倒数第二,你可以在一个正则表达式中总结这一点,但如果你打算根据实际上的错误向用户提供更具体的错误信息,那么我就不会这样做。
function validateName() {
return /^(?=.{6})(\S+(\s|$)){2,}$/.test(document.getElementById('name').value);
}
最后 - 请记住,并非所有人都有中间名,甚至是超过6个字符的名字,正如@poke指出的那样。