1

我正在尝试获取它,以便如果我输入以空格结尾的名称,文本字段将变为红色。大多数代码都有效,它只有一种方法似乎不起作用。

问题一定在最后一个索引部分的某个地方?

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";
    }
}

http://jsfiddle.net/UTtxA/10/

4

1 回答 1

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)
  • 该函数看起来应该返回trueor false,而不是设置全局变量NamePass

倒数第二,你可以用一个正则表达式总结这一切,但如果你打算根据实际错误向用户提供更具体的错误消息,那么我不会这样做。

function validateName() {
    return /^(?=.{6})(\S+(\s|$)){2,}$/.test(document.getElementById('name').value);
}

最后——请记住,正如@poke 指出的那样,并不是每个人都有中间名,甚至不是超过 6 个字符的名字。

于 2013-05-01T23:38:49.753 回答