2013-02-17 56 views
-1

我是新JavaScript和,我想寫一個密碼強度功能。 但每次我輸入密碼時,它僅返回一個值(「非常強」)。 我完全糊塗! 這裏是我的代碼:密碼強度函數返回只有一個vlaue

function pwd_Validation() 
    { 
     var strength = new Array(); 
     strength[0] = "Blank"; 
     strength[1] = "Very Weak"; 
     strength[2] = "Weak"; 
     strength[3] = "Medium"; 
     strength[4] = "Strong"; 
     strength[5] = "Very Strong"; 


     var password = document.getElementById('pwd') 

     if (password.length < 1) 
      var score = 1; 


     else if (password.length < 4) 
      score = 2 


     else if (password.length >= 8 && password.value.match(/[a-z]/)) 
       score = 3; 


     else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/)) 
       score = 4; 


     else (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
       score = 5; 


     document.getElementById('spnPwd').innerHTML = strength[score]; 

     if (password.value = "") 
      document.getElementById('spnPwd').innerHTML = strength[0]; 
      document.getElementById('spnPwd').style.color="#FF0000" 

     if (strength[score] == 1) 
      document.getElementById('spnPwd').innerHTML = strength[1]; 
      document.getElementById('spnPwd').style.color="#FF0000" 

     if (strength[score] == 3) 
      document.getElementById('spnPwd').innerHTML = strength[3]; 
      document.getElementById('spnPwd').style.color="#FFCC00" 

     if (strength[score] == 4) 
      document.getElementById('spnPwd').innerHTML = strength[4]; 
      document.getElementById('spnPwd').style.color="#19D119" 

     if (strength[score] == 5) 
      document.getElementById('spnPwd').innerHTML = strength[5]; 
      document.getElementById('spnPwd').style.color="#006600" 

    } 

HTML代碼:

Password : <input type="password" id="pwd" onblur="pwd_Validation()" /> 
       <span id="spnPwd" class="pwd_Strength" ></span><br /> 
+1

'password.value = 「」'分配一個可變的,但是在一個'if'子句 – CodeZombie 2013-02-17 16:55:18

+1

還具有邏輯問題時使用。如果你的密碼長度是4,5,6或7,你的分數變量不會設置爲任何值。 – jfriend00 2013-02-17 16:58:32

回答

2

有幾個編碼錯誤和邏輯錯誤。我建議這個重寫,使得下面的修復/改進:

  1. 獲取實際的密碼值,並使用它的長度,而不是使用密碼DOM元素的長度。
  2. 手柄4和7(你的邏輯跳過的情況下)
  3. 序列以正確的順序的正則表達式的測試之間的長度的情況下,因此它實際上找到的正確得分
  4. 更正了標點符號正則表達式
  5. 修復別的邏輯問題
  6. 將顏色放入並行數組中。
  7. 以更高效/緊湊的方式聲明強度字符串。
  8. 給你的分數一個默認值,所以它保證有一個值。
  9. 不重複的正則表達式測試不止一次
  10. 使用regex.test因爲它比regex.match更有效時,所有你想知道的是,如果它匹配
  11. 從陣列中拉出所需的色彩值,而不是一個if語句每一個得分
  12. 只有一次
  13. 改變了數字正則表達式\d
  14. 使用大括號上獲取spnPwd DOM元素,如果所有安全
  15. /else語句

和建議的代碼:

function pwd_Validation() { 
    var strengths = ["Blank", "Very Weak", "Weak", "Medium", "Strong", "Very Strong"]; 
    var colors = ["#FF0000", "#FF0000", "#FFCC00", "#FFCC00", "#19D119", "#006600"]; 
    var score = 0; 
    var regLower = /[a-z]/, regUpper = /[A-Z]/, regNumber = /\d/, regPunctuation = /[.,[email protected]#$%^&*?_~\-£()]/; 

    var password = document.getElementById('pwd').value; 
    if (!password) { 
     score = 0; 
    } else if (password.length < 2) { 
     score = 1; 
    } else if (password.length < 4) { 
     score = 2; 
    } else if (password.length <= 7) { 
     score = 3; 
    } else { 
     // length is >= 8 in here 
     if (regLower.test(password) && regUpper.test(password) && regNumber.test(password)) { 
      // if it also has punctuation, then it gets a 5, otherwise just a 4 
      if (regPunctuation.test(password)) { 
       score = 5; 
      } else { 
       score = 4; 
      } 
     } else { 
      // if doesn't have upper, lower and numbers, then it gets a 3 
      score = 3; 
     } 
    } 
    var spanPwd = document.getElementById('spnPwd'); 
    spanPwd.innerHTML = strengths[score]; 
    spanPwd.style.color = colors[score]; 
} 
+0

哇,謝謝,它工作:) – 2013-02-17 17:29:33

2

有一個if從上次else所以它的解析這樣的丟失:

... 
else { 
    (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
} 

score = 5; 

這是一個很好的習慣,總是在控制結構中使用支架。

+0

這不是問題,請參閱我的回答 – Manishearth 2013-02-17 16:58:49

+0

@Manishearth不是* only *問題,你的意思是。即使通過應用您的答案,這個錯誤仍然需要修復。 (這實際上是爲什麼最終的結果是得分總是5。) – JJJ 2013-02-17 17:00:26

+0

哦oops。在我的答案中已修復,謝謝 – Manishearth 2013-02-17 17:02:45

0

你忘了密碼字段轉換到它的價值。

var password = document.getElementById('pwd') 

應該 VAR密碼=的document.getElementById( 'PWD')值

在原來的情況下,password.length是未定義,並且與它的所有比較評估爲假。 (所以最後else執行)

而且,你最後else

else (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
      score = 5; 

應該

else if(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
      score = 5; 

除此之外,請在IFS使用大括號。這是不好的做法有這樣的代碼:

if(...) 
... 
else if(...) 
... 
else 
... 

這是更好的:

if(...){ 
... 
}else if(...){ 
... 
}else{ 
... 
} 
0

我已經通過jsbeautifier.org推你的代碼。這已經根據JavaScript解釋器如何實際運行它重新縮進你的代碼。請注意你的if語句是如何運行你認爲他們的代碼是而不是

function pwd_Validation() { 
    var strength = new Array(); 
    strength[0] = "Blank"; 
    strength[1] = "Very Weak"; 
    strength[2] = "Weak"; 
    strength[3] = "Medium"; 
    strength[4] = "Strong"; 
    strength[5] = "Very Strong"; 

    var password = document.getElementById('pwd') 

    if (password.length < 1) var score = 1; 
    else if (password.length < 4) score = 2 
    else if (password.length >= 8 && password.value.match(/[a-z]/)) score = 3; 
    else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/)) score = 4; 
    else(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
    score = 5; 

    document.getElementById('spnPwd').innerHTML = strength[score]; 

    if (password.value = "") document.getElementById('spnPwd').innerHTML = strength[0]; 
    document.getElementById('spnPwd').style.color = "#FF0000" 

    if (strength[score] == 1) document.getElementById('spnPwd').innerHTML = strength[1]; 
    document.getElementById('spnPwd').style.color = "#FF0000" 

    if (strength[score] == 3) document.getElementById('spnPwd').innerHTML = strength[3]; 
    document.getElementById('spnPwd').style.color = "#FFCC00" 

    if (strength[score] == 4) document.getElementById('spnPwd').innerHTML = strength[4]; 
    document.getElementById('spnPwd').style.color = "#19D119" 

    if (strength[score] == 5) document.getElementById('spnPwd').innerHTML = strength[5]; 
    document.getElementById('spnPwd').style.color = "#006600"  
} 

採取一些具體的例子了:

if (strength[score] == 5) document.getElementById('spnPwd').innerHTML = strength[5]; 
document.getElementById('spnPwd').style.color = "#006600"  

可能你打算這是:

if (strength[score] == 5) { 
    document.getElementById('spnPwd').innerHTML = strength[5]; 
    document.getElementById('spnPwd').style.color = "#006600" 
} 

另外:

else(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) 
score = 5; 

你大概的意思是:

else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) { 
    score = 5; 
} 

您在代碼中提到的實際問題是第二個條件,因爲我已經退出了。該行score = 5不是任何有條件的一部分,並將始終運行(由於上述原因)。這就是爲什麼你總是看到密碼是「非常強大」的原因。

0

您保存到VAR 得分,然後你問強度[評分]if (strength[score] == 3)

那麼你在代碼的第二部分缺少一些{}!

在最後一部分,你可以使用

switch(score) { 
case 1: ... break; 

... 
default: ... break; 
}