2011-02-15 21 views
9

Estoy tratando de agregar funcionalidad a los campos de fecha de entrada para que cuando los usuarios ingresen dígitos, las barras "/" se agreguen automáticamente.Cuál es la mejor manera de insertar barras automáticamente '/' en campos de fecha

Así que supongamos que tengo el código HTML siguiente:

<input type="text" id="fooDate" /> 

Y supongamos que tengo el siguiente javascript:

var dateField = document.getElementById("fooDate"); 
dateField.onkeyup = bar; 

Lo que debería ser bar?

Hasta ahora el mejor resultado fue Google:

function bar(evt) 
{ 
    var v = this.value; 
    if (v.match(/^\d{2}$/) !== null) { 
     this.value = v + '/'; 
    } else if (v.match(/^\d{2}\/\d{2}$/) !== null) { 
     this.value = v + '/'; 
    } 

} 

Gracias!

también - Sé que se introducen barras al escribir es una mierda. Simplemente avance con él: p

+3

Esto parece una solución bastante razonable a su problema. ¿Cuál es tu pregunta real? –

+2

La mejor manera sería no agregar barras cuando un usuario está escribiendo;) Para las fechas, puede hacer 3 entradas pequeñas separadas por una barra: '[__]/[__]/[____]' – meze

+0

@gael logic does not tener en cuenta los espacios intermedios. Además, no tiene en cuenta un dígito de meses y días. – Shawn

Respuesta

0

Intente utilizar este complemento: http://digitalbush.com/projects/masked-input-plugin/ Funciona con jquery.

+0

Como su respuesta tiene cinco años, creo que debería añadir que formatter.js (http://firstopinion.github.io/formatter.js/) es preferible actualmente si se usa una biblioteca. Si todo lo que tienes es una entrada de fecha, la biblioteca puede ser innecesaria. –

14

Actualizar/Editar: Obviamente, la solución más simple hoy en día con soporte HTML5 extendido es usar <input type="date" name="yourName">.

Para aquellos que se quejan de que no se acomoda a las teclas de retroceso o pegar, he modificado el original:

//Put our input DOM element into a jQuery Object 
var $jqDate = jQuery('input[name="jqueryDate"]'); 

//Bind keyup/keydown to the input 
$jqDate.bind('keyup','keydown', function(e){ 

    //To accomdate for backspacing, we detect which key was pressed - if backspace, do nothing: 
    if(e.which !== 8) { 
     var numChars = $jqDate.val().length; 
     if(numChars === 2 || numChars === 5){ 
      var thisVal = $jqDate.val(); 
      thisVal += '/'; 
      $jqDate.val(thisVal); 
     } 
    } 
}); 

`

violín de Trabajo: https://jsfiddle.net/ChrisCoray/hLkjhsce/

+0

No funciona cuando elimina caracteres. –

+0

Hay una serie de casos que no se solucionan, como pegar, eliminar, seleccionar y escribir rápidamente, en los que el navegador no dispara 'keyup' por cada pulsación de tecla. –

+0

Gracias @ AdamLeggett. La solución obvia de hoy (esto se escribió hace casi cuatro años) sería simplemente usar el tipo de entrada de "fecha" HTML5, ya que la gran mayoría de los navegadores deberían ser compatibles. Solo por el bien de la nostalgia, actualicé el código y agregué un enlace a un violín para mostrar que funcionaba pegando y retrocediendo. Debería funcionar sin importar qué tan rápido esté tipeando una persona, y no tengo idea de qué quiere decir con "selección". Adam: no estamos probando si una persona seleccionó algo, simplemente estamos evaluando el valor de la información. – ChrisCoray

0

Esta solución funciona para mí. He capturado el evento de desenfoque aunque tendrá que cambiar el código si desea usar el evento de tecla. HTML

<input type="text" id="fooDate" onblur="bar(this)"/> 

Javascript

function bar(txtBox) { 
    if (txtBox == null) { 
    return '' 
    } 

    var re = new RegExp(/(\d{6})(\d{2})?/); 

    if (re.test(txtBox.value)) { 
    if (txtBox.value.length == 8) { 
     txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/' + txtBox.value.substring(4, 8) 
    } 
    if (txtBox.value.length == 7) { 
     txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 3) + '/' + txtBox.value.substring(3, 8) 
    } 

    if (txtBox.value.length == 6) { 
     if (txtBox.value.substring(4, 6) < 20) { 
     txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/20' + txtBox.value.substring(4, 6); 
     } else { 
     txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/19' + txtBox.value.substring(4, 6); 
     } 
    } 
    } 
    return txtBox.value; 
} 
1

Esta solución también manejar las teclas de borrado y de retroceso:

jQuery('input[name="dateofbirth"]').bind('keyup',function(event){ 
    var key = event.keyCode || event.charCode; 
    if (key == 8 || key == 46) return false; 
    var strokes = $(this).val().length; 
    if(strokes === 2 || strokes === 5){ 
     var thisVal = $(this).val(); 
     thisVal += '/'; 
     $(this).val(thisVal); 
    } 
}); 
+0

debe devolver falso para la clave 229, por lo que el retroceso de Android también funciona;) –

+0

¿No debería ser '/' 47 en lugar de 46? – TheSoulkiller

1

tengo una alternativa que puede trabajar con selector de fechas jquery-ui, sin formateador. js. Se pretende que se llame desde los eventos keyup y change. Agrega cero relleno. Funciona con varios formatos de fecha admitidos mediante la construcción de expresiones a partir de la cadena dateFormat. No puedo pensar en una forma de hacerlo con menos de tres reemplazos.

// Example: mm/dd/yy or yy-mm-dd 
var format = $(".ui-datepicker").datepicker("option", "dateFormat"); 

var match = new RegExp(format 
    .replace(/(\w+)\W(\w+)\W(\w+)/, "^\\s*($1)\\W*($2)?\\W*($3)?([0-9]*).*") 
    .replace(/mm|dd/g, "\\d{2}") 
    .replace(/yy/g, "\\d{4}")); 
var replace = "$1/$2/$3$4" 
    .replace(/\//g, format.match(/\W/)); 

function doFormat(target) 
{ 
    target.value = target.value 
     .replace(/(^|\W)(?=\d\W)/g, "$10") // padding 
     .replace(match, replace)    // fields 
     .replace(/(\W)+/g, "$1");   // remove repeats 
} 

https://jsfiddle.net/4msunL6k/

+0

Esta solución funciona mejor para mí. Cuando envía correo basura al teclado, las barras continuas se agregan, en comparación con otras soluciones – Nicholas

+0

No formatea en pegar. –

+0

@ Adam También está aceptando el 60/65/4555. cualquier otra solución? –

1

Ésta es una simples manera:

Date: <input name=x size=10 maxlength=10 onkeyup="this.value=this.value.replace(/^(\d\d)(\d)$/g,'$1/$2').replace(/^(\d\d\/\d\d)(\d+)$/g,'$1/$2').replace(/[^\d\/]/g,'')">

Here ia a fiddle : https://jsfiddle.net/y6mnpc1j/

+0

También está aceptando el 60/65/4555. cualquier otra solución? –

0

Si usted está buscando para la versión pura js de @ respuesta de Chris

var newInput = document.getElementById("theDate"); 
newInput.addEventListener('keydown', function(e){ 
    if(e.which !== 8) { 
     var numChars = e.target.value.length; 
     if(numChars === 2 || numChars === 5){ 
      var thisVal = e.target.value; 
      thisVal += '/'; 
      e.target.value = thisVal; 
     } 
    } 
}); 

y HTML sección puede ser (si es necesario):

<input type="text" name="theDate" id="birthdate" maxlength="10"/> 
Cuestiones relacionadas