Первый номер идет внутрь, когда наберите последний номер в текстовом поле - PullRequest
14 голосов
/ 17 января 2020

Когда я набираю последнее число , первое число входит внутрь text-box (оно исчезает), оно добавляет один дополнительный пробел.

enter image description here

enter image description here

После того, как я щелкну снаружи text-box, он выглядит хорошо, который мне нужен во время ввода последнего символа. enter image description here

  #number_text {
        padding-left: 9px;
        letter-spacing: 31px;
        border: 0;
        background-image: linear-gradient(to right, #e1e1e1 70%, rgba(255, 255, 255, 0) 0%);
        background-position: left bottom;
        background-size: 38px 1px;
        background-repeat: repeat-x;
        width: 220px;
        box-sizing: border-box;
        outline:none;
    }
<input type="text" id="number_text" maxlength="6"  pattern="\d{6}" value="1234" >

Помогите мне выйти из этого вопроса. Спасибо

Ответы [ 8 ]

6 голосов
/ 30 января 2020

Добавить пробел для другого номера и обрезать ввод, используя clip-path

#number_text {
  padding-left: 9px;
  letter-spacing: 31px;
  border: 0;
  background: 
    repeating-linear-gradient(to right, #e1e1e1 0 26px, transparent 26px 38px)
    bottom/100% 1px no-repeat;
  width: 260px;
  clip-path:polygon(0 0, calc(100% - 38px) 0, calc(100% - 38px) 100%, 0 100%);
  box-sizing: border-box;
  outline: none;
}
<input type="text" id="number_text" maxlength="6" pattern="\d{6}" value="1234">

Или без клипа путем уменьшения размера фона:

#number_text {
  padding-left: 9px;
  letter-spacing: 31px;
  border: 0;
  background: 
    repeating-linear-gradient(to right, #e1e1e1 0 26px, transparent 26px 38px)
    bottom left/calc(100% - 38px) 1px no-repeat;
  width: 260px;
  box-sizing: border-box;
  outline: none;
}
<input type="text" id="number_text" maxlength="6" pattern="\d{6}" value="1234">
3 голосов
/ 17 января 2020

Используйте этот код. это прекрасно работает

var container = document.getElementsByClassName("wrap")[0];
    container.onkeyup = function(e) {
        var target = e.srcElement;
        var maxLength = parseInt(target.attributes["maxlength"].value, 6);
        var myLength = target.value.length;
        if (myLength >= maxLength) {
            var next = target;
            while (next = next.nextElementSibling) {
                if (next == null)
                    break;
                if (next.tagName.toLowerCase() == "input") {
                    next.focus();
                    break;
                }
            }
        }
     else if (myLength <= maxLength)
      {
        prev=target.previousElementSibling;
         while (prev = prev) {
            if (prev == null)
                break;
            if (prev.tagName.toLowerCase() == "input") {
                prev.focus();
                break;
            }
        }
      }

    }
.wrap input {
            border-top: 0;
            border-left: 0;
            border-right: 0;
            border-bottom: 1px solid #000;
            width: 3%;
            display: inline-block;
            outline: 0;
            text-align: center;
        }
<div class="wrap">
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
        <input type="text" maxlength="1" />
    </div>
2 голосов
/ 29 января 2020

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

<script>
  var oInput = document.getElementById('number_text');
  oInput.onkeypress = function(ev) {
    setTimeout(function() {
        if( oInput.value.length > 5 ) {
            oInput.setSelectionRange(0,0);
            oInput.blur();
        }
    }, 0);
  }
</script>

Этот заставляет курсор ввода вводить курсор в начало ввода после ввода 6-го символа. Я также добавил размытие () в поле, чтобы переход курсора к началу не торчал.

Время ожидания также необходимо. Без этого введенный символ будет вставлен в начале. Подробнее о тайм-ауте: Является ли setTimeout хорошим решением для выполнения асинхронных c функций с javascript?

1 голос
/ 05 февраля 2020

Вы можете справиться с этим, добавив событие blur () в js onkeyup поля ввода:

myFunction=()=>{
if(document.getElementById("number_text").value.length===6)
document.getElementById("number_text").blur();
}
 #number_text {
        padding-left: 9px;
        letter-spacing: 31px;
        border: 0;
        background-image: linear-gradient(to right, #e1e1e1 70%, rgba(255, 255, 255, 0) 0%);
        background-position: left bottom;
        background-size: 38px 1px;
        background-repeat: repeat-x;
        width: 220px;
        box-sizing: border-box;
        outline:none;
        overflow-y:hidden;
        overflow-x:hidden;
    }
<input type="text" id="number_text" maxlength="6"  pattern="\d{6}" value="1234" onkeyup="myFunction()" >
<br/>
0 голосов
/ 05 февраля 2020

$(document).on('keyup','#numberinput',function(){
    		var aa = $(this).val();

    		var aa = aa.substring(1);

    		if(aa.length > 5)
    		{
    			$('#numberinput').val(aa);
    		}
    	});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" name="" id="numberinput">
0 голосов
/ 04 февраля 2020

Похоже, это распространенная проблема пользовательского интерфейса, с которой я сталкивался ранее.

Могу поспорить, что она не работает только на некоторых платформах (такова характерная ошибка).

Вкл. На некоторых, но не на всех платформах для обозначения каретки используется пробел.

На некоторых, но не на всех платформах, этот символ не является пробелом, а перекрывает следующий, а не последний символ. Следовательно, если следующего символа не будет, пробел будет заполнен до тех пор, пока ввод не будет выполнен.

В обоих этих случаях дисплей будет действовать таким образом.

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

Решение состоит в том, чтобы дать немного свободного места в конце записи для отображения этого.

Увеличьте " width " до 230 или 240, и все будет хорошо.

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

0 голосов
/ 03 февраля 2020

Так что мне нравится ответ Темани Афифа об использовании обтравочной маски. Думаю, это здорово. Я хотел предложить другое решение (немного менее элегантное). Я также использовал Firefox для проверки этой проблемы, и нажатие за пределами текстовой области (потеря фокуса) не приводит к повторному появлению 1-го ди git или возвращению строки go в нормальное состояние при вводе текста.

Я полагаю, что проблема заключается в заданном вами атрибуте интервала букв css: letter-spacing: 31px;, а также в том факте, что я считаю, что это применимо к "мигающей" каретке, которую имеет большинство браузеров. Используя Chrome, кажется, что он удаляется, когда теряет фокус, в то время как Firefox сохраняет это даже после потери фокуса.

Первым решением было использование ручного вызова функции blur () для потери ввода фокус. Это работает в Chrome (с использованием самоисполняющейся анонимной функции):

<input type="text" id="number_text" maxlength="6" onkeyup="(function()
    {
      var x = document.getElementById('number_text');
      let value = x.value
      if (value.length >= 6){
        x.blur()
        return false
      }
    })();"
 pattern="\d{6}" value="1234" >

или даже как Определенная функция, вызываемая вводом number_text, например:

<script>
 handleMaxInput = function(){
  var x = document.getElementById('number_text');
  let value = x.value
  if (value.length >= 6){
    x.blur()
    return false
  }
};
</script>

<input ... id='number_text' ... onkeyup="handleMaxInput()" ... >

Вы будете обратите внимание на небольшую задержку в Chrome, но вызов этого в Firefox не решит проблему.

По сути, мы можем вызвать такое же поведение в Firefox. Немного поиграв, я понял, что Chrome обновляет / пересчитывает интервал между буквами при размытии. Мой игровой сеанс показал, что вы можете заставить Firefox пересчитать это значение программно:

  1. Измените встроенный стиль атрибута межбуквенного интервала ввода на другое значение (так как мы не можем редактировать CSS класс number_text программно без особых усилий, таких как перезапись всего тега стиля в разделе стиля документа).
  2. Удалить класс number_text из входных данных.
    • 1 и 2 являются взаимозаменяемыми, вам нужно Firefox, чтобы использовать только заданный вами встроенный стиль без сохранения атрибутов класса «в памяти».
  3. Удалите встроенный стиль и повторно примените класс number_text CSS. Это заставит браузер пересчитать разделение букв так, как нам нужно.

В коде это будет выглядеть следующим образом: JavaScript function:

handleMaxInput = function(){
        var x = document.getElementById('number_text');
        let value = x.value
        if (value.length >= 6){ // if the input is 6 or more characters
              x.classList.remove('number_text') // remove the class
              x.style.letterSpacing = '0px' // reset the spacing
              setTimeout(function() { // set time to let browser refresh updates
                  x.classList.add('number_text') // Re-add class after browser refresh
                  setTimeout(function() { // Remove inline-style after more reculculations
                      x.style.removeProperty('letter-spacing') // Remove inline style to let class styles apply
                      x.blur // optional, will force input field to lose focus. Else comment out to avoid that.
              }, (1)); // waits 1 millisecond
          }, (1)); // waits 1 millisecond
        }
    }

It будет иметь такое же мерцание в Firefox, как и в Chrome, и все будет хорошо.

Примечание : функции тайм-аута дают браузеру время для обновления sh, и на самом деле обновить то, что нам нужно.

Примечание : Вы можете выбрать .blur () в функции, чтобы текстовое поле потеряло фокус, или опустить это, и они все еще будут в поле ввода без ошибок с цифрами.

Надеюсь, это поможет вашему концептуальному пониманию, а также решению проблемы. Некоторые другие люди дали хорошие решения, которые избегают всего мерцания, и работают как в Firefox, так и в Chrome!

0 голосов
/ 17 января 2020

Пожалуйста, измените на css ниже (это будет работать)

padding-left: 14px;

на

padding-left: 5px;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...