[JQuery]Enmascarar una Hora, con JQuery usando Masked Input Plugin

Primero nos descargamos las librerías necesarias,

1. JQuery
2. Masked Input Plugin (librerias del plugin para jquery).

Creamos una página HTML para probar el ejemplo (lo más sencillo posible).

Incluimos las librerías :

<script type="text/javascript" src="includes/jquery.js"></script>
<script type="text/javascript" src="includes/jquery.maskedinput.js"></script>

agregamos un input :

<input type="text"  id="time">

y agregamos nuestro script , donde estamos generando nuestras propias definiciones,

esto porque el pluging solo cuenta con 3 definiciones.

  • 9 – para números del 0-9
  • a – para letras de la A-Z y a-z
  • * – para alfanuméricos
   jQuery(function($)
   {
      $.mask.definitions['H']='[012]';
      $.mask.definitions['N']='[012345]';
      $.mask.definitions['n']='[0123456789]';
      $("#time").mask("Hn:Nn:Nn");
    });

Solo que en este caso no estaría , totalmente validada porque se podriá dar el caso de una hora (24:50:10 ó 25:00:00) y eso no es correcto ! 🙂

Para solucionar esto se hace una función con la que se valida que sea correcta y la colocamos en el onblur del input.

<input type="text" id="time" onblur="valida(this.value);">

y la función seriá como esta.

function valida(valor)
{
   //que no existan elementos sin escribir
   if(valor.indexOf("_") == -1)
   {
      var hora = valor.split(":")[0];
      if(parseInt(hora) > 23 )
      {
           $("#time").val("");
      }
   }
}

y Listo 😀

el código del ejemplo esta en esta LIGA por si desean descargarla.

26 comentarios en “[JQuery]Enmascarar una Hora, con JQuery usando Masked Input Plugin

  1. no conosco mucho de jquery y javascritp, pero en esta parte del codigo » var hora = valor.split(«:»)[0]; » cuando el split(«:») lo juntas con [0] que es lo que haces, cual es objetivo, para que haces eso ?.

    gracias de antemano.

    • bueno mira.
      el formato de la mascara hora es HH:MM:SS , Horas , minutos y Segundos
      al hacer esto «var hora = valor.split(«:») » me retorna un arreglo con las partes en que fue partida la cadena y para no tener que hacer esto

      var datos = valor.split(":"); //datos[0] = HH,datos[1] = MM y datos[2] = SS
      var hora = datos[0];

      lo simplifico en una linea.
      var hora = valor.split(":")[0];
      y la hora la obtengo para validar que no se pueda poner una hora asi 24:10:50
      Saludos!! y espero haber resuelto tu duda. de no ser asi escribe por aqui para estar en contacto.

    • Que tal!
      mira pues el ejemplo funciona bien lo acabo de probar. Tal vez hiciste lo que yo ahora que lo probe ejecutaste el html desde el zip y pues no me funciono.
      pero ya descomprimido funciona correctamente y si te deja ingresar esta hora : 29:00:00 pero al cambiar el foco del input lo borra porque es erronea.

      Espero y eso sea el error,de cualquier forma escribe por aqui y seguimos en contacto.

      • Ya veo, acabo de probarlo y si me parece que esta bien, pero me gustaría que así como el campo de minutos no me permite ingresar mayor a 59 miutos, asi sea tambien el campo de hora, que no me permita ingresar mayor a 12 o 23, sin necesidad de cambiar el foco, sería genial no crees?

      • pues si, eso seria muy bueno , pero si lo analizas bien , es un poco dificil, porque el usuario puede escribir el 2 en el primero lugar, solo si el segundo es menor que 4.
        lo que nos lleva a que la validacion se tiene que hacer despues de que es insertado el segundo, y esto se tiene que hacer o con el evento keypress o el onblur para validar. y seria algo muy parecido a lo que se esta haciendo.

        En resumen, sí se puede hacer la validación, pero no con la mascara en si, se tiene que usar código para hacerla.

        Saludos.

  2. Hola,

    Me parece muy interesante, sólo tengo una pequeña duda. ¿Como le quito a un elemento la mascara?

    He probado a pasarle una cadena vacía. Pero esto hace que no deje introducir ningún carácter.

    Un saludo

  3. esta muy bien pero si yo quiero que poner una mascara 9,999.99 y si solo se captura 455.52, eso es valido, pero el plugin lo toma como invalido y por lo tanto lo borra, si alguien sabe como corregir eso ó si ya esta corregido les encargo que me avisen, GRACIAS.

  4. Para poner la maskara de horas y minutos y que no sobrepase los valores validos…

    jQuery(function($){
    $.mask.definitions[‘H’]='[012]’;
    $.mask.definitions[‘N’]='[012345]’;
    $.mask.definitions[‘z’]='[01234]’;
    $.mask.definitions[‘n’]='[0123456789]’;

    $(«#data»).mask(«Hz:Nn»,{placeholder:» «});
    });
    es decir tu defines los valores validos con definitions en la mascara.

    Saludos

  5. Pingback: [Estadísticas]Los números de 2010 « Isaias Aguirre
  6. Hola yo agregue para que reciba am/pm, es mi humilde aporte 🙂

    jQuery(function($)
    	    {
    	       $.mask.definitions['H']='[012]';
    		   $.mask.definitions['N']='[012345]';
    		   $.mask.definitions['n']='[0123456789]';
    		   $.mask.definitions['t']="['am','pm']";
    		   $("#time").mask("Hn:Nn:Nn t");
    		});
    

    y en la funcion que verifica:

    function validaFecha(text,valor)
    {
        //que no existan elementos sin escribir
        if(valor.indexOf("_") == -1)
        {
            var hora = valor.split(":")[0];
            var mm=valor.split(" ")[1];
            if(parseInt(hora) > 12 || (mm!="am" && mm!="pm"))
            {
                $(text).val("");
            }
        }
    }
    

    saludos, y espero ayudar.

  7. Hola, me equivoque al poner el codigo, disculpame, borra el anterior post

    jQuery(function($)
    {
        $.mask.definitions['H']='[01]';
        $.mask.definitions['N']='[012345]';
        $.mask.definitions['n']='[0123456789]';
        $.mask.definitions['x']='[ap]';
        $.mask.definitions['y']='[m]';
    });
    

    y la funcion:

    function validaFecha(text,valor)
    {
        //que no existan elementos sin escribir
        if(valor.indexOf("_") == -1)
        {
            var hora = valor.split(":")[0];
            var mm=valor.split(" ")[1];
            if(parseInt(hora) > 12 || (mm!="am" && mm!="pm"))
            {
                $(text).val("");
            }
        }
    }
    

    saludos.

  8. hola para los que quieren validar el tiempo (horas y minutos) lo hice de esta manera y me funciono a la perfeccion

    $.mask.definitions[‘H’] = ‘[012]’;
    $.mask.definitions[‘a’] = ‘[0123]’;

    $.mask.definitions[‘N’] = ‘[012345]’;
    $.mask.definitions[‘b’] = ‘[0123456789]’;
    $(«#ctl00_ContentPlaceHolder1_gvLecturaGPS_ctl02_txtValor_p7_v7_f1»).mask(«Ha:Nb») $(«#ctl00_ContentPlaceHolder1_gvLecturaGPS_ctl03_txtValor_p7_v7_f1»).mask(«Ha:Nb»);
    $(«#»).mask(«Ha:Nb»);

  9. $(document).ready(function () {
    $.mask.definitions[‘H’] = ‘[012]’;
    $.mask.definitions[‘h’] = ‘[0123]’;
    $.mask.definitions[‘M’] = ‘[012345]’;
    $.mask.definitions[‘m’] = ‘[0123456789]’;

    $(‘#’ + » + ‘_lista tbody tr td input:text’).each(function () {
    $(‘#’ + this.id).mask(«Hh:Mm»);
    });
    });

  10. Hola, gracias por el aporte pero no entiendo esta parte, si lo explicaras un poco, gracias

    $(“#ctl00_ContentPlaceHolder1_gvLecturaGPS_ctl02_txtValor_p7_v7_f1″).mask(“Ha:Nb”) $(“#ctl00_ContentPlaceHolder1_gvLecturaGPS_ctl03_txtValor_p7_v7_f1″).mask(“Ha:Nb”);

    • A lo que se refiere es a las definiciones… esas 2 lineas no sirven para tu aplicación.
      Un ejemplo más claro sería:

      jQuery(function($)
      {
      $.mask.definitions[‘H’] = ‘[012]’;
      $.mask.definitions[‘a’] = ‘[0123]’;
      $.mask.definitions[‘N’] = ‘[012345]’;
      $.mask.definitions[‘b’] = ‘[0123456789]’;
      $(«#time»).mask(«Ha:Nb»);
      });

      entonces no podrás colocar una hora con 24, ya que se supone que 24:00, corresponde a 00:00, entonces las definiciones solo te dejan colocar 23:59 y luego 00:00

Deja un comentario