2011-03-06 64 views
2

我正在運行一些功能來驗證用戶在表單中輸入的文本是否至少包含一個數字和字母。它似乎沒有工作。由於這兩個功能幾乎相同,我只是張貼之一:'檢查信件'驗證不工作

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

日誌(「信=」 +字母)一直沒有出現在我的控制檯。我可能錯過了一些愚蠢的東西,但它似乎並沒有完成這個功能。

供參考,在這裏是我如何調用該函數:

if(pwd.value.length > 9){ 

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

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

是的,我知道,這是非常混亂,但我仍然在學習。我確信有更多先進/更清潔的方法來進行這種驗證,但爲了我的學習目的,我現在這樣做。

+1

OMG,這是怎麼回事? 1)使用'substr'獲取單個字符2)isNa * N * 3)if(true)返回true否則返回false是不必要的4)return語句之後的日誌。這可以做很多很多... – Harmen 2011-03-06 17:34:07

+0

@哈爾門>我敢肯定它可以,但因爲我仍然在我的大學課程的第一個Javascript類,'substr'是教授給我們的工作用。另外,我認爲我已經拿出了「回報虛假」的陳述。 :P – GnomeSlice 2011-03-06 17:36:31

+0

@GnomeSlice:textField.charAt(i)在該位置返回一個字母; 'return hasLetter'應該會更好,沒有條件語句;)... – Maxym 2011-03-06 17:38:40

回答

4

最簡單的方法來檢查,如果字符串中有一個字母的正則表達式:

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檢查Wh是以太第一個參數是一個數字或不是。首先,並非所有不是數字的字符都是字母。其次,你傳入的參數是一個字符串(str[i]返回一個字符串類型的字符,即使它是一個數字)

+0

一旦循環完成,這不會最終返回false嗎? – GnomeSlice 2011-03-06 17:56:55

+0

@Harmen:str [i]在IE中不起作用,'str.charAt(i)'是標準和交叉瀏覽器的方式。例如。 FF和Chrome中的'asd'[1]將返回's',但IE將返回'undefined'。小心...... – Maxym 2011-03-06 17:57:24

+1

@GnomeSlice:如果循環完成,那麼沒有字母;所以是的,它會返回false。否則它將返回true,並在循環內部保留該函數 – Maxym 2011-03-06 17:59:01

4

這是「isNaN」,而不是「isNan」 ......還有,如果它不一個數量,這並不一定意味着它不是一個字母;事實上,邏輯看起來倒退了,或者顛倒了。

如果「isNaN」返回true,那麼它不是一個數字。這是一封信嗎?那麼,你必須檢查。如果「isNaN」返回false,那麼所有你知道的是它是字符'0'到'9'之一。

用正則表達式完成整個事情要好得多,但如果這是作業,則可能是該方法無法使用。您可以檢查,看是否有性格的東西,如一個字母:

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

我的小組現在還沒有學到任何東西。我認爲這個邏輯看起來有點不可思議,但這是我現在需要處理的。你錯了,但修復它沒有任何區別。 – GnomeSlice 2011-03-06 18:44:20

0

我會利用正則表達式,這裏有幾個快速函數。

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; 
    } 
+1

你爲什麼使用條件?爲什麼不寫簡單的'return text.match(regex);'代替?? – Maxym 2011-03-06 17:47:49

+0

我第一次嘗試並且因爲任何原因返回了第一個匹配的字符。 – 2011-03-06 18:03:43

+0

我不知道它是否是瀏覽器特定的,但是當字符串不匹配正則表達式,然後FF返回'null',所以是的,返回布爾值更好地寫'return(text.match(regex)!= null); 「 – Maxym 2011-03-06 18:24:00