comprimento máximo ignorado para o tipo de entrada = "número" no Chrome


231

O maxlengthatributo não está funcionando <input type="number">. Isso acontece apenas no Chrome.

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

Respostas:


277

Da documentação da MDN para<input>

Se o valor do tipo de atributo é text, email, search, password, tel, ou url, este atributo especifica o número máximo de caracteres (em pontos de código Unicode) que o utilizador pode introduzir; para outros tipos de controle, ele é ignorado.

Então maxlengthé ignorado <input type="number">pelo design.

Dependendo de suas necessidades, você pode usar o mine maxatributos como Inon sugeriu em seu / sua resposta (NB: isto só irá definir um intervalo restrito, não o comprimento de caracteres real do valor, embora -9.999-9999 cobrirá toda 0-4 dígitos) ou você pode usar uma entrada de texto regular e aplicar a validação no campo com o novo patternatributo:

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

13
Observe também que type="number"é um novo tipo da especificação HTML 5. Se o navegador que você está testando em não reconhecer type="number"que irá tratá-lo como type="text"que não respeitam o maxlengthatributo. Isso pode explicar o comportamento que você está vendo.
André Dion

8
@ Frequência, você não está bem aqui, pois na verdade não pode restringir o comprimento físico da "entrada do teclado" na type=numberentrada definindo o maxatributo. Este atributo restringe apenas o número escolhido pelo botão giratório da entrada.
Kamilius

5
o que tem \d*aqui?
Pardeep Jain

4
pattern = "\ d *" não funciona no IE11 ou no Firefox 56. jsfiddle.net/yyvrz84v
Reado

4
O uso regexe o padrão são incrivelmente criativos. Mas no celular, não é diferente Androidou iOS, é uma textentrada, por isso causa um mau resultado UX.
precisa saber é o seguinte

215

O comprimento máximo não funcionará <input type="number"da melhor maneira que sei é usar oninputevent para limitar o comprimento máximo . Por favor, veja o código abaixo.

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

Brilhante. OBRIGADO!
precisa saber é o seguinte

A versão @Guedes funciona para mim em todos os dispositivos testados, definindo o tipo como "número". No entanto, eu não compreender totalmente a segunda parte da expressão||0/1
Barleby

34
@Barleby. Apenas oninput="this.value=this.value.slice(0,this.maxLength)"devem trabalhar
Washington Guedes

1
O código do @ WashingtonGuedes acima funcionou para mim no <input type="number"> stackoverflow.com/questions/18510845/…
David Yeiser #

1
Cuidado que zeros à esquerda não são exibidos com esta abordagem!
HadidAli

53

Muitos caras postaram onKeyDown()eventos que não estão funcionando , ou seja, você não pode excluir quando atingir o limite. Então, em vez de onKeyDown()usar onKeyPress()e funciona perfeitamente bem.

Abaixo está o código de trabalho:

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
isso é muito útil, um mais curto e muito melhor do que quaisquer outras respostas aqui, mantendo o html5 numbertipo de entrada
Dexter Bengil

4
Eu tentei, depois de digitar 4 dígitos, a caixa de texto, simplesmente fica congelada, sem espaço para atualizações, nem as teclas excluir nem backspace funcionam, nada funciona, como editar os dígitos, por favor mencione.
Abbas

1
Consegui entrar no seu snippet (1.2.3.4.5.5.6.76.7)
Alaa '15 de

1
Essa deve ser a resposta aceita. Maneira muito inteligente de manter o campo numérico. Só não se esqueça de adicionar um atributo min / max como os botões de rotação ainda pode ir acima dos 4 dígitos se forem usados
NiallMitch14

3
Não funciona quando você digita 9999 e pressiona o botão para cima na entrada.
Csaba Gergely

37

Eu tenho duas maneiras para você fazer isso

Primeiro: use type="tel", funcionará como type="number"em dispositivos móveis e aceite o comprimento máximo:

<input type="tel" />

Segundo: use um pouco de JavaScript:

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

2
sua segunda resposta não é muito boa: se você atingiu 2 caracteres, não pode excluir nenhum número.
vtni

Sim, eu também notei uma entrada Número não retorna value.length, de qualquer maneira, eu editei incluindo Backspace keycode
Maycow Moura

2
as teclas da matriz e o botão excluir (encaminhar) também devem ser incluídos.
vtni

Essa é legal. e isso só funciona para mim .. votado
saleem ahmed

1
Ótima resposta, tnx. No entanto, não entendo o motivo de usar 'tel' em vez de 'number' neste caso. Além disso, você pode substituir sua condição de "event.keyCode! = 8" por "event.keyCode> 47 && event.keyCode <58" em um caso de números naturais para desativar o usuário apenas de digitar dígitos.
Dudi

28

Você pode usar os atributos min e max .

O código a seguir faz o mesmo:

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

2
Eu diria que esta deve ser a resposta correta aqui. O Chrome, pelo menos, redimensiona a caixa com base nos parâmetros mínimo / máximo.
fooquency

70
Isso não funciona se você deseja adicionar restrições de comprimento, embora não possa exceder o número que 9999o usuário pode digitar manualmente em um número que exceda esse comprimento.
Philll_t

10

Altere seu tipo de entrada para texto e use o evento "oninput" para chamar a função:

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

Agora use Javascript Regex para filtrar a entrada do usuário e limitá-la apenas a números:

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, "");
}

Demo: https://codepen.io/aslami/pen/GdPvRY


1
melhor resposta "apenas números" que encontrei. Outros usando evt.keycode parecem falhar no meu android
deebs 01/10/1918

1
Uma modificação muito pequena, a mudança "this.id" para "este", numberOnly (id) para numberOnly (elemento), então você não precisa a primeira linha de numberOnly e funciona sem um id
tony

8

Certa vez, entrei no mesmo problema e encontrei esta solução com relação às minhas necessidades. Pode ajudar Alguém.

<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;"
/>

Happy Coding :)


3

Você pode tentar isso também para entrada numérica com restrição de comprimento

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

8
em alguns navegadores (especificamente para dispositivos móveis), a telentrada será validada automaticamente como tal e, em alguns casos estranhos, os primeiros 0s serão alterados para 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

Aqui está minha solução com jQuery ... Você precisa adicionar maxlength ao seu tipo de entrada = número

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

E manipule copiar e colar:

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

Espero que ajude alguém.


Tive a mesma ideia (apesar de usar o evento "input"), mas acho que a solução que o @WashingtonGuedes escreveu em um comentário para outra resposta é muito mais simples: this.value = this.value.slice(0, this.maxLength);você acha que isso tem algum problema? Eu não encontrei nenhum até agora. Também abrange texto colado.
Nonzaprej

Eu gosto do longo caminho. O uso do RegExp é muito flexível.
harley81

2

Na minha experiência, a maioria dos problemas em que as pessoas perguntam por que maxlengthé ignorado é porque o usuário pode inserir mais do que o número "permitido" de caracteres.

Como outros comentários afirmaram, type="number"entradas não têm um maxlengthatributo e, em vez disso, ter um mine maxatributo.

Para que o campo limite o número de caracteres que podem ser inseridos, permitindo que o usuário esteja ciente disso antes do envio do formulário (o navegador deve identificar o valor> max, caso contrário), você precisará (por enquanto, pelo menos) adicionar um ouvinte para o campo.

Aqui está uma solução que eu usei no passado: http://codepen.io/wuori/pen/LNyYBM


min e max são tão inúteis quanto inúteis aqui, eles não impedem o usuário de digitar uma quantidade infinita de números no campo de entrada.
21718 Andreszs

Verdade. A única vez em que você os vê em ação é quando você usa as teclas de seta ou os controladores para cima / para baixo (no Chrome etc.). Você ainda pode usar esses atributos para vincular sua validação subsequente, que funcionou para mim. Isso permite que você controle os limites via marcação (i18n etc.) vs. somente JS.
M Wuori

1

Sei que já existe uma resposta, mas se você deseja que sua entrada se comporte exatamente como o maxlengthatributo ou o mais próximo possível, use o seguinte código:

(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();

Eu gosto deste, tweaked ligeiramente para meu próprio uso (eu não queria que as pessoas digitassem um "e" no chrome, o que é permitido);
Mathijs Segers


1

A solução absoluta que tentei recentemente é:

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

Por ser um JS genérico, funcionará em qualquer lugar. Estou trabalhando em um projeto usando o Angular 5 e funciona como um encanto. Provavelmente, você pode gastar 10 minutos criando um serviço em seu código angular para reutilizá-lo em todo o projeto.
Benedict

0

Vou fazer isso rápido e fácil de entender!

Em vez de maxlength para type='number'(maxlength deve definir a quantidade máxima de letras para uma string em um texttipo), use min=''e max=''.

Felicidades


0

<input type="number"> é exatamente isso ... uma entrada numérica (embora não convertida de uma string para flutuar via Javascript).

Meu palpite, ele não restringe os caracteres na entrada de teclas maxLengthou o seu usuário pode ficar preso em uma "armadilha de teclas" se esquecerem um decimal no início (tente colocar um .no índice 1quando um <input type"text">atributo "maxLength" já tiver sido atingido ) No entanto, ele será validado no envio do formulário se você definir um maxatributo.

Se você estiver tentando restringir / validar um número de telefone, use o type="tel"atributo / valor. Ele obedece ao maxLengthattr e exibe apenas o teclado numérico do celular (em navegadores modernos) e você pode restringir a entrada a um padrão (ou seja pattern="[0-9]{10}").


0

Para usuários do React,

Basta substituir 10 pelo seu requisito de comprimento máximo

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

-1

maxlenght - texto do tipo de entrada

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

usando jQuery:

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

maxlenght - número do tipo de entrada

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);">
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.