максимальна довжина ігнорується для типу вводу = "число" в 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.