Създаване на jQuery глобални променливи за валидиране на входна форма

Имам това, което вярвам, че е прост въпрос, но съм заседнал:

Опитвам се да потвърдя номер на кредитна карта в поле за въвеждане.

Имам оператор за превключване, който избира типа кредитна карта и изпълнява функция за валидиране в зависимост от откритата карта.

Проблемът е, че се боря да вмъкна променлива във функцията за проверка на картата, която представлява номера на картата в реално време (когато документът се зареди, полето е празно).

Ето HTML:

<form name="cardDetailsFrom">
<label>Enter Card Number</label>
<input type="text" id="cardNumber" name="cardNumber" />
</form>

Ето моя jQuery:

$("#cardNumber").keyup(function(){
var cardNumber = $(this).val();
});


function validateAmericanExpress(){
   if(cardNumber==//Rest of code doesn't work because can't pick up the local variable
   };

Всяка помощ ще бъде много оценена от начинаещ в jQuery. Все пак се опитвам да избягвам използването на стандартните добавки. Благодаря!


person cs_stackX    schedule 07.05.2013    source източник
comment
Никога не извиквате своята validateAmericanExpress() функция   -  person romo    schedule 07.05.2013


Отговори (2)


Това не е специфично за jQuery, а просто извикване на основна функция на Javascript.

$('#cardNumber').on('keyup',function(){
    validateAmericanExpress(this.value);
});

function validateAmericanExpress(cardNumber){
    if(cardNumber === // whatever, now the if logic will work
}

По принцип вие извиквате функцията със стойността на всеки клавиш и предавате стойността във функцията като cardNumber, за да се използва в тази функция.

Това е по-добре от използването на променлива с голям обхват, защото не изисква разпределяне на кеша от браузъра, повишавайки ефективността и скоростта. По-важното е, че помага да се избегнат възможни сблъсъци (множество елементи, задаващи глобалната променлива в конфликт) и прави кода много по-четлив и по-лесен за поддръжка.

Ефективно използване на възможни връщания

Можете дори да направите кода по-подходящо разположен като такъв:

$('#cardNumber').on('keyup',function(){
    if(validateAmericanExpress(this.value)){ // this checks if the call returned true
        // happy times
    } else {
        // show error message that says invalid
    }
});

function validateAmericanExpress(cardNumber){
    if(cardNumber === 'whatever'){
        return true;
    } else {
        return false;
    }
}

Или дори по-добре, използвайте троичен!

$('#cardNumber').on('keyup',function(){
    validateAmericanExpress(this.value) ? alert('correct') : alert('error');
});

function validateAmericanExpress(cardNumber){
    cardNumber === 'whatever' ? return true :  return false;
}

Състояние на супер ефективност! Ако искате да научите повече за троичните / условните оператори, вижте това справка.

Направете функцията по-разширяема

И накрая, вашият валидатор на номер на карта вероятно просто проверява дали това е конкретна числова последователност, нали? Вероятно можете да го направите без извикване на функция:

$('#cardNumber').on('keyup',function(){
    var regex = '/^3[47][0-9]{13}$/';
    regex.test(this.value) ? alert('correct') : alert('error');
});

Това е за тестване за AmEx. Ако тествате различни кредитни карти, можете да използвате функцията с параметър и да я направите луд общ!

$('#cardNumber').on('keyup',function(){
    validateCreditCard(this.value),'amex') ? alert('correct') : alert('error');
});

function validateCreditCard(cardNumber,type){
    var regex;

    switch(type){
        case 'amex':
            regex = '/^3[47][0-9]{13}$/';
            break;
        case 'visa':
            regex = '/^4[0-9]{12}(?:[0-9]{3})?$/';
            break;
        case 'mastercard':
            regex = '/^5[1-5][0-9]{14}$/';
            break;
        default:
            regex = '/d{16,17}$/'; // just checking it is all numeric and appropriate length 
    }

    return regex.test(cardNumber);
}

Това ще ви позволи да тествате всички кредитни карти едностранно, особено ако вместо да подадете низ като 'amex' използвате стойността на избор на радио бутон. Ако искате повече информация относно регулярните низове за всички карти, разгледайте тази справка.

person PlantTheIdea    schedule 07.05.2013
comment
ефективността и скоростта с използването на глобални вместо локални променливи е незначителна в повечето случаи, направете предварителна обработка на javascript в съвременните браузъри - всъщност понякога използването на глобални може да бъде по-ефективно - основната причина да не претрупвате обхват е избягването на сблъсъци на променливи които са трудни за забелязване и по други причини, свързани с доброто структурирано кодиране - person MarZab; 07.05.2013
comment
добавени допълнителни предимства на местно срещу глобално. и си прав, разликата тук е минимална, но не намалявай печалбите, колкото и незначителни да са те. стотинките се превръщат в долари и запазването на скоростта в ума помага за създаването на по-добри навици за кодиране, така че това е повече за всеобхватния принцип. - person PlantTheIdea; 07.05.2013
comment
Този отговор е страхотен. Ти направи деня ми много по-лесен. Благодаря ти! - person cs_stackX; 08.05.2013

използването на променлива вътре в обхват го ограничава до този обхват

използвайте отговора на PlantTheIdea или просто премахнете променливата и направете нов var cardNumer; отвън

person MarZab    schedule 07.05.2013
comment
да, работата е там, че не е нужно да декларирате променлива отвън за този вид простота. защо да изсмуквате допълнителен кеш, когато не е необходимо? - person PlantTheIdea; 07.05.2013
comment
разбира се, но мисля, че е по-ценно да го научите за обхватите, отколкото просто да му кажете предпочитания от вас начин, без да му давате мотивите зад него. Но да, използването на глобалния обхват трябва да се избягва - person MarZab; 07.05.2013
comment
добра точка. редактирах отговора си, за да обясня причината, поради която избягвах използването на променливата, и предоставих и някои техники за ефективност. - person PlantTheIdea; 07.05.2013