28.8.08

Objeto Javascript para controlar objetos INPUT

Trabajamos a diario, los que diseñamos páginas web, con formularios de entrada de datos, mayormente conformados por objetos INPUT. Estos requieren, muchas veces, de validaciones estándares que, si bien podemos hacerlas en el servidor, se ahorra mucho tiempo el hacerlas en el servidor.

Este objeto que les comparto, hace una serie de validaciones para distintos tipos de entradas de datos, algunas de ellas teniendo en cuenta a algunos caracteres "indigestos" para las bases de datos enalgunas circunstancias. Valida:

  • NUMBER: que la entrada sea un valor numérico, entero o decimal, positivo o negativo, con determinada cantidad de decimales, etc.
  • DATE: que la entrada sea una fecha válida. Solo acepta fechas en formato dd/mm/aaaa.
  • TEXTONLY: solo caracteres de la A-Z (sin los hispánicos, salvo que se establezca lo contrario).
  • TEXTNUMBER: caracteres de la A-Z, números de 0-9 y el espacio en blanco. (sin los hispánicos, salvo que se establezca lo contrario).
  • ALPHA: caracteres de la A-Z y algunos símbolos. (sin los hispánicos, salvo que se establezca lo contrario).
  • ALPHANUMERIC: caracteres de la A-Z, números de 0-9 y algunos símbolos. (sin los hispánicos, salvo que se establezca lo contrario).

El código:

var __jgWC = {
   Version: '0.2.0 RC',
   //objetos controlados
   ControledObjects: [],
   //determinador del browser
   Browser: {
       IE:     !!(window.attachEvent && !window.opera),
       Opera:  !!window.opera,
       WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
       Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
       MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
   },
   //controla los atributos del objeto input
   DefaultAttributes:function(obj) {
       if(!obj.getAttribute('inputtype')) obj.setAttribute('inputtype', 'all');
       if(!obj.getAttribute('texttransform')) obj.setAttribute('texttransform', 'none');
       if(!obj.getAttribute('positiveonly')) obj.setAttribute('positiveonly', 'false');
       if(!obj.getAttribute('decimalpoint')) obj.setAttribute('decimalpoint', '.');
       if(!obj.getAttribute('decimalplaces')) obj.setAttribute('decimalplaces', '2')
       if(!obj.getAttribute('excludechar')) obj.setAttribute('excludechar', '');
       if(!obj.getAttribute('includecharonly')) obj.setAttribute('includecharonly', '');
       if(!obj.getAttribute('spanishchars')) obj.setAttribute('spanishchars', 'false');
       if(!obj.getAttribute('valMin')) obj.setAttribute('valMin', '');
       if(!obj.getAttribute('valMax')) obj.setAttribute('valMax', '');
       if(!obj.getAttribute('blurErrorAlert')) obj.setAttribute('blurErrorAlert', 'true');
       if(!obj.getAttribute('blurErrorMessage')) obj.setAttribute('blurErrorMessage', 'DATOS INCORRECTOS');
   },
   //registrador de los eventos de los inputs controlados
   RegisterObject:function(ob, enableEvents) {
       if(typeof ob == 'string') { ob=document.getElementById(ob); }
       if(arguments.length == 1) {enableEvents=true;}
       if(!ob) { return false;}
       this.ControledObjects.push(ob);
       this.DefaultAttributes(ob);
       if(enableEvents) {
           this.AttachEvent(ob, 'keypress', __jgWC_DoKeyPress, false);
           this.AttachEvent(ob, 'blur', __jgWC_DoBlur, false);
       }
       return true;
   },

   //agregador de los eventos
   AttachEvent:function(elemento, nombre_evento, funcion, captura) {
     if (elemento.attachEvent){
       elemento.attachEvent('on' + nombre_evento, funcion);
       return true;
     }else
       if (elemento.addEventListener){
         elemento.addEventListener(nombre_evento, funcion, captura);
         return true;
       }else {
         return false;
       }
   },

   //cancela la ultima entrada
   CancelInput:function(ev) {
       if(this.Browser.IE)
       {
           ev.keyCode = 0;
           ev.returnValue = 0;
       }else{
           ev.preventDefault();
           ev.stopPropagation();
       }
   },

   //detiene el burbujeo del evento
   StopBubble:function(ev) {
       if (__jgWC.Browser.IE) {
           ev.cancelBubble = true;
       }else{
           ev.stopPropagation();
       }
   },

   //evaluador de los dígitos ingresados
   EvaluateValue:function(obj, kcASCII, eventType)
   {
       kcASCII = (arguments.length==1) ?'':kcASCII;
       var value = obj.value + kcASCII;
       // excludechar
       var exChar = obj.getAttribute('excludechar');
       if(exChar.length > 0) {
           return ( RegExp('^[^' + exChar + ']*$', 'i').test(value));
       }
       // includeonly
       var inOnly = obj.getAttribute('includecharonly');
       if(inOnly.length > 0) {
           return (RegExp('^[' + inOnly + ']*$', 'i').test(value));
       }
       // todo tipo de caracteres
       if(obj.getAttribute('INPUTTYPE').toUpperCase() == 'ALL') { return true; }

       switch(obj.getAttribute('INPUTTYPE').toUpperCase()) {
           // tipo numerico
           case 'NUMBER':
               return this.NumericValue(obj, value);
               break;
           //tipo fecha
           case 'DATE':
               if(eventType == 'keypress') { return true; }
               return this.DateValue(obj, value);
               break;
           //solo texto
           case 'TEXTONLY':
               return this.TextOnlyValue(obj, value);
               break;
           //solo texto y numeros
           case 'TEXTNUMBER':
               return this.TextNumberValue(obj, value);
               break;
           //texto y algunos caracteres de puntuacion
           case 'ALPHA':
               return this.AlphaValue(obj, value);
               break;
           //texto, numeros y algunos caracteres de puntuacion
           case 'ALPHANUMERIC':
               return this.AlphaNumericValue(obj, value);
               break;
       }
       return true;
   },

   //muestra el mensaje de error establecido si se seteo el permiso para mostrarlo
   ErrorMessage:function(obj) {
       if(obj.getAttribute('blurErrorAlert') == 'true') {
           alert(obj.getAttribute('blurErrorMessage'));
           obj.select();
           obj.focus();
       }
   }
};

//agrega caracteres hispanicos a la expresion regular
__jgWC.addSpanishChars=function(obj, alpha) {
       return (obj.getAttribute('SPANISHCHARS').toLowerCase()=='true')?'áéíóúüñ' + ((alpha)?'¿¡':'') :'';
   }

//agrega simbolos a la expresion regular    
__jgWC.addSimbols=function(obj) {
       return ':\\?\\!\\$%=/*#<>\\+->,;\\(\\)\\.@_';
   }

//testea el valor ALPHANUMERIC
__jgWC.AlphaNumericValue=function(obj, valToTest) {
       var Exp = '^[a-z0-9\s' + this.addSpanishChars(obj, true) + this.addSimbols(obj) + ']*$';
       return RegExp(Exp).test(valToTest.toLowerCase());
   }

//testea el valor ALPHA
__jgWC.AlphaValue=function(obj, valToTest) {
       var Exp = '^[a-z\s' + this.addSpanishChars(obj, true) + this.addSimbols(obj) + ']*$';
       return RegExp(Exp).test(valToTest.toLowerCase());
   }

//testea el valor TEXTNUMBER
__jgWC.TextNumberValue=function(obj, valToTest) {
       var Exp = '^[a-z0-9\s' + this.addSpanishChars(obj, false) + ']*$';
       return RegExp(Exp).test(valToTest.toLowerCase());
   }

//testea el valor TEXTONLY
__jgWC.TextOnlyValue=function(obj, valToTest) {
       var Exp = '^[a-z\s' + this.addSpanishChars(obj) + ']*$';
       return RegExp(Exp).test(valToTest.toLowerCase());
   }

//testea el valor NUMERIC
__jgWC.NumericValue=function(obj, valToTest) {
       var Exp = '^';
       if(obj.getAttribute('positiveonly').toLowerCase()=='false') {
           Exp += '[-]?';
       }
       Exp += '\\d{1,1}\\d*';
       if(Number(obj.getAttribute('decimalplaces')) > 0) {
           Exp += '\\' + obj.getAttribute('decimalpoint') + '?\\d{0,' + obj.getAttribute('decimalplaces') + '}';
       }
       Exp += '$'; 
       return RegExp(Exp).test(valToTest);
   }

//transforma el texto segun el atributo TEXTTRANSFORM
__jgWC.TextTransform=function(obj) {
       switch(obj.getAttribute('TEXTTRANSFORM').toUpperCase()) {
           case "UPPER":
               obj.value = obj.value.toUpperCase();
               break;
           case "LOWER":
               obj.value = obj.value.toLowerCase();
               break;
       }
   }
 

//controla el valor DATE
__jgWC.DateValue=function(obj, valToTest) {
       var expr='^(([0-2]?\\d{1})|([3][0,1]{1}))\/[0,1]?\\d{1}[0-2]\/[1-9]{1}\\d{3}$';
       if( ! RegExp(expr).test(valToTest) ) { return false;};
       var aD = valToTest.split('/');
       var tmp = new Date(aD[2], aD[1]-1, aD[0]);
       if(Number(tmp.getDate()) != Number(aD[0]) || Number(tmp.getMonth()+1) != Number(aD[1]) ||
               Number(tmp.getFullYear()) != Number(aD[2]) ) {
           return false;
       }
       return true;
   }


//controla los objetos indicados en ControledObjects uno por uno
function __jgWC_ControlObjects() {
   var objs = __jgWC.ControledObjects;
   var len = objs.length;
   for(var i=0; i < len; i++) {
       var obj = objs[i];
       if( !__jgWC.EvaluateValue(obj) ) {
           __jgWC.ErrorMessage(obj);
           return false;
       }
   }
   return true;
}


//controla el evento KeyPress
function __jgWC_DoKeyPress(ev) {
   var obj = ev.target||ev.srcElement;
   var KC = ev.which||ev.keyCode;
   var kcASCII = String.fromCharCode(KC);
   var noChar = ev.keyCode;
   __jgWC.StopBubble(ev);
   if(__jgWC.Browser.IE) {
       if (document.selection.type == 'Text')    {
           var tr = document.selection.createRange();
           tr.text = '';
       }
   }else {
       if(obj.selectionStart < obj.selectionEnd) {
           if(String(noChar).search('37|39') == -1) {
               try {
                   window.getSelection().collapseToStart()
               }catch(ex){ }
           }
       }
   }
   if( ev.ctrlKey || ev.altKey ) {
       if(kcASCII.search('V|v|C|c|X|x') > -1) {
           return true;
       }
       __jgWC.CancelInput(ev);
       return false;
   }

   // backspace|tab|enter|Alt-flecha izq|Alt fecha der.
   if(String(noChar).search('8|9|13|37|39') > -1) {return true;}
   //evaluate
   if( !__jgWC.EvaluateValue(obj, kcASCII, ev.type) ) {
       __jgWC.CancelInput(ev);
       return false;
   }
}


//controla el evento blur
function __jgWC_DoBlur(ev) {
   var obj = ev.target||ev.srcElement;
   //evaluate
   if( !__jgWC.EvaluateValue(obj) ) {
       __jgWC.ErrorMessage(obj);
       return false;
   }
   __jgWC.TextTransform(obj);
   return true;
}

Las propiedades que acepta cada INPUT son:

  • INPUTTYPE: indica que tipo de dato hay que controlar: NUMERIC, DATE, TEXTONLY, TEXTNUMBER, ALPHA, ALPHANUMERIC, ALL.
  • TEXTTRANSFORM: acepta los valores UPPER, LOWER o NONE, para indicar si se debe transformar el texto a mayúsculas, minúsculas o sin cambios, respectivamente.
  • POSITIVEONLY: funciona en combinación con NUMERIC y acepta el valor TRUE o FALSE. Indica si el valor númerico será solo positivo o no.
  • DECIMALPOINT: funciona en combinación con NUMERIC, para establecer el punto decimal que se ha de aceptar. Por omisión se acepta el punto.
  • DECIMALPLACES: funciona en combinación con NUMERIC y determina el número de decimales que se haceptarán. Por omisión se aceptan 2.
  • EXCLUDECHAR: acepta una lista de caracteres que no serán aceptados en la entrada de datos.
  • INCLUDECHARONLY: acepta una lista de caracteres que serán los únicos aceptados.
  • SPANISHCHARS: acepta el valor TRUE o FALSE e indica si se han de aceptar los caracters españoles áéíóúñ en la entrada de datos.
  • VALMIN: funciona en combinación con NUMERIC y establece el valor mínimo que se ha de aceptar.

0 Comentarios: