Мы знаем, что JavaScript не должен быть единственным методом валидации (проверки) данных, но проверка на стороне клиента превалирует над проверкой на стороне сервера именно в тех случаях, когда данные совершенно точно не того характера или формата.
А еще проверку на стороне клиента стоит рассматривать, как лучшее юзабилити сайта (если скрипт проверки написан правильно).
Да, разработчики часто жалуются, как трудно написать код проверки, но не в этот раз. Потому, как есть Dojo Toolkit, включающий в себя функционал dojox.validate.creditCard
, эффективно проверяющий данные номеров кредитных карт.
А еще лучше, на его основе вы сможете создать свои собственные скрипты различных проверок.
Dojo JavaScript
Код проверки компактен и хорошо комментирован:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
dojo.provide("dojox.validate.creditCard"); /*===== dojox.validate.creditCard = { // summary: // Module provides validation functions for Credit Cards, using account number // rules in conjunction with the Luhn algorigthm, with a plugable card info database. }; =====*/ dojo.require("dojox.validate._base"); dojox.validate._cardInfo = { // summary: A dictionary list of credit card abbreviations // // description: // // A hash of valid CC abbreviations and regular expressions // // mc: Mastercard // ec: Eurocard // vi: Visa // ax: American Express // dc: Diners Club // bl: Carte Blanch // di: Discover // jcb: JCB // er: Enroute // // example: // Define your own card, gift-card, whatever. Starts with 7, // is 15 total length. // | dojo.mixin(dojox.validate._cardInfo, { // | "my":"7[0-9]{14}" // | }); 'mc':'5[1-5][0-9]{14}', 'ec':'5[1-5][0-9]{14}', 'vi':'4(?:[0-9]{12}|[0-9]{15})', 'ax':'3[47][0-9]{13}', 'dc':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})', 'bl':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})', 'di':'6011[0-9]{12}', 'jcb':'(?:3[0-9]{15}|(2131|1800)[0-9]{11})', 'er':'2(?:014|149)[0-9]{11}' } dojox.validate.isValidCreditCard = function(value, ccType){ // summary: Validate a credit card number by type with Luhn checking. // // description: // Checks if a credit card type matches the # scheme in a passed value, and if // the Luhn checksum is accurate (unless its an Enroute card, in which case // the checkSum is skipped), returning a Boolean to check against. // // value: String|Int // A Value (credit card number) to validate // // ccType: String // A credit-card abbreviation. // // example: // | if(dojox.validate.isValidCreditCard("12345", "mc")){ // | console.log('inconceivable'); // | } return ((ccType.toLowerCase() == 'er' || dojox.validate.isValidLuhn(value)) && dojox.validate.isValidCreditCardNumber(value, ccType.toLowerCase())); // Boolean } dojox.validate.isValidCreditCardNumber = function(value, ccType){ // summary: // Checks if value matches the pattern for that card or any card types if none is specified // // value: String|Int // CC #, white spaces and dashes are ignored // // ccType: String? // One of the abbreviation values in `dojox.validate._cardInfo` -- // if Omitted, function returns a `|` delimited string of matching card types, // or false if no matches found. value = String(value).replace(/[- ]/g,''); //ignore dashes and whitespaces var cardinfo = dojox.validate._cardInfo, results = []; if(ccType){ var expr = '^' + cardinfo[ccType.toLowerCase()] + '$'; return expr ? !!value.match(expr) : false; // boolean } for(var p in cardinfo){ if(value.match('^' + cardinfo[p] + '$')){ results.push(p); } } return results.length ? results.join('|') : false; // String | boolean } dojox.validate.isValidCvv = function(/* String|Int */value, /* String */ccType) { // summary: // Validate the security code (CCV) for a passed credit-card type. // // description: // // value: if(!dojo.isString(value)){ value = String(value); } var format; switch (ccType.toLowerCase()){ case 'mc': case 'ec': case 'vi': case 'di': format = '###'; break; case 'ax': format = '####'; break; } return !!format && value.length && dojox.validate.isNumberFormat(value, { format: format }); // Boolean } |
Код выше достаточно понятен, так как в основном использует isValidCreditCard метод. Но если вам не нужен Dojo Toolkit? Вы можете написать свое приложение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Create an object var creditCardValidator = {}; // Pin the cards to them creditCardValidator.cards = { 'mc':'5[1-5][0-9]{14}', 'ec':'5[1-5][0-9]{14}', 'vi':'4(?:[0-9]{12}|[0-9]{15})', 'ax':'3[47][0-9]{13}', 'dc':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})', 'bl':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})', 'di':'6011[0-9]{12}', 'jcb':'(?:3[0-9]{15}|(2131|1800)[0-9]{11})', 'er':'2(?:014|149)[0-9]{11}' }; // Add the card validator to them creditCardValidator.validate = function(value,ccType) { value = String(value).replace(/[- ]/g,''); //ignore dashes and whitespaces var cardinfo = dojox.validate._cardInfo, results = []; if(ccType){ var expr = '^' + cardinfo[ccType.toLowerCase()] + '$'; return expr ? !!value.match(expr) : false; // boolean } for(var p in cardinfo){ if(value.match('^' + cardinfo[p] + '$')){ results.push(p); } } return results.length ? results.join('|') : false; // String | boolean }; |
Когда объект creditCardValidator
готов, вы можете начинать его использовать:
1 2 3 |
if(!creditCardValidator.validate(document.id("creditCardField"))) { alert("Invalid credit card!"); } |
Вот и все!
P.S.: Про Seo-продвижение сайтов сказано так много и все равно все знать по этой теме не дано никому, ведь поисковые системы постоянно меняют свои алгоритмы и то, что еще вчера было актуально, сегодня уже не принесет положительного результата. Но есть и неплохие Seo-студии, например, тут обещают продвинуть ваш сайт с гарантией.