Перше число вводиться всередину, коли введіть останній номер у текстове поле


14

Коли я набираю останнє число , перше число переходить всередину text-box(воно зникає), додаючи ще один пробіл.

введіть тут опис зображення

введіть тут опис зображення

Після того, як я натискаю зовні, text-boxце виглядає добре, що мені потрібно під час введення останнього символу. введіть тут опис зображення

  #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" >

Допоможіть мені вийти з цієї проблеми. Дякую


Вибачте, але я не розумію проблеми?
evolutionxbox

1
Схоже, вам потрібно зробити трохи ширшим обробляти кароту для останнього персонажа.
Freedomn-m

@evolutionxbox зайняв у мене хвилину-дві ... фрагмент добре демонструє проблему - це поле для введення з великим пробілом у літери. Клацніть в кінці введення та введіть - він зупиняється на 6, але 1(перший символ) губиться зліва від введення (прокручується з прихованим переливом).
Freedomn-m

Те ж питання, але немає відповіді , який працює в поточній Chrome (по крайней мере): stackoverflow.com/questions/8961045 / ...
freedomn-м

Я б запропонував використовувати 6 окремих inputелементів керування та переміщення карети між ними, як символ набирається / видаляється. Інакше у вас завжди будуть проблеми з вирівнюванням між браузерами / розмірами шрифтів / масштабами тощо
Rory McCrossan

Відповіді:


6

Додайте простір для іншого номера та обріжте введення, використовуючи 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">


Перший працює добре, у другому видно покажчик.
Jignesh Panchal

@JigneshPanchal Я знаю, я дав дві різні ідеї. Можливо, хтось хоче, щоб курсор був видно
Temani Afif

І в першому рішенні ~ clip-path ~ працюватиме не у всіх браузерах.
Jignesh Panchal

@JigneshPanchal, якщо ви не використовуєте мертвий браузер, кліп-шлях підтримується всіма сучасними браузерами ( caniuse.com/#feat=css-clip-path )
Temani Afif

3

Використовуйте цей код. це гарно працює

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>


Дякуємо за таке гарне рішення, але створити проблему при використанні зворотного простору для видалення номера після введення цифр. Ця проблема не відбудеться в одному введеному тексті.
Jignesh Panchal

додайте цей код до іншої частини, якщо в else if (myLength <= maxLength) { prev=target.previousElementSibling; while (prev = prev) { if (prev == null) break; if (prev.tagName.toLowerCase() == "input") { prev.focus(); break; } } }
Sreeraj_ms

@jigneshpanchalmj, якщо ваша проблема вирішена, тому моя відповідь буде правильною.
Рамез Бухарі

1
Хоча він вирішує проблему із заповненням, це рішення потребує значно більшої роботи, щоб зробити його корисним. наприклад, клацніть на 3-му введенні та введіть - іде 3-й (можливо, те, що ви хочете) - потім натисніть на 2-му та введіть інше число двічі - перейде на 2-й, але 3-й вхід ігнорується. Отже, лівий курсор назад - курсор ігнорується (або конкретніше повертається). Можливо, це нормально, просто не дуже добре, як є.
Freedomn-m

parseInt(target.attributes["maxlength"].value, 6);"6" не є за замовчуванням, це база для перетворення int
Freedomn-m

2

Спробуйте додати цей скрипт внизу поля введення:

<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-го символу. Я також додав поле "blur" (), щоб стрибок курсору на початок не стирчав.

Час очікування також потрібен. Без нього введений символ буде вставлений на початку. Детальніше про таймаут: чи є setTimeout хорошим рішенням робити функції асинхронізації за допомогою JavaScript?


Можливо, ви могли б позбутися від setTimeout, якщо використовуєте подію onkeyup.
Йонас Еберле

клавіш спричинить мерехтіння, коли він натисне на клавішу "вгору"
Юра Гербер

1

Ви можете вирішити це, додавши події 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/>


При введенні останнього числа він переміщує всі цифри протягом кількох разів.
Jignesh Panchal

0

Будь ласка, змініть на css нижче (це буде працювати)

padding-left: 14px;

до

padding-left: 5px;

Але це робить проблему в дизайні нижче межі кількості. і номер не виглядати центром кордону.
Jignesh Panchal

0

Тому мені подобається відповідь Темані Афіфа щодо використання відсічної маски. Подумайте, що це чудово. Я хотів запропонувати ще одне рішення (трохи менш елегантне). Я також використовував Firefox для тестування цієї проблеми, і натискання за межі області тексту (втрачає фокус) не призводить до повторного відображення першої цифри або після повернення рядка до нормального тексту.

Я вважаю, що проблема полягає у встановленому вами атрибуті 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" >

або навіть як визначена функція, що викликається вводом числа_тексту так:

<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-клас номер_тексту без особливих зусиль, наприклад, переписати весь тег стилів у розділі стилю документа).
  2. Вийміть із вхідного тексту номер_тексту класу.
    • 1 і 2 взаємозамінні, вам потрібно Firefox відновлювати лише встановлений вами стиль вбудованої форми, не зберігаючи атрибути класу "в пам'яті".
  3. Видаліть вбудований стиль і повторно застосуйте CSS клас номер_тексту. Це змусить браузер перерахувати розділення листів у міру необхідності.

У коді це виглядатиме як така функція JavaScript:

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
        }
    }

У Firefox це буде те саме мерехтіння, як у Chrome, і все буде добре.

Примітка . Функції тайм-аута - дати браузеру час на оновлення та фактичне оновлення того, що нам потрібно.

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

Сподіваємось, це допоможе вашому концептуальному розумінню, а також вирішенню проблеми. Деякі інші люди дали хороші рішення, які уникають усієї мерехтіння, і працюють як у Firefox та Chrome!


0

Це схоже на загальну проблему інтерфейсу, з якою я стикався раніше.

Надіваюсь, це також не вдається лише на деяких платформах (це характер цієї конкретної помилки.)

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

На деяких платформах, але не на всіх, цей персонаж не є проміжком, а накладається на наступному, а не останньому символі. Отже, якщо немає наступного символу, буде заповнено пробіл до введення даних.

В обох цих випадках дисплей буде діяти таким чином.

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

Рішення полягає в тому, щоб в кінці входу дати трохи вільного місця для відображення цього.

Збільшити " ширину " до 230 або 240, і ви повинні бути хорошими.

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


0

$(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">

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.