максимальна довжина ігнорується для типу вводу = "число" в Chrome


231

maxlengthАтрибут не працює з <input type="number">. Це відбувається лише в Chrome.

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>

Відповіді:


277

З документації MDN для<input>

Якщо значення типу атрибута text, email, search, password, tel, або url, цей атрибут визначає максимальну кількість символів (в точках коду Unicode) , які користувач може ввести; для інших типів управління ігнорується.

Так дизайн maxlengthігнорується <input type="number">.

В залежності від ваших потреб, ви можете використовувати minі maxатрибути , як Інонія запропонував в його / її відповідь (NB: це буде визначити тільки обмежений діапазон, а не фактичне довжину символу значення, хоча -9999 до +9999 буде охоплювати всі 0-4 цифри чисел), або ви можете використовувати звичайне введення тексту та застосувати перевірку на полі за допомогою нового patternатрибута:

<input type="text" pattern="\d*" maxlength="4">

13
Також зауважте, що type="number"це новий тип із специфікації HTML 5. Якщо браузер ви тестируете в не визнає type="number"це буде ставитися до неї , як , type="text"який робить поважати maxlengthатрибут. Це може пояснити поведінку, яку ви бачите.
— Андре Діон

8
@fooquency, ви тут неправі, оскільки фактично не можете обмежувати фізичну довжину "введення з клавіатури" type=numberвведення шляхом встановлення maxатрибута. Цей атрибут обмежує лише число, вибране спінером введення.
— Камілій

5
що \d*тут?
— Pardeep Jain

4
pattern = "\ d *" не працює в IE11 або Firefox 56. jsfiddle.net/yyvrz84v
— Reado

4
Використання regexта малюнок - неймовірно креативний. Але в мобільному не відрізняється Androidабо iOS, це textвхід, тому це може призвести до поганого UX.
— AmerllicA

215

Максимальна довжина не працюватиме <input type="number"найкращим чином, як я знаю, це використовувати oninputподію для обмеження максимальної довжини . Будь ласка, дивіться наведений нижче код.

<input name="somename"
    oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);"
    type = "number"
    maxlength = "6"
 />

Блискуча. ДЯКУЮ!
— taketheleap

Версія @Guedes працює для мене на всіх перевірених пристроях, встановивши тип "число". Однак я не повністю розумію другу частину виразу||0/1
— Барлібі

34
@Barleby. Просто oninput="this.value=this.value.slice(0,this.maxLength)"має працювати
— Вашингтон Гідес

1
@ WashingtonGuedes код з вище працював для мене на <input type="number"> stackoverflow.com/questions/18510845 / ...
— Девід Yeiser

1
Остерігайтеся, щоб при такому підході не відображалися провідні нулі!
— ХадідАлі

53

Багато хлопців опублікували onKeyDown()подію, яка взагалі не працює, тобто ви не можете видалити, як тільки досягнете ліміту. Тож замість onKeyDown()використання onKeyPress()він працює чудово.

Нижче працює код:

User will not be allowed to enter more than 4 digits
<br>
<input type="number" pattern="/^-?\d+\.?\d*$/" onKeyPress="if(this.value.length==4) return false;" />


3
це дуже корисно, коротше і набагато краще, ніж будь-які інші відповіді тут, зберігаючи numberтип введення html5
— Dexter Bengil

4
Я спробував, після введення текстового поля з 4 цифр, просто застигає, не залишаючи місця для оновлень, не працює ні клавіша видалення, ні клавіша зворотної області, нічого не працює, як редагувати будь-які цифри, будь ласка, згадайте.
— Аббас

1
Мені вдалося ввести фрагмент ури (1.2.3.4.5.5.6.76.7)
— Alaa

1
Це має бути прийнятою відповіддю. Дуже розумний спосіб зберегти числове поле. Просто не забудьте додати атрибут min / max, оскільки кнопки віджиму все ж можуть перевищувати 4 цифри, якщо вони використовуються
— NiallMitch14,

3
Не працює, коли ви набираєте 9999 і натискаєте кнопку вгору на вводі.
— Csaba Gergely

37

У мене є два способи зробити це

По-перше: використовуйте type="tel", воно буде працювати як type="number"у мобільному телефоні, і приймайте максимальну довжину:

<input type="tel" />

Друге: Використовуйте трохи JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />

2
ваша друга відповідь не дуже хороша: якщо ви досягли двох знаків, ви не можете видалити жодне число.
— vtni

Так, я також помітив, що введення числа не повертає value.length, все-таки я його відредагував, включаючи
— клавішний

2
також повинні бути включені клавіші масиву та кнопка видалення (вперед).
— vtni

Це приємне. і це тільки для мене працює. Підтверджено
— ahmed

1
Чудова відповідь, tnx. Однак у мене не виникає причин використовувати "tel" замість "number" в цьому випадку. Крім того, ви можете замінити умову "event.keyCode! = 8" на "event.keyCode> 47 && event.keyCode <58" у випадку із натуральними нумерами, щоб користувач не міг лише вводити цифри.
— Дуді

28

Ви можете використовувати атрибути min та max .

Наступний код робить те саме:

<input type="number" min="-999" max="9999"/>

2
Я б сказав, що тут має бути правильна відповідь. Chrome принаймні потім змінює розмір вікна на основі параметрів min / max.
— fooquency

70
Це не працює, якщо ви хочете додати обмеження довжини, хоча ви не зможете перевищити число, яке 9999користувач може ввести вручну в кількості, що перевищує цю довжину.
— Philll_t

10

Змініть тип введення тексту та використовуйте подію "oninput" для виклику функції:

<input type="text" oninput="numberOnly(this.id);" class="test_css" maxlength="4" id="flight_number" name="number"/>

Тепер використовуйте Jage Regex для фільтрування введення користувача та обмеження його лише на числа:

function numberOnly(id) {
    // Get element by id which passed as parameter within HTML element event
    var element = document.getElementById(id);
    // Use numbers only pattern, from 0 to 9
    var regex = /[^0-9]/gi;
    // This removes any other character but numbers as entered by user
    element.value = element.value.replace(regex, "");
}

Демонстраційний: https://codepen.io/aslami/pen/GdPvRY


1
найкраща відповідь "лише числа", яку я знайшов. Інші користувачі evt.keycode, здається, не вдається на моєму андроїді
— поглиблення

1
Один дуже незначний мод, змініть "this.id" на "this", numberOnly (id) на numberOnly (елемент), тоді вам не потрібен перший рядок numberOnly, і він працює без id
— tony

8

Я одного разу потрапив у ту саму проблему і знайшов це рішення з урахуванням моїх потреб. Можливо, комусь це допоможе.

<input type="number" placeholder="Enter 4 Digits" max="9999" min="0" 
onKeyDown="if(this.value.length==4 && event.keyCode>47 && event.keyCode < 58)return false;"
/>

Щасливе кодування :)


3

Ви можете спробувати це також для цифрового введення з обмеженням довжини

<input type="tel" maxlength="4" />

8
у деяких браузерах (зокрема мобільних) telвведення буде автоматично підтверджено як таке, а в деяких дивних випадках провідні 0s будуть змінені на 1s.
— Philll_t

3
<input type="number" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" onKeyDown="if(this.value.length==10 && event.keyCode!=8) return false;">

DEMO - JSFIDDLE


3

Ось моє рішення з jQuery ... Ви повинні додати максимальну довжину до вашого типу вводу = число

$('body').on('keypress', 'input[type=number][maxlength]', function(event){
    var key = event.keyCode || event.charCode;
    var charcodestring = String.fromCharCode(event.which);
    var txtVal = $(this).val();
    var maxlength = $(this).attr('maxlength');
    var regex = new RegExp('^[0-9]+$');
    // 8 = backspace 46 = Del 13 = Enter 39 = Left 37 = right Tab = 9
    if( key == 8 || key == 46 || key == 13 || key == 37 || key == 39 || key == 9 ){
        return true;
    }
    // maxlength allready reached
    if(txtVal.length==maxlength){
        event.preventDefault();
        return false;
    }
    // pressed key have to be a number
    if( !regex.test(charcodestring) ){
        event.preventDefault();
        return false;
    }
    return true;
});

І обробити копію та вставити:

$('body').on('paste', 'input[type=number][maxlength]', function(event) {
    //catch copy and paste
    var ref = $(this);
    var regex = new RegExp('^[0-9]+$');
    var maxlength = ref.attr('maxlength');
    var clipboardData = event.originalEvent.clipboardData.getData('text');
    var txtVal = ref.val();//current value
    var filteredString = '';
    var combined_input = txtVal + clipboardData;//dont forget old data

    for (var i = 0; i < combined_input.length; i++) {
        if( filteredString.length < maxlength ){
            if( regex.test(combined_input[i]) ){
                filteredString += combined_input[i];
            }
        }
    }
    setTimeout(function(){
        ref.val('').val(filteredString)
    },100);
});

Я сподіваюся, що це комусь допоможе.


У мене була така ж ідея (хоча я використовував подію "введення"), але я вважаю, що рішення, яке @WashingtonGuedes написав у коментарі до іншої відповіді, набагато простіше: this.value = this.value.slice(0, this.maxLength);чи вважаєте ви, що це має якесь питання? Я поки не знайшов жодного. Він охоплює також вставлений текст.
— nonzaprej

Мені подобається довгий шлях. Використання RegExp дуже гнучко.
— harley81

2

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

Як зазначалося в інших коментарях, type="number"вхідні дані не мають maxlengthатрибуту, а натомість мають a minіmax атрибут.

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

Ось таке рішення, яке я використовував у минулому: http://codepen.io/wuori/pen/LNyYBM


min та max настільки ж непотрібні, що не заважають користувачеві вводити нескінченну кількість чисел у полі введення.
— andreszs

Правда. Єдиний раз, коли ви бачите їх у дії, коли ви використовуєте клавіші зі стрілками або контролери вгору / вниз (у Chrome тощо). Ви можете використовувати ці атрибути, щоб приєднатись до наступної валідації, яка працювала для мене. Це дозволяє контролювати обмеження лише через розмітку (i18n тощо) проти JS.
— M Wuori

1

Я знаю, що вже є відповідь, але якщо ви хочете, щоб ваш вклад поводився точно так само, як maxlengthатрибут або максимально наближений, використовуйте наступний код:

(function($) {
 methods = {
    /*
     * addMax will take the applied element and add a javascript behavior
     * that will set the max length
     */
    addMax: function() {
        // set variables
        var
            maxlAttr = $(this).attr("maxlength"),
            maxAttR = $(this).attr("max"),
            x = 0,
            max = "";

        // If the element has maxlength apply the code.
        if (typeof maxlAttr !== typeof undefined && maxlAttr !== false) {

            // create a max equivelant
            if (typeof maxlAttr !== typeof undefined && maxlAttr !== false){
                while (x < maxlAttr) {
                    max += "9";
                    x++;
                }
              maxAttR = max;
            }

            // Permissible Keys that can be used while the input has reached maxlength
            var keys = [
                8, // backspace
                9, // tab
                13, // enter
                46, // delete
                37, 39, 38, 40 // arrow keys<^>v
            ]

            // Apply changes to element
            $(this)
                .attr("max", maxAttR) //add existing max or new max
                .keydown(function(event) {
                    // restrict key press on length reached unless key being used is in keys array or there is highlighted text
                    if ($(this).val().length == maxlAttr && $.inArray(event.which, keys) == -1 && methods.isTextSelected() == false) return false;
                });;
        }
    },
    /*
     * isTextSelected returns true if there is a selection on the page. 
     * This is so that if the user selects text and then presses a number
     * it will behave as normal by replacing the selection with the value
     * of the key pressed.
     */
    isTextSelected: function() {
       // set text variable
        text = "";
        if (window.getSelection) {
            text = window.getSelection().toString();
        } else if (document.selection && document.selection.type != "Control") {
            text = document.selection.createRange().text;
        }
        return (text.length > 0);
    }
};

$.maxlengthNumber = function(){
     // Get all number inputs that have maxlength
     methods.addMax.call($("input[type=number]"));
 }

})($)

// Apply it:
$.maxlengthNumber();

Мені подобається цей, Трохи підмінив його для власного використання, (я не хотів, щоб люди вводили "е" в хромі, що дозволено);
— Mathijs Segers

1

Chrome (технічно Blink) не реалізує максимальну довжину для <input type="number">.

Специфікація HTML5 говорить, що максимальна довжина застосовна лише для типів тексту, URL-адреси, електронної пошти, пошуку, tel та пароля.


не додає нічого корисного до того, про що не згадувалося раніше
— candJJ

1

Абсолютне рішення, яке я нещодавно нещодавно спробував:

<input class="class-name" placeholder="1234567" name="elementname"  type="text" maxlength="4" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

Оскільки це загальний JS, він працюватиме всюди. Я працюю над проектом, використовуючи Angular 5, і він працює як шарм. Можливо, ви можете витратити 10 хвилин на створення послуги за своїм кутовим кодом, щоб ви могли повторно використовувати його протягом свого проекту.
— Пан Бенедикт

0

Я зроблю це швидко і легко зрозуміти!

Замість maxlength for type='number'(maxlength мається на увазі для визначення максимальної кількості літер для рядка textтипу), використовуйте min=''таmax='' .

Ура


0

<input type="number"> це лише те, що ... введення числа (хоч і неперетворене з рядка для плавання через Javascript).

Моя здогадка, це не обмежує символи на введення ключових даних, maxLengthінакше ваш користувач міг би застрягнути у "ключі", якщо він забув десятковий на початку (Спробуйте ввести .індекс, 1коли <input type"text">attr "maxLength" вже досягнуто ). Однак він буде підтверджений при надсиланні форми, якщо ви встановите maxатрибут.

Якщо ви намагаєтесь обмежити / перевірити номер телефону, використовуйте type="tel"attr / value. Він підкоряється maxLengthattr і відображає лише клавіатуру мобільного номера (у сучасних браузерах), і ви можете обмежувати введення шаблоном (тобто pattern="[0-9]{10}").


0

Для користувачів React,

Просто замініть 10 на макс

 <input type="number" onInput={(e) => e.target.value = e.target.value.slice(0, 10)}/>

-1

maxlenght - текст типу введення

<input type="email" name="email" maxlength="50">

використовуючи jQuery:

$("input").attr("maxlength", 50)

maxlenght - номер типу введення

JS

function limit(element, max) {    
    var max_chars = max;
    if(element.value.length > max_chars) {
        element.value = element.value.substr(0, max_chars);
    } 
}

HTML

<input type="number" name="telefono" onkeydown="limit(this, 20);" onkeyup="limit(this, 20);">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.