Como posso limitar possíveis entradas em um elemento "número" do HTML5?

359

Para o <input type="number">elemento, maxlengthnão está funcionando. Como posso restringir o maxlengthelemento desse número?

Prasad
fonte
5
Para pessoas que procuram uma solução melhor, este é o melhor: stackoverflow.com/questions/9361193/...
Ünsal Korkmaz
4
O atributo max não funciona no navegador Chrome no tablet Android.
Foreever
4
@ ÜnsalKorkmaz: essa solução tem a desvantagem de não abrir o teclado numérico em dispositivos Android
Will

Respostas:

340

E você pode adicionar um maxatributo que especifique o número mais alto possível que você pode inserir

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

se você adicionar maxum minvalor e um, poderá especificar o intervalo de valores permitidos:

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

O item acima ainda não impedirá o usuário de inserir manualmente um valor fora do intervalo especificado. Em vez disso, ele receberá um pop-up solicitando que ele insira um valor nesse intervalo ao enviar o formulário, conforme mostrado nesta captura de tela:

insira a descrição da imagem aqui

Cyclonecode
fonte
4
Krister, isso funcionou. Também como @ Andy disse que eu usei o oninput para cortar os números adicionais. Referência mathiasbynens.be/notes/oninput
Prasad
7
@Prasad - Se a resposta de Andy estiver correta, selecione-a, em vez da mais votada.
Moshe
81
Isso está correto, mas deve-se observar que Andy afirma que isso não impede que alguém digite um número maior. Portanto, não é realmente o equivalente ao comprimento máximo em um campo de texto.
DA.
9
Se você simplesmente inseriu um flutuador de maior precisão, isso será interrompido. Por exemplo, 3.1415926 contorna isso porque é menor que 999 e maior que 1.
0112 08/10
44
Não sei por que isso é tão votado e aceito quando simplesmente não funciona! Ela afeta apenas os controles "rotadores", e não faz nada para parar o usuário digitar um número longo no.
Codemonkey
115

Você pode especificar os atributos mine max, que permitirão entrada apenas dentro de um intervalo específico.

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

Porém, isso funciona apenas para os botões de controle giratório. Embora o usuário possa digitar um número maior que o permitido max, o formulário não será enviado.

Mensagem de validação do Chrome para números maiores que o máximo
Captura de tela retirada do Chrome 15

Você pode usar o oninputevento HTML5 no JavaScript para limitar o número de caracteres:

myInput.oninput = function () {
    if (this.value.length > 4) {
        this.value = this.value.slice(0,4); 
    }
}
Andy E
fonte
11
Um possível problema com essa abordagem do JavaScript: pode não funcionar como esperado se o ponto de inserção não estiver no final do valor. Por exemplo, se você inserir o valor "1234" no campo de entrada, mova o ponto de inserção de volta para o início do valor e digite "5", e o valor "5123" será finalizado. Isso é diferente de um campo de entrada type = "text" com um comprimento máximo de 4, em que o navegador não permite digitar um quinto caractere no campo "full" e o valor permanecerá "1234".
Jon Schneider
@Andy, Obviamente, a questão está à procura de uma forma não-JS fazer maxlength.............
Pacerier
4
@ Pacerier: algo na minha resposta implica que eu pensava o contrário? Como você pode ver, eu ofereci a solução mais próxima possível que pode ser obtida usando apenas HTML, juntamente com uma sugestão adicional que usa JavaScript, onde o OP pode querer impedir o usuário de digitar mais caracteres do que o permitido.
Andy E
84

Se você está procurando uma solução para Web móvel na qual deseja que o usuário veja um teclado numérico em vez de um teclado de texto completo. Use type = "tel". Ele funcionará com o maxlength, o que evita a criação de javascript extra.

Max e Min ainda permitirão que o usuário digite números acima de max e min, o que não é o ideal.

Duane
fonte
3
Ótima descoberta, isso funcionou como um encanto, perfeito para não ter que criar o javascript extra.
1111 Diego
9
Descobri que essa não é a melhor solução para entrada numérica porque uma entrada "tel" permite símbolos adicionais e exibe letras ao lado de cada número. O teclado puramente numérico parece muito mais limpo.
27414 hawkharris
@hawkharris Você está correto, digite = "number" é a interface do usuário mais limpa. É mais fácil digitar acidentalmente um caractere incorreto. Portanto, é necessária uma validação adicional para garantir que o usuário não insira dados incorretos. Mas considere também que o usuário poderia facilmente inserir todos os pontos decimais com um teclado numérico. Também não resolve a questão acima sem JavaScript adicional.
Duane
11
Obrigado, eu estou trabalhando em aplicativo móvel quadro iônica e isso resolveu o meu problema
Ahmed
11
se usado com pattern = "[0-9] *", os símbolos extras serão desativados
apereira 18/09/18
71

Você pode combinar tudo isso assim:

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


Atualização:
você também pode impedir a inserção de caracteres não numéricos, porque object.lengthseria uma sequência vazia para as entradas numéricas e, portanto, seu comprimento seria 0. Portanto, a maxLengthCheckfunção não funcionará.

Solução:
Veja isto ou isto para obter exemplos.

Demo - Veja a versão completa do código aqui:
http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/

Atualização 2: Aqui está o código de atualização: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/

Atualização 3: Observe que permitir que mais de um ponto decimal seja inserido pode atrapalhar o valor do numeral.

David Refoua
fonte
Essa é uma boa solução, mas acho que object.value.length retorna 0 se houver algum valor não numérico inserido.
Andrew
11
@AndrewSpear Isso ocorre porque object.value seria uma string vazia se você inserir valores não numéricos nas entradas com um tipo de 'número' definido. Veja a documentação. Além disso, leia minha atualização para corrigir esse problema.
David Refoua
Isso ainda será interrompido se você inserir mais de um ponto decimal, como 111..1111. Não use esse código por segurança, pois o código malicioso ainda pode ser transmitido.
PieBie
@PieBie Cara, esse código é para mais de 3 anos atrás. Use o jQuery.
David Refoua
11
Sim, eu sei disso, mas os iniciantes ainda podem copiar e colar.
PieBie
26

é muito simples, com algum javascript você pode simular um maxlength, confira:

//maxlength="2"
<input type="number" onKeyDown="if(this.value.length==2) return false;" />
Maycow Moura
fonte
12
Com sua solução, você não pode usar backspace depois de atingir 2 caracteres. mas eu sinto falta algumas coisa para uma solução funcional
Christophe Debove
12
Em vez de onKeyDown, você deve usar onKeyPress.
Rupesh Arora 25/05
11
não funcionará se você destacar o texto e pressionar um caractere (ou seja, para substituir o conteúdo da entrada) #
315 Arijoon
validar esta se isso não é da seguinte chaves stackoverflow.com/a/2353562/1534925
Akshay
3
O problema keydowné que você não pode usar backspace com no máximo caracteres. O problema keypressé que você pode copiar e colar além dos caracteres máximos.
Stavm
23

Ou se o seu valor máximo for, por exemplo, 99 e o mínimo 0, você poderá adicioná-lo ao elemento de entrada (seu valor será reescrito pelo seu valor máximo, etc.)

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

Então (se você quiser), você pode verificar se a entrada é realmente o número

Richard
fonte
... Ótimo, mas você não precisa mais de min e max, cara. (apenas dizendo)
xoxel 30/09/16
2
@xoxel você faria se você quer a mensagem de aviso ainda exibição
DNKROZ
Isso é realmente bom ... Obrigado
Vincy Oommen 13/01
por uma questão de generalização que eu fariaonKeyUp="if(this.value>this.max)this.value=this.max;if(this.value<this.min)this.value=this.min;"
oriadam
18

Você pode especificá-lo como texto, mas adicione pettern, que corresponde apenas a números:

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

Funciona perfeitamente e também no celular (testado no iOS 8 e Android) exibe o teclado numérico.

Chris Panayotoff
fonte
O atributo padrão não é suportado no IE9 e versões anteriores, e tem suporte parcial no Safari: caniuse.com/#feat=input-pattern
diazdeteran
Sim, obrigado por apontar, mas descartamos o suporte ao IE9 (cortando a mostarda) e eu prefiro os métodos JS. Depende do projeto.
Chris Panayotoff
2
Um usuário não é impedido de inserir caracteres não numéricos com isso. Eles podem inserir 2 de qualquer caractere. As patternúnicas causas destacam a validação.
Br
testado no Android 9 (Nokia 8), mas eu recebo o teclado normal :( alguma idéia?
oriadam
14

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

Se você usar o evento "onkeypress", não receberá nenhuma limitação do usuário enquanto estiver desenvolvendo (teste de unidade). E se você possui requisitos que não permitem que o usuário entre após um determinado limite, consulte este código e tente uma vez.

Prasad Shinde
fonte
11
Os problemas que vejo aqui são: 1. substitua por selecione o texto e o tipo não funcionará se a entrada tiver atingido 7 números. botão. Quebra a limitação
Edub
Eu tentei com a versão simples javascript. Se você quiser, pode ver o uso do snippet de código Run. Como tal, não encontrei nenhuma limitação.
Prasad Shinde
11
Também não encontrou nenhuma limitação. Para em 7 dígitos. Estou usando esta solução para o meu código.
Cláudio
Existe uma limitação. Quando você atingir o limite, selecione todos e deseja substituí-los, não funciona. A substituição funciona para mim apenas quando substituo o valor pelo valor atual antes de retornar falso.
Insomnia88
@ Insomnia88, @ edub que se escrevermos função e verificar as condições necessárias ...
Prasad Shinde
12

Outra opção é adicionar apenas um ouvinte a qualquer coisa com o atributo maxlength e adicionar o valor da fatia a ele. Supondo que o usuário não queira usar uma função em todos os eventos relacionados à entrada. Aqui está um trecho de código. Ignore o código CSS e HTML, o JavaScript é o que importa.

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

Brandon Buttars
fonte
10

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

<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
Trabalhou como um encanto!
SiboVG 18/03
9

Digamos que você desejasse que o valor máximo permitido fosse 1000 - digitado ou com o botão giratório.

Você restringe os valores do girador usando: type="number" min="0" max="1000"

e restrinja o que é digitado pelo teclado com javascript: onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }"

<input type="number" min="0" max="1000" onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }">
Stnfordly
fonte
8

Conforme declarado por outros, min / max não é o mesmo que maxlength porque as pessoas ainda podem entrar em um flutuador que seria maior que o comprimento máximo da string que você pretendia. Para realmente emular o atributo maxlength, você pode fazer algo assim em uma pitada (isso é equivalente a maxlength = "16"):

<input type="number" oninput="if(value.length>16)value=value.slice(0,16)">
thdoan
fonte
A fatia excluirá caracteres sem o conhecimento do usuário final quando inseridos no meio. enquanto o comprimento máximo será bloqueado.
Pradeep Kumar Prabaharan
@PradeepKumarPrabaharan maxlengthnão é suportado por entradas numéricas. No meu exemplo, value.slice(0,16)não será ativado, a menos que o valor de entrada tenha mais de 16 caracteres.
thdoan
sim maxlength não é suportada para as entradas número .. este código é gud mas esse código não corresponde à propriedade do maxlength exatamente ..
Pradeep Kumar Prabaharan
@TobiasGaertner type="number"cuida disso :).
thdoan
@ 10basetom ... dependendo do navegador ... por exemplo, no FF você ainda pode inserir caracteres e eles não param após o limite - mas, relacionado à idéia do número do tipo, essa é uma solução aceitável.
Tobias Gaertner 25/10
6

A resposta de Maycow Moura foi um bom começo. No entanto, sua solução significa que, quando você digita o segundo dígito, toda a edição do campo é interrompida. Portanto, você não pode alterar valores ou excluir nenhum caractere.

O código a seguir para em 2, mas permite que a edição continue;

//MaxLength 2
onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"
Tim Wright
fonte
2
Não. Tente colar um valor.
Qwertiy
6

Eu já tinha esse problema e resolvi-o usando uma combinação de tipo de número html5 e jQuery.

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

roteiro:

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

Não sei se os eventos são um pouco exagerados, mas isso resolveu meu problema. JSfiddle

inclinar para baixo
fonte
Você pode colar caracteres facilmente.
Jessica
4

Entrada 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;
    }

  });
Hector
fonte
4

uma maneira simples de definir o comprimento máximo para entradas numéricas é:

<input type="number" onkeypress="return this.value.length < 4;" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />
HexboY
fonte
não funciona no android chrome. O onkeypress tem alguns problemas com isso.
Aakash Thakur
3

Assim como type="number"você especifica uma propriedade em maxvez de maxlength, que é o número máximo possível possível. Assim, com 4 dígitos, maxdeve ser 9999, 5 dígitos 99999e assim por diante.

Além disso, se você quiser ter certeza de que é um número positivo, pode definir min="0", garantindo números positivos.

Jan Dragsbaek
fonte
3

Ugh. É como se alguém desistisse no meio da implementação e pensasse que ninguém notaria.

Por alguma razão, as respostas acima não usar o mine maxatributos. Este jQuery termina:

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

Provavelmente também funcionaria como uma função nomeada "oninput" sem jQuery se você é um desses tipos "jQuery é o diabo".

Michael Cole
fonte
não responder corretamente a pergunta, mas votou-se como tem resolvido o meu problema :)
TrOnNe
2

Como eu descobri que você não pode usar qualquer um onkeydown, onkeypressou onkeyupeventos para uma solução completa, incluindo navegadores móveis. A propósito, ele onkeypressestá obsoleto e não está mais presente no chrome / opera para android (consulte: UI Events W3C Working Draft, 04 de agosto de 2016 ).

Eu descobri uma solução usando oninputapenas o evento. Pode ser necessário fazer uma verificação adicional do número, conforme necessário, como sinal negativo / positivo ou separadores decimais e mil, e assim por diante, mas, para começar, o seguinte deve ser suficiente:

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.
	}
}

Eu recomendaria também para combinar maxlengthcom mine maxpara evitar que submete erradas como dito acima várias vezes.

markus s
fonte
2
<input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />

ou se você quiser poder inserir nada

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

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

<input type="tel" maxlength="3" />
Shinobi
fonte
@tiltdown Sry para erros de digitação. Corrigida a resposta.
shinobi
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
@Phill_t talvez você possa me esclarecer? Eu usei seu código e ele está funcionando bem no principal, mas "$ (this) .attr (" maxlength ")" sempre entrega 2. E por que seria melhor usar "$ (this) .attr (" maxlength ")" se estava funcionando em vez de apenas "this.maxlength" que eu testei e estava funcionando conforme o esperado e é mais curto e imho também mais claro de ler? Eu perdi alguma coisa?
Markus s
O que você quer dizer com "entrega 2"?
precisa saber é o seguinte
Phill_t minhas desculpas. "this.maxLength" está funcionando apenas no escopo da função keydown. Na função "addMax" "this" está o documento em vez do elemento esperado e, portanto, possui valores de atributo diferentes. Como eu teria acesso à entrada de número? O código acima está realmente funcionando do seu lado? Testei com Chrome / Opera / Vivaldi, Firefox, Edge, IE e Safari e obtive os mesmos resultados para cada navegador. Ok, no Edge maxlegth = "1" e maxlength = "2" onde realmente funciona, mas "$ (this) .attr (" maxlength ")" não aumenta mais para um número maior !!? @anybody: Alguma sugestão?
Markus s
Como eu disse, sempre são dois porque é chamado no documento, e não no elemento em questão, como descobri quando estava depurando. Pela maneira que você também pode querer olhar para a minha solução que eu descobri depois de estudar sua: stackoverflow.com/a/41871960/1312012
markus s
0

Atributos mais relevantes a serem usados ​​seriam mine max.

Marcel
fonte
0

Isso pode ajudar alguém.

Com um pouco de javascript, você pode procurar todas as entradas locais de data e hora, pesquisar se o ano que o usuário está tentando inserir, maior que 100 anos no futuro:

$('input[type=datetime-local]').each(function( index ) {

    $(this).change(function() {
      var today = new Date();
      var date = new Date(this.value);
      var yearFuture = new Date();
      yearFuture.setFullYear(yearFuture.getFullYear()+100);

      if(date.getFullYear() > yearFuture.getFullYear()) {

        this.value = today.getFullYear() + this.value.slice(4);
      }
    })
  });
Simon Berton
fonte