【问题标题】:'Check for Letter' Validation Not Working“检查信件”验证不起作用
【发布时间】:2011-03-06 17:31:03
【问题描述】:

我正在运行一些函数来验证表单中用户输入的文本是否至少包含一个数字和字母。它似乎不起作用。由于这两个功能几乎相同,我只发布其中一个:

function hasALetter(textField){
    //returns true or false based on whether or not the text field has at least one letter inside it    
    console.log("Checking for letters...");

    var hasLetter = false;

    for(var i=0, checkLength=textField.length; i<checkLength; i++){
        var letter = textField.substr(i,1);
        console.log("letter = " + letter);
        if(isNan(letter) == false){
            hasLetter = false;
        }
    }
    if(hasLetter == true){
        return true;
    }
}

日志(“letter =” + letter)永远不会出现在我的控制台中。我可能遗漏了一些愚蠢的东西,但它似乎并没有完成功能。

作为参考,这是我调用函数的方式:

if(pwd.value.length > 9){

            var pwdLetter = hasALetter(pwd);
            var pwdNumber = hasADigit(pwd);

            if(pwdLetter==true){
                if(pwdNumber==true){

是的,我知道这很混乱,但我仍在学习。我确信有更高级/更简洁的方法来进行此验证,但出于我学习的目的,我现在正在这样做。

【问题讨论】:

  • 天啊,这是怎么回事? 1) 使用substr 获取单个字符 2) isNaN 3) if(true) return true else return false 是不必要的 4) 在 return 语句后记录。这可以做得更好很多...
  • @Harmen > 我确信它可以,但由于我还在我大学课程的第一个 Javascript 课程中,'substr' 是教授让我们使用的。另外,我以为我已经删除了“返回虚假”声明。 :P
  • @GnomeSlice: textField.charAt(i) 在那个位置返回一个字母; 'return hasLetter' 应该更好,没有条件语句 ;) ...
  • @GnomeSlice:你是否只检查 textField 是否有至少一个字母?
  • 你用什么浏览器来调试这个?

标签: javascript validation forms


【解决方案1】:

检查字符串是否包含字母的最简单方法是正则表达式:

function hasLetter(str){
  // check for characters between a and z
  // i flag makes it case insensitive
  return /[a-z]/i.test(str);
}

如果您想遍历字符串并且还想使用isNaN 函数,可以这样做:

function hasLetter(str){

  // loop through every character
  for(var i=0; i<str.length; i++){

    // check if the i-th character is not a number
    if(isNaN(str[i])){

      // if so, return true
      return true;
    }
  }

  // if the loop has finished and no letters have been found, return false
  return false;
}

但我不推荐这种方法,因为isNaN 会检查第一个参数是否为数字。首先,并非所有不是数字的字符都是字母。其次,你传入的参数是字符串(str[i]返回字符串类型的字符,即使是数字)

【讨论】:

  • 一旦循环完成,这不会总是返回 false 吗?
  • @Harmen: str[i] 在 IE 中不起作用,str.charAt(i) 是标准的跨浏览器方式。例如。 FF 和 Chrome 中的 'asd'[1] 将返回 's',但 IE 将返回 'undefined'。小心……
  • @GnomeSlice:如果循环完成,则没有字母;所以是的,它会返回假。否则它将返回 true 并从内部循环中离开该函数
  • @Maxym 我很确定通过方括号的索引访问字符串的字符将在 IE 中工作。如您所说,文字字符串表示法+索引访问可能不起作用。
  • @GnomeSlice:Harmen 发布的函数采用字符串,查看您发送输入元素作为参数的代码。更改为 hasALetter(pwd.value) 它应该可以工作;与 hasADigit 相同
【解决方案2】:

是“isNaN”,不是“isNan”……另外,如果是不是数字,也不一定代表不是字母;事实上,逻辑似乎是倒退的,或者是颠倒的。

如果“isNaN”返回true,那么它不是一个数字。是一封信吗?嗯,你必须检查。如果“isNaN”返回false,那么您只知道它是字符“0”到“9”之一。

使用正则表达式可以更好地完成整个事情,但如果这是家庭作业,则可能无法使用该方法。您可以检查一个字符是否是一个字母,例如:

function isLetter(c) {
  c = c.toUpperCase();
  return c >= "A" && c <= "Z";
}

【讨论】:

  • 我的小组目前还没有学到任何东西。我认为逻辑似乎有点不稳定,但这是我现在必须处理的。你是对的错字,但修正它没有任何区别。
【解决方案3】:

我会使用正则表达式,这里有几个快速函数。

    function hasALetter(text)
    {
        var regex = new RegExp("[a-zA-Z]");
        if(text.match(regex))
            return true;
        else
            return false;
    }

    function hasANumber(text)
    {
        var regex = new RegExp("[0-9]");
        if(text.match(regex))
            return true;
        else
            return false;
    }

【讨论】:

  • 为什么要使用条件?为什么不写简单的'return text.match(regex);'而是??
  • 我先尝试过,无论出于何种原因,它返回了第一个匹配字符。
  • 我不知道它是否特定于浏览器,但是当字符串与正则表达式不匹配时,FF返回'null',所以是的,返回布尔值最好写'return(text.match(正则表达式) != null );'
  • 为了获得最佳解决方案,请查看 Harmen 的答案;)(只需使用正则表达式变量的测试函数)
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 2011-08-06
  • 2017-01-04
  • 2019-06-24
  • 1970-01-01
  • 2018-04-23
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多