2016-03-27 54 views
0

我正在開發一個Flash密碼驗證項目,其中用戶鍵入的密碼爲6到10個字符,並且必須包含一個大寫,一個小寫和一個數字。Actionscript 3密碼驗證程序不匹配密碼

當我測試程序並輸入密碼時,我得到「密碼不匹配,請重試。」在feedback_txt字段中。

我有兩個由Submit按鈕的事件處理函數調用的函數:Same()和PasswordApproved()。同一個函數驗證兩次輸入的密碼。 PasswordApproved函數驗證密碼是否符合指定的標準。

我給小費使用CharCodeAt來幫助PasswordApproved部分,但我似乎無法弄清楚如何做到這一點。

下面的代碼:

submit_btn.addEventListener(MouseEvent.CLICK,Submit); 
function Submit(e:MouseEvent):void { 
var pass1:String = password1_txt.text; 
var pass2:String = password2_txt.text; 
if (Same(pass1,pass2) == true) { 
if (PasswordApproved(pass1) == true) { 
     feedback_txt.text = "Your password was APPROVED." 
     feedback_txt.textColor = 0x00FF00; 
} else { 
     feedback_txt.text = "DID NOT MEET QUALIFICATIONS. Try again." 
     feedback_txt.textColor = 0xFF0000; 
} 
} else { 
    feedback_txt.text = "Passwords DID NOT MATCH. Try again." 
    feedback_txt.textColor = 0xFF0000; 
} 
password1_txt.text = ""; 
password2_txt.text = ""; 
stage.focus = password1_txt; 
} 

這是我的功能(我想這就是爲什麼它不工作,我不能正確寫它,或者它只是錯誤的原因是什麼?):

function Same(pass1,pass2:String):void { 
var pass1:String = password1_txt.text; 
var pass2:String = password2_txt.text; 
} 


function PasswordApproved(pass1:String):String { 
var pass1:String = "abchefghjkmnpqrstuvwxyzQWERTYUIOPLKJHGFDSAZXCVBNM"; 
var i:Number = 0; 
var pass:String = ""; 
var nLength:Number = pass1.length; 
var length:Number = 10 
while(i<=length) 
{ 
    var num:Number = Math.round(Math.random() * nLength); 
    pass += pass1.charCodeAt(num); 
    i++; 
} 
return pass; 
} 

回答

0

你可以做你試圖使用一個單一的if聲明和一個RegExp對象,例如做的,像這樣的內容:

var password_pattern:RegExp = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,10}$/; 
//        │  │   │   │  
//        │  │   │   └─> from 6 to 10 chars 
//        │  │   │ 
//        │  │   └─> at least one upper letter 
//        │  │ 
//        │  └─> at least one lower letter 
//        │ 
//        └──> at least one digit 

if(password1_txt.text == password2_txt.text && password_pattern.test(password1_txt.text)) { 
    trace('Your password was APPROVED.'); 
} else { 
    trace('Your password was NOT APPROVED.'); 
} 

更多關於使用正則表達式,看看here

編輯:

要正確使用您的Same功能,你給它一個類型,你的情況是Boolean,然後返回比較結果是這樣的:

function Same(pass1, pass2:String): Boolean 
{ 
    return pass1 == pass2; 
} 

編輯2:

您的PasswordApproved()函數只能驗證您的密碼,因爲您已驗證這兩個密碼是相同的。因此,它可以是這樣的:

function PasswordApproved(pass:String):Boolean 
{ 
    var password_pattern:RegExp = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,10}$/; 
    return password_pattern.test(pass); 
} 

,那麼你可以把它叫做:

if (Same(pass1, pass2)) {    // the same as : Same(pass1, pass2) == true 
    if (PasswordApproved(pass1)) {  // the same as : PasswordApproved(pass1) == true 
     feedback_txt.text = "Your password was APPROVED." 
     feedback_txt.textColor = 0x00FF00; 
    } else { 
     feedback_txt.text = "DID NOT MEET QUALIFICATIONS. Try again." 
     feedback_txt.textColor = 0xFF0000; 
    } 
} else { 
    feedback_txt.text = "Passwords DID NOT MATCH. Try again." 
    feedback_txt.textColor = 0xFF0000; 
} 

希望能有所幫助。

+0

我嘗試了你的建議,但我仍然收到「密碼不匹配,請重試。」我發佈了其餘的代碼,但我認爲Same函數是它不工作的原因。有沒有辦法讓我確保兩個密碼匹配? – Tams

+0

@Tams正如我已經提到的,你甚至不需要'Same'函數,因爲你使用'if'語句驗證你的文本字段是相同的,但是如果你喜歡總是使用它,我會編輯我的答案是爲你糾正它。 – akmozo

+0

謝謝你,akmozo。我測試過,現在一切正常。 – Tams

0

你在期待Same函數做什麼?

function Same(pass1,pass2:String):void { 
var pass1:String = password1_txt.text; 
var pass2:String = password2_txt.text; 
} 

該函數返回void,這意味着它不會做太多,當你再喜歡寫東西

if (Same(pass1,pass2) == true) { 

因爲這永遠不會是這樣。