максимальная длина игнорируется для типа ввода = «число» в Chrome

231

maxlengthАтрибут не работает с <input type="number">. Это происходит только в Chrome.

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>
Пражила В.П.
источник

Ответы:

278

Из документации 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*здесь?
Пардип Джейн
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"
 />
Неха Джайн
источник
Brilliant. СПАСИБО!
taketheleap
Версия @Guedes у меня работает во всех протестированных устройствах, устанавливающих тип «число». Однако я не полностью понимаю вторую часть выражения||0/1
Барлби,
34
@Barleby. Просто oninput="this.value=this.value.slice(0,this.maxLength)"должен работать
Вашингтон Гуэдес
1
@ Код выше WashingtonGuedes работал для меня на <input type="number"> stackoverflow.com/questions/18510845/…
Дэвид Йайзер
1
Помните, что при этом подходе начальные нули не отображаются!
HadidAli
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
Декстер Бенгил
4
Я попытался, после ввода 4 цифр, текстовое поле просто зависает без места для каких-либо обновлений, ни клавиши удаления, ни клавиши возврата не работают, ничего не работает, как редактировать любые цифры, пожалуйста, укажите.
Аббас
1
Мне удалось войти в ваш фрагмент кода (1.2.3.4.5.5.6.76.7)
Alaa
1
Это должен быть принятый ответ. Очень умный способ сохранить числовое поле. Просто убедитесь, что добавили атрибут min / max, так как кнопки
прокрутки
3
Не работает, когда вы набираете 9999 и нажимаете кнопку вверх на входе.
Чаба Гергели
37

У меня есть два способа сделать это

Во-первых: используйте type="tel", он будет работать как type="number"в мобильном телефоне, и принимать maxlength:

<input type="tel" />

Второе: используйте немного JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />
Maycow Moura
источник
2
Ваш второй ответ не очень хорош: если вы набрали 2 символа, вы не можете удалить любое число.
Вторни
Да, я также заметил, что ввод числа не возвращает value.length, во всяком случае, я редактировал его, включая код
возврата
2
ключи массива и кнопка удаления (вперед) также должны быть включены.
Вторни
Это мило. и это работает только для меня
..
1
Отличный ответ, тнх. Тем не менее, у меня нет причины использовать «тел» вместо «номер» в этом случае. Кроме того, вы можете заменить свое условие «event.keyCode! = 8» на «event.keyCode> 47 && event.keyCode <58» в случае натуральных чисел, чтобы запретить пользователю ввод только цифр.
Дуди
28

Вы можете использовать атрибуты min и max .

Следующий код делает то же самое:

<input type="number" min="-999" max="9999"/>
Inon
источник
2
Я бы сказал, что это должен быть правильный ответ здесь. Chrome, по крайней мере, затем корректно изменяет размер окна на основе параметров min / max.
fooquency
71
Это не сработает, если вы хотите добавить ограничение длины, хотя вы не сможете превысить число, которое 9999пользователь может вручную ввести число, которое превышает эту длину.
Philll_t
10

Измените тип ввода на текстовый и используйте событие oninput для вызова функции:

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

Теперь используйте Javascript 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» на «это», numberOnly (идентификатор) для numberOnly (элемент), то вам не нужна первая линия numberOnly и она работает без идентификатора
фешенебельном
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;">

ДЕМО - JSFIDDLE

Сурья Р Правин
источник
3

Вот мое решение с JQuery ... Вы должны добавить maxlength к вашему типу ввода = число

$('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);
});

Надеюсь, это кому-нибудь поможет.

harley81
источник
У меня была та же идея (хотя я использовал событие «input»), но я думаю, что решение, которое @WashingtonGuedes написал в комментарии к другому ответу, намного проще: this.value = this.value.slice(0, this.maxLength);вы думаете, что это имеет какую-то проблему? Я не нашел пока что. Это также относится к вставленному тексту.
nonzaprej
Мне нравится долгий путь. Использование RegExp очень гибкое.
harley81
2

По моему опыту, большинство вопросов, где люди спрашивают, почему maxlengthигнорируется, заключается в том, что пользователю разрешено вводить больше, чем «разрешенное» количество символов.

Как отмечалось в других комментариях, type="number"входные данные не имеют maxlengthатрибута и вместо этого имеют атрибут minand max.

Чтобы поле ограничивало количество символов, которое может быть вставлено, в то же время позволяя пользователю знать об этом до отправки формы (в противном случае браузер должен определить значение> max), вам придется (на данный момент, по крайней мере) добавить слушатель на поле.

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

М Вуори
источник
min и max здесь бесполезны, они не мешают пользователю вводить бесконечное количество чисел в поле ввода.
andreszs
Правда. Единственный раз, когда вы видите их в действии, это когда вы используете клавиши со стрелками или контроллеры вверх / вниз (в Chrome и т. Д.). Вы все еще можете использовать эти атрибуты, чтобы связать их с вашей последующей проверкой, которая сработала для меня. Это позволяет вам контролировать пределы с помощью разметки (i18n и т. Д.) В сравнении только с JS.
М Вуори
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();
Philll_t
источник
Мне нравится этот, слегка подправил его для собственного использования (я не хотел, чтобы люди вводили "e" в chrome, что разрешено);
Mathijs Segers
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 для type='number'(maxlength предназначено для определения максимального количества букв для строки в textтипе), используйте min=''и max=''.

ура

Дат Бой Трамп
источник
0

<input type="number"> это просто ... ввод числа (хотя и не преобразованный из строки, которая передается через Javascript).

Полагаю, это не ограничивает символы при вводе с клавиатуры, maxLengthиначе ваш пользователь может застрять в «ловушке ключа», если он забыл десятичную дробь в начале (попробуйте поместить .в индекс, 1когда <input type"text">атрибут maxLength уже достигнут ). Однако он подтвердит отправку формы, если вы установите maxатрибут.

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

daleyjem
источник
0

Для пользователей React,

Просто замените 10 вашим максимальным требованием к длине

 <input type="number" onInput={(e) => e.target.value = e.target.value.slice(0, 10)}/>
picacode
источник
-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);">
Эрнальдо Гонсалес
источник