Как быстро заставить Javascript проверять информацию из текстовых полей формы HTML5?

Я пытаюсь создать функциональный сценарий проверки кредитной карты для демонстрационного задания. Я пытаюсь заставить JavaScript реагировать на ввод, когда фокус() меняется с текстового поля на текстовое поле. Как только у меня появится реактивный JavaScript, я хочу проверить эти данные по определенным параметрам.

Я пытался добавить методы onchange непосредственно в HTML5, но что-то не работает. Я открыт для всех предложений, я слишком долго стоял в тупике.

HTML

<h2>Payment
<img style = "visibility: hidden" class = "mastercard" 
src = "https://img.icons8.com/color/48/000000/mastercard.png">
<img style = "visibility: hidden" class = "visacard" 
src = "https://img.icons8.com/color/48/000000/visa.png">
<img style = "visibility: hidden" class = "discovercard" 
src = "https://img.icons8.com/color/48/000000/discover.png">
<img style = "visibility: hidden" class = "amexcard" 
src = "https://img.icons8.com/color/48/000000/amex.png">
</h2>
    <div class = "form-group">
      <label for = "name-on-card">Name on Card</label>
      <input class = "cc_name" type = "text" name = "card-name" class = "form-control" placeholder = "">
    </div>
    <div class = "form-group">
      <label for = "cc-number">Credit card number</label>
      <input type = "text" class = "form-control" id = "cc_number" name = "cc_number" placeholder = "" maxlength = "16">
    </div>
    <div class = "">
      <select class = "month_year_select" name = "month" id = "month">
        <option value = "">exp month</option>
      </select>
    </div>
    <div class = "">
      <select class = "month_year_select" id = "year" name = "year">
        <option value = "">exp year</option>
      </select>
    </div>
    <div class = "CVV">
      <label for = "cc-cvv">CVV</label>
      <input type = "text" class = "form-control" id = "cc-cvv" name = "cc-cvv" placeholder = "" maxlength = "4">
    </div>
      <button type = "submit" class = "myButton"style = "float:right;">Place Order</button>
  </form>  

JavaScript

<script type = "text/javascript">
  var creditError = "Error with Credit Card information";
  var CWError = "Error with CW";

document.getElementbyID("cc-cvv").onchange=function(){function CWcheck()};

document.getElementbyID("cc_number").onchange=function(){function creditCheck()};

document.getElementbyID("cc_name").onchange=function(){function upperFunction()};


function CWcheck()
  {
    if (document.forms["LeftCheck"]["cc-cvv"].value.length < 3 ||document.forms["LeftCheck"]["cc-cvv"].value.length>=5){
      alert(CWError);
      cdocument.forms["LeftCheck"]["cc-cvv"].value.value = " ";
    }
    else if (document.forms["LeftCheck"]["cc-cvv"].value.match(/^[A-Za-z]+$/)){
      alert(CWError);
      document.forms["LeftCheck"]["cc-cvv"].value = " ";
    }
    else if (document.forms["LeftCheck"]["cc-cvv"].value.match(/^[-+]?[0-9]+\.[0-9]+$/)) { 
      alert(CWError);
      document.forms["LeftCheck"]["cc-cvv"].value = " ";
    }
    else 
      break;
  }

function upperFunction() {
  document.getElementsByClassName("cc_name").value.toUpperCase();
  }


function creditCheck() {
  {
    if (document.forms["LeftCheck"]["cc_number"].value.length < 15 ||document.forms["LeftCheck"]["cc_number"].value.length>16){
      alert(creditError);
      document.forms["LeftCheck"]["cc_number"].value = " ";
    }
    else if (document.forms["LeftCheck"]["cc_number"].value.match(/^[A-Za-z]+$/)){
      alert(creditError);
      document.forms["LeftCheck"]["cc_number"].value = " ";
    }
    else if (document.forms["LeftCheck"]["cc_number"].value.match(/^[-+]?[0-9]+\.[0-9]+$/)) { 
      alert(creditError);
      document.forms["LeftCheck"]["cc_number"].value = " ";
    }
    else 
      if (document.forms["LeftCheck"]["cc_number"].value.match(/^(?:3[47][0-9]{13})$/)){
        document.getElementsByClassName('amexcard').style.visibility = "visable";
        document.forms["LeftCheck"]["cc_number"].value = " ";
        }
      else if (document.forms["LeftCheck"]["cc_number"].value.match(/^(?:4[0-9]{12}(?:[0-9]{3})?)$/)){
        document.getElementsByClassName('visacard').style.visibility = "visable";
        document.forms["LeftCheck"]["cc_number"].value = " ";
        }
      else if (document.forms["LeftCheck"]["cc_number"].value.match(/^(?:5[1-5][0-9]{14})$/)){
        document.getElementsByClassName('mastercard').style.visibility = "visable";
        document.forms["LeftCheck"]["cc_number"].value = " ";
        }
      else if (document.forms["LeftCheck"]["cc_number"].value;=.match(/^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/)){
        document.getElementsByClassName('discovercard').style.visibility = "visable";
        document.forms["LeftCheck"]["cc_number"].value = " "
        }        
      else {
        alert(creditError)
        this.clear()
        }
  }    

Я бы хотел, чтобы текстовое поле подтверждало это при вводе номера кредитной карты; он не будет проверять ничего, кроме чисел, которые были введены, каденция чисел соответствует типу карты или сбрасывает поле, а также отображает изображение карты рядом с заголовком «Платеж».

Проверка контрольной суммы Алекса работает очень хорошо, и с этой частью я могу упростить настройку изображения. До сих пор мой код был обновлен до следующего

Обновлен HTML

<form method = "POST" action = "/checkout" class = "LeftCheck" name = "LeftCheck" id = "LeftCheck">
<h2>Payment
<img style = "visibility: hidden" class = "mastercard" 
src = "https://img.icons8.com/color/48/000000/mastercard.png">
<img style = "visibility: hidden" class = "visacard" 
src = "https://img.icons8.com/color/48/000000/visa.png">
<img style = "visibility: hidden" class = "discovercard" 
src = "https://img.icons8.com/color/48/000000/discover.png">
<img style = "visibility: hidden" class = "amexcard" 
src = "https://img.icons8.com/color/48/000000/amex.png">
</h2>
    <div class = "form-group">
      <label for = "name-on-card">Name on Card</label>
      <input class = "cc_name" type = "text" name = "card-name" class = "form-control" placeholder = "">
    </div>
    <div class = "form-group">
      <label for = "cc-number">Credit card number</label>
      <input type = "text" class = "form-control" id = "cc_number" name = "cc_number" placeholder = "" maxlength = "16">
    </div>
    <div class = "">
      <select class = "month_year_select" name = "month" id = "month">
        <option value = "">exp month</option>
      </select>
    </div>
    <div class = "">
      <select class = "month_year_select" id = "year" name = "year">
        <option value = "">exp year</option>
      </select>
    </div>
    <div class = "CVV">
      <label for = "cc-cvv">CVV</label>
      <input type = "text" class = "form-control" id = "cc-cvv" name = "cc-cvv" placeholder = "" maxlength = "4">
    </div>
      <button type = "submit" class = "myButton"style = "float:right;">Place Order</button>
  </form>

И обновленная область проблем моего JavaScript

document.getElementById('cc_number').addEventListener('change',pictureCheck);
  function pictureCheck()
  {
    var ccNum = this.value;
    if (ccNum.length = 15)
    {
      document.getElementsById('amexcard').style.display='';
    }
    else if (ccNum.value.match(/^(?:4[0-9]{12}(?:[0-9]{3})?)$/))
    {
      document.getElementsById('visacard').style.display='';
    }
    else if (ccNum.value.match(/^(?:5[1-5][0-9]{14})$/))
    {
      document.getElementsById('mastercard').style.display='';
    }
    else (ccNum.value;=.match(/^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/)) 
    {
      document.getElementsById('discovercard').style.display='';
    }
  }

Вы неправильно запускаете событие onchange в ванильном javascript. document.getElementsByClassName("cc-cvv").addEventListener("‌​change", CWcheck);. Вы используете getElementById, но вы используете className.

tarzen chugh 07.04.2019 20:48
document.getElementById("cc-cvv").onchange = CWcheck; тоже можно но не то что в ОП.
Alex Kudryashev 07.04.2019 20:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
190
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете сделать это с помощью JQuery. Когда вы переключаетесь между полями ввода, вы можете запустить свой скрипт проверки.

$("#id1, #id2").focus(function() {
  alert("Focus changed.");
  //run validator
});

Я заметил, что вы используете document.forms["LeftCheck"]["cc-cvv"] для доступа к полям формы. Поскольку вы не включили начальный тег формы, я хочу убедиться, что в поле name вашей формы установлено значение LeftCheck, а не идентификатор, поскольку у меня уже была эта проблема раньше.

Вы также используете document.getElementbyID() для доступа к элементам, к которым вы применяете прослушиватель onchange. На самом деле это метод document.getElementbyId(), где последняя буква не заглавная. Это может быть причиной того, что ваши события не запускаются.

То, как вы прикрепляете свои события к элементу select, также неверно. Вы можете просто сделать это:

document.getElementbyID("cc-cvv").onchange = CWcheck;

или альтернативно

document.getElementbyID("cc-cvv").onchange = function() { CWcheck();};

И последнее, что вы используете регулярное выражение для проверки ввода поля кредитной карты. Однако вы делаете это, проверяя, соответствует ли ввод недопустимому шаблону, и выдает ошибку, если это так. Хотя это может сработать, было бы гораздо лучше проверить, соответствует ли ввод допустимому шаблону, и если нет, вызвать ошибку. Это делает ваш код проверки более надежным и гарантирует отсутствие недопустимых пограничных случаев, которые могут пройти проверку.

Используйте встроенное событие onblur

<input type = "text" onblur = "CWcheck()" />
Ответ принят как подходящий

Ваша часть javascript неверна. Позвольте мне показать, как работает должен.

document.getElementById('cc-cvv').addEventListener('change', CWcheck); //recommended way
document.getElementById('cc_number').onchange = creditCheck; //it is OK too

function CWcheck() { //function name should conventionally start with lower case but isn't big deal
  //"this" is the element which fired the event
  if (!/^\d{3,4}$/.test(this.value)) {
    this.value = '';
    this.focus();
    alert('CVV is 3 or 4 digits');
  }
}

function creditCheck() {
  // hide cc logos
  var ccImgs = document.querySelectorAll('h2 img');
  for (var i = 0, ccImg; ccImg = ccImgs[i]; ++i) {
    ccImg.style.visibility = 'hidden';
  }
  var ccNum = this.value.replace(/\D/g, ''); //remove all non-digits
  if (ccNum.length < 15 /*15 is amex*/ || ccNum.length > 16) {
    alert('CC number is 15 or 16 digits');
    this.focus();
    return false;
  }
  //implement Luhn algorithm
  var check = ccNum.split('') //get array
    .reverse()
    .map(function(el, index) {
      return el * (index % 2 + 1); //multiply even positions by 2
    })
    .join('') //combine array of strings
    .split('')
    .reduce(function(a, b) { //sum digits
      return a + (b - 0);
    }, 0);
  if (!check || (check % 10)) { //checksum should be none-zero and dividable by 10
    alert('Incorrect checksum of CC');
    this.focus();
    return false;
  }
  //test passed. show card logo
  if (/^5[1-5]/.test(ccNum))
    document.querySelector('h2 img.mastercard').style.visibility = 'visible';
  else if (/^4/.test(ccNum))
    document.querySelector('h2 img.visacard').style.visibility = 'visible';
  else if (ccNum.length == 15 && /^3[47]/.test(ccNum))
    document.querySelector('h2 img.amexcard').style.visibility = 'visible';
  else if (/^6011/.test(ccNum))
    document.querySelector('h2 img.discovercasd').style.visibility = 'visible';
  //and so on
  else {
    alert('CC number doesn\'t match known any CC issuer');
    this.focus();
    return false;
  }

  //test passed. format the string
  this.value = ccNum
    .replace(/^(\d{4})(\d{4})(\d{4})(\d+)$/, '$1 $2 $3 $4');
}
<h2>Payment
  <img style = "visibility: hidden" class = "mastercard" src = "https://img.icons8.com/color/48/000000/mastercard.png">
  <img style = "visibility: hidden" class = "visacard" src = "https://img.icons8.com/color/48/000000/visa.png">
  <img style = "visibility: hidden" class = "discovercard" src = "https://img.icons8.com/color/48/000000/discover.png">
  <img style = "visibility: hidden" class = "amexcard" src = "https://img.icons8.com/color/48/000000/amex.png">
</h2>
<div class = "form-group">
  <label for = "name-on-card">Name on Card</label>
  <input class = "cc_name" type = "text" name = "card-name" class = "form-control" placeholder = "">
</div>
<div class = "form-group">
  <label for = "cc-number">Credit card number</label>
  <input type = "text" class = "form-control" id = "cc_number" name = "cc_number" placeholder = "" maxlength = "20">
</div>
<!--<div class = "">
  <select class = "month_year_select" name = "month" id = "month">
    <option value = "">exp month</option>
  </select>
</div>
<div class = "">
  <select class = "month_year_select" id = "year" name = "year">
    <option value = "">exp year</option>
  </select>
</div>-->
<div class = "CVV">
  <label for = "cc-cvv">CVV</label>
  <input type = "text" class = "form-control" id = "cc-cvv" name = "cc-cvv" placeholder = "" maxlength = "4">
</div>

Обновлено: Добавлен эмитент СС с номера карты.

Алекс, я, безусловно, ценю усилия и код здесь. Пока я со временем включу контрольную сумму в эту систему. Я пытаюсь сначала начать с проверки IIN на основе четырех основных компаний-эмитентов кредитных карт, это проверит первое целое число и заставит одно из изображений изменить свой стиль, чтобы оно стало видимым.

mickyharvey2 08.04.2019 00:35

Это немного сложно, но возможно. Посмотрите на en.wikipedia.org/wiki/Номер_платежной_карты

Alex Kudryashev 08.04.2019 03:02

Другие вопросы по теме