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"/>
Prajila VP
fonte

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">
André Dion
fonte
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"
 />
Neha Jain
fonte
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;" />

Vikasdeep Singh
fonte
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;" />
Maycow Moura
fonte
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"/>
inon
fonte
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

Masood
fonte
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 :)

Mohammad Mahroz
fonte
3

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

<input type="tel" maxlength="4" />
Shinobi
fonte
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

Surya R Praveen
fonte
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.

harley81
fonte
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

M Wuori
fonte
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();
Philll_t
fonte
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

O Chrome (tecnicamente, Blink) não implementará maxlength para <input type="number">.

A especificação HTML5 diz que maxlength é aplicável apenas aos tipos de texto, URL, email, pesquisa, tel e senha.

pwnall
fonte
não acrescenta nada de útil para o que não foi mencionado anteriormente
candidJ
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" />
Sr. Benedict
fonte
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

Dat Boi Trump
fonte
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}").

daleyjem
fonte
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)}/>
picacode
fonte
-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);">
Hernaldo Gonzalez
fonte