longitud máxima ignorada para el tipo de entrada = "número" en Chrome

231

El maxlengthatributo no funciona con <input type="number">. Esto sucede solo en Chrome.

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>
Vicepresidente de Prajila
fuente

Respuestas:

278

De la documentación de MDN para<input>

Si el valor de la Tipo de atributo es text, email, search, password, tel, o url, este atributo especifica el número máximo de caracteres (en puntos de código Unicode) que el usuario puede introducir; para otros tipos de control, se ignora.

Entonces maxlengthes ignorado <input type="number">por el diseño.

Dependiendo de sus necesidades, puede utilizar el miny maxatributos como Inon sugerido en su / su respuesta (Nota: esto sólo definir un rango restringido, no la longitud de caracteres real del valor, aunque -9999 a 9.999 cubrir toda 0-4 números de dígitos), o puede usar una entrada de texto regular y aplicar la validación en el campo con el nuevo patternatributo:

<input type="text" pattern="\d*" maxlength="4">
André Dion
fuente
13
También tenga en cuenta que type="number"es un nuevo tipo de la especificación HTML 5. Si el navegador que está probando en no reconoce type="number"que lo tratará como type="text"los que no respeten el maxlengthatributo. Esto puede explicar el comportamiento que estás viendo.
André Dion
8
@fooquency, usted no está aquí, ya que en realidad no puede restringir la longitud física de la "entrada de teclado" en la type=numberentrada al configurar el maxatributo. Este atributo solo restringe el número elegido por la ruleta de entrada.
Kamilius
55
que hay \d*aqui
Pardeep Jain
44
pattern = "\ d *" no funciona en IE11 o Firefox 56. jsfiddle.net/yyvrz84v
Reado
44
El uso regexy el patrón es increíblemente creativo. Pero en el móvil, no es diferente Androido iOS, es una textentrada, por lo que causa un mal UX.
AmerllicA
215

La longitud máxima no funcionará de <input type="number"la mejor manera que sé, es usar el oninputevento para limitar la longitud máxima. Por favor vea el siguiente código.

<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
fuente
Brillante. ¡GRACIAS!
taketheleap
La versión @Guedes funciona para mí en todos los dispositivos probados que configuran el tipo en "número". Sin embargo, no entiendo completamente la segunda parte de la expresión||0/1
Barleby el
34
@Barleby. Solo oninput="this.value=this.value.slice(0,this.maxLength)"debería funcionar
Washington Guedes
1
El código anterior de @ WashingtonGuedes funcionó para mí en <input type="number"> stackoverflow.com/questions/18510845/…
David Yeiser
1
¡Tenga en cuenta que los ceros iniciales no se muestran con este enfoque!
HadidAli
53

Muchos chicos publicaron un onKeyDown()evento que no funciona en absoluto, es decir, no puedes eliminarlo una vez que alcanzas el límite. Entonces, en lugar de onKeyDown()usarlo onKeyPress(), funciona perfectamente bien.

A continuación se muestra el código de trabajo:

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
fuente
3
Esto es muy útil, más corto y mucho mejor que cualquier otra respuesta aquí mientras se mantiene el numbertipo de entrada html5
Dexter Bengil
44
Intenté, después de ingresar 4 dígitos, el cuadro de texto, simplemente se congela sin espacio para actualizaciones, ni las teclas de borrar ni la tecla de retroceso funcionan, nada funciona, cómo editar cualquier dígito, por favor mencione.
Abbas
1
Pude ingresar en su fragmento (1.2.3.4.5.5.6.76.7)
Alaa '15 de
1
Esta debería ser la respuesta aceptada. Una forma muy inteligente de mantener el campo numérico. Sólo asegúrese de añadir un atributo min / max como los botones de giro todavía pueden ir por encima de los 4 dígitos si se utilizan
NiallMitch14
3
No funciona cuando escribe 9999 y presiona el botón arriba en la entrada.
Csaba Gergely
37

Tengo dos maneras para que hagas eso

Primero: use type="tel", funcionará como type="number"en un dispositivo móvil y acepte maxlength:

<input type="tel" />

Segundo: use un poco de JavaScript:

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />
Maycow Moura
fuente
2
su segunda respuesta no es muy buena: si alcanzó 2 caracteres, no puede eliminar ningún número.
vtni
Sí, también noté que una entrada de Número no devuelve valor. De todos modos, la edité incluyendo el código de retroceso
Maycow Moura
2
También se deben incluir las teclas de matriz y el botón Eliminar (reenviar).
vtni
Esta es buena. y esto solo funciona para mí
votado
1
Gran respuesta, tnx. Sin embargo, no entiendo la razón para usar 'tel' en lugar de 'número' en este caso. Además, puede reemplazar su condición de "event.keyCode! = 8" con "event.keyCode> 47 && event.keyCode <58" en un caso de números naturales para deshabilitar al usuario solo para ingresar dígitos.
Dudi
28

Puede usar los atributos min y max .

El siguiente código hace lo mismo:

<input type="number" min="-999" max="9999"/>
inon
fuente
2
Yo diría que esta debería ser la respuesta correcta aquí. Chrome al menos cambia el tamaño de la caja de manera sensata según los parámetros min / max.
Fooquency
71
Sin embargo, esto no funciona si desea agregar restricción de longitud, aunque no podrá exceder el número que 9999el usuario puede escribir manualmente en un número que exceda esa longitud.
Philll_t
10

Cambie su tipo de entrada a texto y use el evento "oninput" para llamar a la función:

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

Ahora use Javascript Regex para filtrar la entrada del usuario y limitarla solo 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, "");
}

Demostración: https://codepen.io/aslami/pen/GdPvRY

Masood
fuente
1
La mejor respuesta de "solo números" que he encontrado. Otros usuarios que usan evt.keycode parecen fallar en mi Android
considera el
1
Una modificación muy pequeña, cambie "this.id" a "this", numberOnly (id) a numberOnly (element), entonces no necesita la primera línea de numberOnly y funciona sin una id
tony el
8

Una vez tuve el mismo problema y encontré esta solución con respecto a mis necesidades. Puede ayudar a alguien.

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

También puede probar esto para la entrada numérica con restricción de longitud

<input type="tel" maxlength="4" />
shinobi
fuente
8
en algunos navegadores (específicamente móviles), la telentrada se validará automáticamente como tal y, en algunos casos extraños, los 0s principales se cambiarán a 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
fuente
3

Aquí está mi solución con jQuery ... Debe agregar maxlength a su 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;
});

Y maneje copiar y pegar:

$('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 ayude a alguien.

harley81
fuente
Tuve la misma idea (aunque usé el evento "input"), pero creo que la solución que @WashingtonGuedes escribió en un comentario a otra respuesta es mucho más simple: this.value = this.value.slice(0, this.maxLength);¿Crees que esto tiene algún problema? No he encontrado ninguno hasta ahora. Cubre el texto pegado también.
nonzaprej
Me gusta el largo camino. El uso de RegExp es muy flexible.
harley81
2

En mi experiencia, la mayoría de los problemas en los que la gente pregunta por qué maxlengthse ignora es porque el usuario puede ingresar más que el número "permitido" de caracteres.

Como han dicho otros comentarios, las type="number"entradas no tienen un maxlengthatributo y, en cambio, tienen un atributo miny max.

Para que el campo limite el número de caracteres que se pueden insertar y, al mismo tiempo, permita que el usuario se dé cuenta de esto antes de enviar el formulario (de lo contrario, el navegador debe identificar el valor> max), deberá (por ahora, al menos) agregar un Oyente al campo.

Aquí hay una solución que he usado en el pasado: http://codepen.io/wuori/pen/LNyYBM

M Wuori
fuente
min y max son tan buenos como inútiles aquí, no impiden que el usuario escriba una cantidad infinita de números en el campo de entrada.
andreszs
Cierto. La única vez que los ve en acción es cuando usa las teclas de flecha o los controladores arriba / abajo (en Chrome, etc.). Todavía puede usar estos atributos para vincularlos en su validación posterior, lo que me ha funcionado. Esto le permite controlar los límites mediante marcado (i18n, etc.) frente a JS solamente.
M Wuori
1

Sé que ya hay una respuesta, pero si desea que su entrada se comporte exactamente como el maxlengthatributo o lo más cerca posible, use el siguiente 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
fuente
Me gusta este, lo modifiqué un poco para mi propio uso (no quería que la gente escribiera una "e" en cromo, que está permitido);
Mathijs Segers
1

La solución absoluta que acabo de probar recientemente es:

<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. Benedicto
fuente
Debido a que este es JS genérico, funcionará en todas partes. Estoy trabajando en un proyecto con Angular 5 y funciona de maravilla. Probablemente pueda pasar 10 minutos creando un servicio en su código angular para poder reutilizarlo en todo su proyecto.
Sr. Benedict
0

¡Haré esto rápido y fácil de entender!

En lugar de maxlength for type='number'(maxlength está destinado a definir la cantidad máxima de letras para una cadena en un texttipo), use min=''y max=''.

Salud

Dat Boi Trump
fuente
0

<input type="number"> es solo eso ... una entrada numérica (aunque no convertida desde una cadena para flotar a través de Javascript).

Supongo que no restringe los caracteres en la entrada de teclas maxLengtho, de lo contrario, su usuario podría quedar atrapado en una "trampa de teclas" si olvidaron un decimal al principio (Intente poner un .índice en 1cuando <input type"text">ya se haya alcanzado un atributo "maxLength" ) Sin embargo, se validará en el envío del formulario si establece un maxatributo.

Si está tratando de restringir / validar un número de teléfono, use el type="tel"atributo / valor. Obedece el maxLengthatributo y solo muestra el teclado del número móvil (en los navegadores modernos) y puede restringir la entrada a un patrón (es decir pattern="[0-9]{10}").

daleyjem
fuente
0

Para usuarios de React,

Simplemente reemplace 10 con su requisito de longitud máxima

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

maxlenght - texto de tipo de entrada

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

usando jQuery:

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

maxlenght - número de 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 González
fuente