2017-04-22 98 views
1

我目前正在爲學校做一些家庭作業,而且我有點兒被我的開關困住了!JavaScript信用卡驗證

我在checkcard();得到響應,直到alert(card) 我的問題是,沒有的情況下,將實際驗證卡的類型,它是在參考過,我不能使用像jQuery等等等等任何插件 我會發布相關的代碼,很高興聽到你們的聲音:D我已經用####來評論這些行,以方便。另外,getcard確實會按照希望返回正確的卡片類型。

function getCard(){ 
    var cardType = "unknown"; 
    var cardTypeArray = document.getElementById("chooseCard").getElementsByTagName("input"); 


    for(var i = 0; i < cardTypeArray.length; i++){ 
     if (cardTypeArray[i].checked) { 
      cardType = cardTypeArray[i].value; 
     } 
    } 
    alert ("cardtype is" + cardType); 
    return cardType; 

} 
function checkCard(cardNumber){ 
    var errMsg = ""; 
    var card = getCard(); 
    //var cardNumber = document.getElementById("cardNumber").value; 
    var regVisa = /^4[0-9]{12}(?:[0-9]{3})?$/; 
    var regMaster = /^5[1-5][0-9]{14}$/; 
    var regAmerica = /^3[47][0-9]{13}$/; 
    alert(card); // works till here ####### 

    switch(card){ 
     case "Visa": 
      if (parseInt(cardNumber.substring(0,1)!=4) { 
       errMsg = "card number is not visa \n"; 
      } 
      break; 
     case "Mastercard": 
      if (cardNumber.substring(0,1) !=5) { 
       errMsg = "card number is not mastercard. \n"; 
      } 
     break; 
     case "AmericanExpress": 
      if (cardNumber.substring(0,2) !=51) { 
       errMsg = "card number not american express, \n"; 
      } 
      break; 


    } 
    return errMsg; 


} 
function validator(){ 

    var errMsg = "";        /* stores the error message */ 
    var result = true; 
    var visaCard = document.getElementById("visa").checked; 
    var masterCard = document.getElementById("mastercard").checked; 
    var americanExpress = document.getElementById("americanExpress").checked; 
    var cardName = document.getElementById("cardName").value; 
    //document.getElementById("cardName").setAttribute('maxlength',40); 
    var regexAlpha = /^[a-zA-Z ]+$/; 
    var cardNumber = document.getElementById("cardNumber").value; 
    var regexNum = /^[0-9]+$/; 
    var date = new Date(); 
    var todayDateMonth = date.getMonth() + 1; 
    var todayDateYear = date.getFullYear(); 
    var expMonth = document.getElementById("expMonth").value; 
    var expYear = document.getElementById("expYear").value; 
    var regVisa = /^4[0-9]{12}(?:[0-9]{3})?$/; 
    var regMaster = /^5[1-5][0-9]{14}$/; 
    var regAmerica = /^3[47][0-9]{13}$/; 


    if (todayDateMonth > expMonth || todayDateYear > expYear){ 
     errMsg += "expiry date is wrong\n"; 
     result = false; 
    } 

    if (!(visaCard || masterCard || americanExpress)){ 
     errMsg += "please select visa, mastercard or american express\n"; 
     result = false; 
    } /* assumes no errors */ 


    if (cardNumber.length > 16 || cardNumber.length < 15) 
    { 
     errMsg = errMsg + "your card number can only contain 15 to 16 digits \n"; 
     result = false; 
    }else{ 
     checkCard(cardNumber); // Starts here ####### 

    } 






    if (cardName.length > 40 || cardName.length < 1 || !regexAlpha.test(cardName)) 
    { 
     errMsg = errMsg + "your card name must only contain alpha characters \n"; 
     result = false; 
    } 
    if (errMsg != "") { 
     alert(errMsg); 
    } 
    return result; //if false the information will not be sent to the server 
} 

function init() { 
    if(document.getElementById("regform")!==null){ 
    var regForm = document.getElementById("regform");// get ref to the HTML element 
    regForm.onsubmit = validate;  
    prefill_form(); 
} 
    if(document.getElementById("bookform") !=null){ 
    var bookForm = document.getElementById("bookform"); 
    bookForm.onsubmit = validator;   /* assigns functions to corresponding events */ 
    var cancel = document.getElementById("cancelButton"); 
    cancel.onclick = cancelBooking; 
    getBooking(); 

    } 

} 
+0

太多的代碼。請把這個問題歸結爲幾十行再現你的問題。 – 2017-04-22 05:48:05

+2

你可以爲我製作一個jsfiddle,並提供HTML。我會看看它。 – Bram

+0

您是否嘗試過使用[debugger](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger)?如果沒有,請做到這一點,看看你有多遠。然後,如果您仍然有問題,請將您的帖子更新爲**更具體的**問題。 –

回答

1

問題出在您看到的代碼結構。交換機內部有if條件而沒有任何相關聯的其他條件。如果對測試條件沒有太多瞭解,我有充分的理由相信你沒有正確處理案件和條件。查找代碼出錯的簡單方法是在您的代碼中添加debugger;聲明。開啓您的開發工具後,您可以在大多數瀏覽器中按F12或通過右鍵單擊選項來執行此操作。它應該暫停執行代碼。然後有兩個按鈕你會看到。 1.播放按鈕,將立即恢復代碼執行。 2.彎曲箭頭的種類,這是很重要的一個,你可以逐行執行代碼,看看哪些條件已通過,哪些代碼實際執行。想要發表評論,但太長,不適合。如果你有調試問題隨時在這裏發表評論。你可以只是谷歌開發人員工具萬一你無法打開特定的窗口。

+0

您的情況在案件看起來很腥。您可以通過逐行輸入完全相同的代碼來驗證開發工具的結果,看看它是否符合您的期望。如果它確實進入下一行。 –

+0

它是可疑的,因爲我想能夠使用正則表達式變量來檢查卡號而不是子字符串。我嘗試使用!regVisa.test(cardNumber)來代替,但得到一個錯誤,說.test不是一個函數。但它在驗證器功能中運行良好。我將嘗試調試器並再次查看代碼,並返回給此處的所有人。我非常感謝這一點,謝謝 –

+0

我很抱歉地說,但你的代碼根本不乾淨。你有兩個函數定義的正則表達式,甚至沒有使用它一次。這會導致你的程序中有很多不需要的代碼,並且很難調試。我會建議你通過每一行,並決定是否可以做得更好?如果它是必需的?如果它在正確的地方?如果它是一個邏輯,它是正確的嗎?最終你會養成編寫乾淨的代碼的習慣。並且很容易發現錯誤。 –

1

好吧所以問題是我沒有返回錯誤信息或錯誤的結果。生病重新張貼相同的代碼,但我添加了什麼使它爲那些感興趣的工作。感謝您的反饋!我將在船上採取幾點。無論如何代碼在下面,尋找###################。

function validator(){ 

var errMsg = "";         
var result = true; 


var visaCard = document.getElementById("visa").checked; 
var masterCard = document.getElementById("mastercard").checked; 
var americanExpress = document.getElementById("americanExpress").checked; 
var cardName = document.getElementById("cardName").value; 

var regexAlpha = /^[a-zA-Z ]+$/; 
var cardNumber = document.getElementById("cardNumber").value; 
var regexNum = /^[0-9]+$/; 
var date = new Date(); 
var todayDateMonth = date.getMonth() + 1; 
var todayDateYear = date.getFullYear(); 
var expDate = document.getElementById("expDate").value; 
var dateFormat = /^[\d]{2}\/[\d]{4}$/; 





if (!dateFormat.test(expDate)){ 
    errMsg += "please select a valid date range\n"; 
    result = false; 
}else if (todayDateYear > expDate.substring(3,7)){ 
    errMsg += "please select a valid expiry year\n"; 
    result = false; 
} else if (todayDateYear == expDate.substring(3,7) && todayDateMonth > expDate.substring(0,2)){ 
    errMsg += "please select a valid expiry month\n"; 
    result = false; 
} 




if (!(visaCard || masterCard || americanExpress)){ 
    errMsg += "please select visa, mastercard or american express\n"; 
    result = false; 
} 


if (cardNumber.length > 16 || cardNumber.length < 15) 
{ 
    errMsg = errMsg + "your card number can only contain 15 to 16 digits \n"; 
    result = false; 
}else{ 
    // code below is what i added ###################################### 
    var tempMsg = checkCard(cardNumber); 
    if (tempMsg != "") { 
     errMsg = errMsg + tempMsg; 
     result = false; 
    }; 

} 







if (cardName.length > 40 || cardName.length < 1 || !regexAlpha.test(cardName)) 
{ 
    errMsg = errMsg + "your card name must only contain alpha characters \n"; 
    result = false; 
} 
if (errMsg != "") { 
    alert(errMsg); 
} 
return result; //if false the information will not be sent to the server 

}

function checkCard(cardNumber){ 
var errMsg = ""; 
var card = getCard(); 
var cvv = document.getElementById("CVV").value; 
var regVisa = /^4[0-9]{12}(?:[0-9]{3})?$/; 
var regMaster = /^5[1-5][0-9]{14}$/; 
var regAmerica = /^3[47][0-9]{13}$/; 
var cvvCheck3 =/^[0-9]{3}$/; 
var cvvCheck4 =/^[0-9]{4}$/; 




//do with if else 
switch(card){ 
    case "Visa": 
     if (!regVisa.test(cardNumber) || !cvvCheck3.test(cvv)) { 
      errMsg = "card number is not visa or cvv is wrrong \n"; 
     } 
     break; 
    case "Mastercard": 
     if (!regMaster.test(cardNumber) || !cvvCheck3.test(cvv)) { 
      errMsg = "card number is not mastercard or cvv is wrong\n"; 
     } 
    break; 
    case "AmericanExpress": 
     if (!regAmerica.test(cardNumber) || !cvvCheck4.test(cvv)) { 
      errMsg = "card number not american express or cvv is wrong, \n"; 
     } 
     break; 
     default: 
     errMsg = "we cant process this card number \n"; 
} 
return errMsg; 

}