Замена конкретного символа в div в зависимости от ввода

#jquery

Вопрос:

У меня есть этот div с информацией о кредитной карте, разделенной на 4 группы:

 lt;div class="card-number"gt;   lt;div class="section" id="cc_display_number1"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number2"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number3"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number4"gt;****lt;/divgt; lt;/divgt;  

и этот ввод, который собирает номер кредитной карты пользователя:

 lt;input type="text" id="cc_number" name="cc_number" required=""/gt;  

Я сделал до сих пор это:

 $("#cc_number").on('keyup', function() {  var number = $(this).val();   var parts = [];   for (var i = 0; i lt; number.length; i  = 4) {  parts.push(number.substring(i, i   4));  }     if($(this).val() == "") {    } else {  if(parts[0].lenght == 4) {  $("#cc_display_number1").text(parts[0]);  }  if(parts[1].lenght == 4) {  $("#cc_display_number2").text(parts[1]);  }  if(parts[2].lenght == 4) {  $("#cc_display_number3").text(parts[2]);  }  if(parts[3].lenght == 4) {  $("#cc_display_number4").text(parts[3]);  }  } });  

но это работает не так, как ожидалось. Я хочу, чтобы каждая цифра, введенная в поле, заменяла конкретную * в card-number классе div. Есть какие-нибудь идеи?

 $("#cc_number").on('keyup', function() {  var number = $(this).val();   var parts = [];   for (var i = 0; i lt; number.length; i  = 4) {  parts.push(number.substring(i, i   4));  }   if($(this).val() == "") {    } else {  if(parts[0].lenght == 4) {  $("#cc_display_number1").text(parts[0]);  }  if(parts[1].lenght == 4) {  $("#cc_display_number2").text(parts[1]);  }  if(parts[2].lenght == 4) {  $("#cc_display_number3").text(parts[2]);  }  if(parts[3].lenght == 4) {  $("#cc_display_number4").text(parts[3]);  }  } }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;div class="card-number"gt;   lt;div class="section" id="cc_display_number1"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number2"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number3"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number4"gt;****lt;/divgt; lt;/divgt;  lt;input type="text" id="cc_number" name="cc_number" required=""/gt; 

Ответ №1:

Посмотрите на ошибки в вашей консоли — до тех пор, пока пользователь не введет достаточное количество символов, в вашем parts массиве не будет четырех элементов, поэтому проверка parts[1].length завершится неудачей, даже если вы исправите опечатку.

Вам также необходимо дополнить части, если пользователь еще не ввел полные четыре символа.

 $("#cc_number").on('keyup', function() {  var number = $(this).val();   var parts = [];  for (var i = 0; i lt; number.length; i  = 4) {  parts.push(number.substring(i, i   4).padEnd(4, "*"));  }    for (var i = 0; i lt; parts.length; i  ) {  $("#cc_display_number"   (i   1)).text(parts[i]);  }    for (var i = parts.length; i lt; 4; i  ) {  $("#cc_display_number"   (i   1)).text("****");  } }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;div class="card-number"gt;   lt;div class="section" id="cc_display_number1"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number2"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number3"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number4"gt;****lt;/divgt; lt;/divgt;  lt;input type="text" id="cc_number" name="cc_number" required=""/gt; 

Комментарии:

1. Абсолютно то, о чем я просил. Единственная проблема заключается в том, что вы быстро вводите и быстро удаляете номер карты, который скрипт прослушивает и не заменяет * . Есть идеи, как это исправить?

2. Я добавил дополнительный цикл для сброса элементов, выходящих за рамки того, что ввел пользователь. Кроме этого, я не могу печатать достаточно быстро, чтобы сломать его. 🙂

Ответ №2:

Вам нужно проверить, есть ли parts у массива такой индекс, как:

 $("#cc_number").on('keyup', function() {  var number = $(this).val();  var parts = [];   for (var i = 0; i lt; number.length; i  = 4) {  parts.push(number.substring(i, i   4));  }   if($(this).val() == "") {    } else {  if(parts[0] amp;amp; parts[0].length == 4) {  $("#cc_display_number1").text(parts[0]);  }  if(parts[1] amp;amp; parts[1].length == 4) {  $("#cc_display_number2").text(parts[1]);  }  if(parts[2] amp;amp; parts[2].length == 4) {  $("#cc_display_number3").text(parts[2]);  }  if(parts[3] amp;amp; parts[3].length == 4) {  $("#cc_display_number4").text(parts[3]);  }  } }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;div class="card-number"gt;   lt;div class="section" id="cc_display_number1"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number2"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number3"gt;****lt;/divgt;  lt;div class="section" id="cc_display_number4"gt;****lt;/divgt; lt;/divgt;  lt;input type="text" id="cc_number" name="cc_number" required=""/gt;