Как я могу ограничить возможные входные данные в элементе HTML5 «число»?

301

Для элемента <input type="number"> maxlength не работает. Как я могу ограничить maxlength для этого числового элемента?

  • 5
    Для тех, кто ищет лучшее решение, лучше всего это: stackoverflow.com/questions/9361193/…
  • 4
    Атрибут max не работает в браузере Chrome на планшете Android.
Показать ещё 1 комментарий
Теги:
input
numbers
max

24 ответа

287
Лучший ответ

И вы можете добавить атрибут max, который будет указывать максимально возможное число, которое вы можете вставить

<input type="number" max="999" />

если вы добавите значения max и min, вы можете указать диапазон допустимых значений:

<input type="number" min="1" max="999" />

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

Изображение 2673

  • 4
    Кристер, это сработало. Также, как сказал @Andy, я использовал oninput для нарезки дополнительных чисел. Ссылка mathiasbynens.be/notes/oninput
  • 5
    @Prasad - Если ответ Энди правильный, выберите его, а не получивший наибольшее количество голосов.
Показать ещё 10 комментариев
92

Вы можете указать атрибуты min и max, которые позволят вводить только в пределах определенного диапазона.

<!-- equivalent to maxlength=4 -->
<input type="number" min="-9999" max="9999">

Это работает только для кнопок управления прядильщиками. Хотя пользователь может ввести число, большее, чем разрешенное max, форма не будет отправлена.

Изображение 2674
Снимок экрана из Chrome 15

Вы можете использовать событие HTML5 oninput в JavaScript, чтобы ограничить количество символов:

myInput.oninput = function () {
    if (this.value.length > 4) {
        this.value = this.value.slice(0,4); 
    }
}
  • 10
    Одна возможная проблема с этим подходом JavaScript: он может работать не так, как ожидалось, если точка вставки не находится в конце значения. Например, если вы введете значение «1234» в поле ввода, затем переместите точку вставки обратно в начало значения и введите «5», вы получите значение «5123». Это отличается от поля ввода type = "text" с максимальной длиной 4, где браузер не позволит вам ввести 5-й символ в поле "full", и значение останется "1234".
  • 0
    @ Andy, очевидно, вопрос заключается в том, чтобы найти не-JS способ сделать maxlength .............
Показать ещё 1 комментарий
77

Если вы ищете решение Мобильный Интернет, в котором вы хотите, чтобы ваш пользователь увидел цифровую панель, а не текстовую клавиатуру. Используйте тип = "tel". Он будет работать с maxlength, что избавит вас от создания дополнительного javascript.

Max и Min по-прежнему позволяют пользователю вводить числа, превышающие max и min, что не является оптимальным.

  • 2
    Отличная находка, это сработало как шарм, не нужно создавать дополнительный JavaScript.
  • 8
    Я обнаружил, что это не лучшее решение для числового ввода, потому что «тел» ввод дополнительных символов, и он отображает буквы рядом с каждым числом. Чисто цифровая клавиатура выглядит намного чище.
Показать ещё 4 комментария
59

Вы можете объединить все это следующим образом:

<input name="myinput_drs"
oninput="maxLengthCheck(this)"
type = "number"
maxlength = "3"
min = "1"
max = "999" />

<script>
  // This is an old version, for a more recent version look at
  // https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
  function maxLengthCheck(object)
  {
    if (object.value.length > object.maxLength)
      object.value = object.value.slice(0, object.maxLength)
  }
</script>


Update:
Вы также можете запретить вводить любые нечисловые символы, потому что object.length будет пустой строкой для ввода номера, и поэтому ее длина будет 0. Таким образом, функция maxLengthCheck не работает.

Решение:
См. этот или этот для примера.

Демо - Посмотрите полную версию кода здесь:
http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/

Обновление 2: Здесь код обновления: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/

Обновление 3: Обратите внимание, что разрешение ввода более десятичной точки может испортиться с цифровым значением.

  • 0
    Это хорошее решение, но я считаю, что object.value.length возвращает 0, если введены какие-либо нечисловые значения.
  • 1
    @AndrewSpear Это потому, что object.value будет пустой строкой, если вы введете нечисловые значения во входах с установленным типом «число». Смотрите документацию. Также, пожалуйста, прочитайте мое обновление, чтобы исправить эту проблему.
Показать ещё 6 комментариев
19

Это очень просто, с некоторым javascript вы можете имитировать maxlength, проверьте его:

//maxlength="2"
<input type="number" onKeyDown="if(this.value.length==2) return false;" />
  • 11
    С вашим решением вы не можете использовать клавишу Backspace, когда наберете 2 символа. но я скучаю по функциональному решению
  • 7
    Вместо onKeyDown вы должны использовать onKeyPress.
Показать ещё 4 комментария
15

Или, если ваше максимальное значение составляет, например, 99 и минимум 0, вы можете добавить это в элемент ввода (ваше значение будет переписано вашим максимальным значением и т.д.).

<input type="number" min="0" max="99" 
   onKeyUp="if(this.value>99){this.value='99';}else if(this.value<0){this.value='0';}"
id="yourid">

Затем (если хотите), вы можете проверить, действительно ли введен номер

  • 0
    ... Отлично, но тебе больше не нужны мин и макс, чувак. (просто говорю)
  • 2
    @xoxel, если вы хотите, чтобы предупреждающее сообщение все еще отображалось
13

Вы можете указать его как текст, но добавить pettern, только соответствующие номера:

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

Он отлично работает, а также на мобильных устройствах (протестирован на iOS 8 и Android) выдает цифровую клавиатуру.

  • 0
    Атрибут pattern не поддерживается в IE9 и более ранних версиях, а также частично поддерживается в Safari: caniuse.com/#feat=input-pattern
  • 0
    Да, спасибо за указание, но мы отказались от поддержки IE9 (исключая из нее горчицу), и я предпочитаю ее методам JS. Зависит от проекта.
Показать ещё 1 комментарий
10

//For Angular I have attached following snippet.
<div ng-app="">
  <form>
    Enter number: <input type="number" ng-model="number" onKeyPress="if(this.value.length==7) return false;" min="0">
  </form>
  <h1>You entered: {{number}}</h1>
</div>

Если вы используете событие onkeypress, тогда вы не получите каких-либо ограничений пользователя как таковых при разработке (unit test it). И если у вас есть требование, которое не позволяет пользователю вводить после определенного предела, посмотрите на этот код и попробуйте один раз.

  • 1
    Проблемы, которые я вижу здесь: 1. заменить на выделение текста, и тип не работает, если ввод достиг 7 цифр 2. увеличить ввод на 1, когда срабатывает переполнение «границы» -> 9999999 и нажать вверх кнопка. Снимает ограничение
  • 0
    Я попробовал с простой версией JavaScript. Если вы хотите, вы можете увидеть, используя фрагмент кода Выполнить. Таким образом, я не нашел никаких ограничений.
Показать ещё 1 комментарий
6

Максимальная длина не будет работать с <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"
 />
  • 0
    хороший, но перестает работать, если вы вводите не числовое значение
6

Как указано другими, min/max не совпадает с maxlength, потому что люди все еще могут вводить float, который будет больше максимальной длины строки, которую вы намеревались. Чтобы действительно эмулировать атрибут maxlength, вы можете сделать что-то вроде этого в крайнем случае (это эквивалентно maxlength = "16" ):

<input type="number" oninput="if(value.length>16)value=value.slice(0,16)">
  • 0
    slice удалит символы без ведома конечного пользователя при вставке между ними. тогда как максимальная длина будет заблокирована.
  • 0
    @PradeepKumarPrabaharan maxlength не поддерживается maxlength входами. В моем примере значение value.slice(0,16) не сработает, если входное значение не превышает 16 символов.
Показать ещё 5 комментариев
6

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

Следующий код останавливается на 2, но позволяет продолжить редактирование;

//MaxLength 2
onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"
  • 2
    Нету. Попробуйте вставить значение.
5

Другой вариант - просто добавить слушателя для чего-либо с атрибутом maxlength и добавить к нему значение среза. Предполагая, что пользователь не хочет использовать функцию внутри каждого события, связанного с вводом. Вот фрагмент кода. Игнорируйте CSS и HTML-код, что важно для JavaScript.

// Reusable Function to Enforce MaxLength
function enforce_maxlength(event) {
  var t = event.target;
  if (t.hasAttribute('maxlength')) {
    t.value = t.value.slice(0, t.getAttribute('maxlength'));
  }
}

// Global Listener for anything with an maxlength attribute.
// I put the listener on the body, put it on whatever.
document.body.addEventListener('input', enforce_maxlength);
label { margin: 10px; font-size: 16px; display: block }
input { margin: 0 10px 10px; padding: 5px; font-size: 24px; width: 100px }
span { margin: 0 10px 10px; display: block; font-size: 12px; color: #666 }
<label for="test_input">Text Input</label>
<input id="test_input" type="text" maxlength="5"/>
<span>set to 5 maxlength</span>

<br>

<label for="test_input">Number Input</label>
<input id="test_input" type="number" min="0" max="99" maxlength="2"/>
<span>set to 2 maxlength, min 0 and max 99</span>
5

У меня была эта проблема раньше, и я решил ее использовать комбинацию типа номера html5 и jQuery.

<input maxlength="2" min="0" max="59" name="minutes" value="0" type="number"/>

script:

$("input[name='minutes']").on('keyup keypress blur change', function(e) {
    //return false if not 0-9
    if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
       return false;
    }else{
        //limit length but allow backspace so that you can still delete the numbers.
        if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
            return false;
        }
    }
});

Я не знаю, немного ли перепутывает события, но это решило мою проблему. JSfiddle

  • 0
    Вы можете легко вставить символы в.
3

Простой способ установить максимальную длину для числовых входов:

<input type="number" onkeypress="if(this.value.length>=4) { return false;}" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />
3

Вы можете попробовать это также для числового ввода с ограничением длины

<input type="tel" maxlength="3" />
  • 2
    это не будет работать на тип номера
  • 0
    @tiltdown извините за опечатку. Исправил ответ.
Показать ещё 1 комментарий
3

Как и в случае с type="number", вы указываете свойство max вместо свойства maxlength, которое является максимально возможным возможным числом. Таким образом, с 4 цифрами, max должно быть 9999, 5 цифр 99999 и т.д.

Также, если вы хотите убедиться, что это положительное число, вы можете установить min="0", указав положительные числа.

2

Ввод HTML

 <input class="minutesInput" type="number" min="10" max="120" value="" />

JQuery

 $(".minutesInput").on('keyup keypress blur change', function(e) {

    if($(this).val() > 120){
      $(this).val('120');
      return false;
    }

  });
1
<input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />

или если вы хотите иметь возможность ничего не вводить

<input type="number" onchange="this.value=this.value ? Math.max(Math.min(this.value,100),-100) : null" />
1

Тьфу. Это похоже на то, что кто-то сдался на полпути, реализовав это, и подумал, что никто не заметит.

По любой причине в ответах выше не используются атрибуты min и max. Этот jQuery заканчивает это:

    $('input[type="number"]').on('input change keyup paste', function () {
      if (this.min) this.value = Math.max(parseInt(this.min), parseInt(this.value));
      if (this.max) this.value = Math.min(parseInt(this.max), parseInt(this.value));
    });

Вероятно, он также будет работать как именованная функция "oninput" без jQuery, если вы используете один из этих типов "jQuery-is-the-devil".

  • 0
    он не правильно ответил на вопрос, но проголосовал, так как решил мою проблему :)
1

Как я узнал, вы не можете использовать какие-либо из событий onkeydown, onkeypress или onkeyup для полного решения, включая мобильные браузеры. Кстати, onkeypress устарел и больше не присутствует в chrome/opera для android (см.: События пользовательского интерфейса Рабочий проект W3C, 04 августа 2016 года).

Я выяснил решение, используя событие oninput. Возможно, вам потребуется выполнить дополнительную проверку номера по мере необходимости, такую ​​как отрицательный/положительный знак или десятичный и тысячный разделители и т.д., Но в качестве начала должно быть достаточно:

function checkMaxLength(event) {
	// Prepare to restore the previous value.
	if (this.oldValue === undefined) {
		this.oldValue = this.defaultValue;
	}

	if (this.value.length > this.maxLength) {
		// Set back to the previous value.
		this.value = oldVal;
	}
	else {
		// Store the previous value.
		this.oldValue = this.value;
		
		// Make additional checks for +/- or ./, etc.
		// Also consider to combine 'maxlength'
		// with 'min' and 'max' to prevent wrong submits.
	}
}

Я бы также рекомендовал объединить maxlength с min и max, чтобы предотвратить неправильные представления, как указано выше, несколько раз.

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();
  • 0
    @Phill_t может ты меня просветишь? Я использовал ваш код, и он работает хорошо в принципе, НО "$ (this) .attr (" maxlength ")" всегда доставляет 2. И почему было бы лучше использовать "$ (this) .attr (" maxlength ")" если бы он работал вместо просто «this.maxlength», которое я тестировал, и работал так, как ожидалось, короче и imho также понятнее? Я что-то пропустил?
  • 0
    Что вы имеете в виду "поставляет 2"?
Показать ещё 2 комментария
0

Просто напишите это...

<input type="text" onkeypress="return event.target.value.length < 13"  placeholder="Enter Identity card number" class="form-control">
0

Для тех, кто ищет глобальное ограничение, как я:

$(document).on('keypress','input[type="number"][maxlength]', function(){
    return this.value.length < +this.attributes.maxlength.value;
});

Это ловит каждое нажатие клавиши на документе и фильтрует его, если ввод является " maxlength " вводом и имеет атрибут maxlength. Затем позволяет нажатой клавише, когда длина не достигла максимальной длины. Он также работает с динамически добавленными входами, модальными данными и т.

0

Более подходящими атрибутами для использования будут min и max.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню