Foros del Web » Programando para Internet » Javascript »

Simplificar la funcion

Estas en el tema de Simplificar la funcion en el foro de Javascript en Foros del Web. Hola amigos, Tengo esta funcion en ajax que me verifica el llenado de los objetos dentro de la pagina, son una lista listas y dos ...
  #1 (permalink)  
Antiguo 11/06/2014, 06:40
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 1 mes
Puntos: 36
Simplificar la funcion

Hola amigos,

Tengo esta funcion en ajax que me verifica el llenado de los objetos dentro de la pagina, son una lista listas y dos cajas de textos, y al dar al boton enviar si existe alguno sin contenido los marca con el borde en rojo, como solo eran tres elementos, lo hice de esta forma.
Ahora se requiere incorporar muchos mas datos (apellidos, sexo, direcciones, etc...) serian casi 20 objetos, entre listas, cajas de textos, botones de opcion y hasta checkbox.

Mi pregunta puedo simplificar la validacion de los objetos para que cuando existan los obligatorios (por que no todos son obligatorios) vacios me los marque en rojo?, como ya dije van a existir como tres o cuatro que no son obligatorios. Y no tener que tener uno por uno como les muestro abajo?


Código Javascript:
Ver original
  1. function update() {
  2.  
  3. vacio = "1px #F00 solid";
  4. campovacio = 0;
  5.  
  6.  
  7. if(document.getElementById("obj_departamento").value == ""){
  8.     document.getElementById("obj_departamento").style.border = vacio;
  9.     campovacio=campovacio+1;
  10.     }else{ document.getElementById("obj_departamento").style.border = ""; }
  11.    
  12. if(document.getElementById("obj_nombre").value == ""){
  13.     document.getElementById("obj_nombre").style.border = vacio;
  14.     campovacio=campovacio+1;
  15.     }else{ document.getElementById("obj_nombre").style.border = ""; }
  16.    
  17. if(document.getElementById("obj_ci").value == ""){
  18.     document.getElementById("obj_ci").style.border = vacio;
  19.     campovacio=campovacio+1;
  20.     }else{ document.getElementById("obj_ci").style.border = ""; }
  21.  
  22.  
  23. if(campovacio != 0){
  24.     alert ("Los campos señalados en rojo son de caracter obligatorio."); return;
  25. }
  26.  
  27. ........... continua el proceso del fichero ajax ....
  28.  
  29.     ajax = objetoAjax();
  30.     ajax.open("POST", "updates.php");
  31.  
  32.                    .........
  33.  
  34. }

Saludos y gracias...
  #2 (permalink)  
Antiguo 11/06/2014, 07:30
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Simplificar la funcion

a aquellos controles que no pueden estar vacíos, añádele un class. es recomendable que el selector exista en el css, así que asignale alguna propiedad que no afecte estéticamente al control.
por otro lado, y esta es la parte javascript, usa querySelectorAll() para obtener la colección de elementos, recorres la colección y validas si el control está o no está vacío
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #3 (permalink)  
Antiguo 11/06/2014, 07:41
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 1 mes
Puntos: 36
Respuesta: Simplificar la funcion

Cita:
Iniciado por IsaBelM Ver Mensaje
a aquellos controles que no pueden estar vacíos, añádele un class. es recomendable que el selector exista en el css, así que asignale alguna propiedad que no afecte estéticamente al control....
No entiendo esta parte. Me puedes ayudar un poco.
Gracias!!!
  #4 (permalink)  
Antiguo 11/06/2014, 07:49
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Simplificar la funcion

algo así

Cita:
<input type="text" ........ class="no_vacio" />
<input type="text" ..................................../> <!-- puede estar vacio ->

.no_vacio {
propiedad : valor;
}
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 11/06/2014, 07:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Simplificar la funcion

Trata de evitar hacer esto:

Código Javascript:
Ver original
  1. if(document.getElementById("obj_nombre").value == ""){
  2.     document.getElementById("obj_nombre").style.border = vacio;
  3.     campovacio=campovacio+1;
  4.     }else{ document.getElementById("obj_nombre").style.border = ""; }

Es muy ineficiente recorrer el DOM para extraer lo mismo una y otra vez! .... es mejor asi:

Código Javascript:
Ver original
  1. obj = document.getElementById("obj_nombre");
  2. if(obj.value == ""){
  3.     obj.style.border = vacio;
  4.     campovacio++;
  5. }else
  6.     obj.style.border = "";
__________________
Salu2!
  #6 (permalink)  
Antiguo 11/06/2014, 08:12
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 1 mes
Puntos: 36
Respuesta: Simplificar la funcion

Gracias "Italico76"

Tienes alguna idea de como implementar esto para 18 elementos que son obligatorios sin tener que repetir lo mismo para cada uno, teniendo en cuenta que habran de 3 a 5 objetos que no seran obligatorios.
  #7 (permalink)  
Antiguo 11/06/2014, 08:26
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Simplificar la funcion

Algo asi:

Código Javascript:
Ver original
  1. <div id="obj_nombre" value="dd">A</div>
  2. <div id="obj_departamento" value="">B</div>
  3. <div id="obj_ci" value="">C</div>
  4.  
  5. <script>
  6. vacio = "1px #F00 solid";
  7. // ...
  8.  
  9. var campovacio=0;
  10. var objetos = new Array;
  11. var objetos = ["nombre","departamento","ci"];
  12.  
  13. for (var i=0;i<objetos.length;i++)
  14. {
  15.     var obj = document.getElementById("obj_"+objetos[i]);  
  16.     if (obj.getAttribute('value') == "undefined" || obj.getAttribute('value') == "")
  17.     {      
  18.         obj.style.border = vacio;
  19.         campovacio++;
  20.     }else
  21.         obj.style.border = "";
  22. }    
  23.  
  24. </script>

Si son requeridos... yo les pondria el atribute "required" ...

A proposito... para los SELECT OPTIONS... hice algo:

Código Javascript:
Ver original
  1. <!--
  2.     Validar si los SELECT..OPTIONs tienen opciones seleccionadas
  3.     es una implementacion de required
  4.    
  5.     Si hay una primera opcion del tipo "Seleccione su ciudad",etc
  6.     debe llevar la clase 'ignored'
  7.  
  8. -->
  9.  
  10. <script>
  11. /*
  12.     @author Pablo Bozzolo
  13.     @param null
  14.     @return boolean
  15. */
  16. function selectRequiredValidate()
  17. {
  18.     selects = document.getElementsByTagName('SELECT');
  19.    
  20.     selected=0;
  21.     required_selects = 0;
  22.     for (var k=0;k<selects.length;k++)
  23.     {      
  24.         sel = selects[k];
  25.         if (sel.getAttribute('class')=='required')
  26.         {
  27.             required_selects++;
  28.             this_selected=false;
  29.             for (ix=0;ix<sel.length;ix++)      
  30.             {              
  31.                 option = sel[ix];                                              
  32.                     if ((option.selected) && (option.getAttribute('class')!='ignored'))
  33.                         this_selected=true;
  34.                        
  35.             }  
  36.            
  37.             if (this_selected) 
  38.                 selected++;
  39.         }                  
  40.     }
  41.    
  42.     return (selected==required_selects);               
  43. }  
  44.  
  45. </script>
  46.  
  47.     <input type="text" name="nombres" value="Juan" class="required"/><p/>
  48.  
  49.     <select name="departamento[]" class="required" >
  50.         <option value="" class="ignored">Selecciona depto</option">
  51.         <option value="Bogota DC">Bogota DC</option">
  52.         <option value="Antioquia">Antioquia</option">
  53.         <option value="Caldas" selected>Caldas </option">
  54.         <option value="Quindio" >Quindio</option">  
  55.     </select>
  56.    
  57.     <label>Inquietudes medio-ambientales:</label><p/>
  58.     <!-- SELECT...OPTIONs -->  
  59.     <select name="departamento[]" multiple class="required">
  60.         <option value="" class="ignored">Selecciona</option">
  61.         <option value="Hg" selected="selected">Mercurio en las aguas</option">
  62.         <option value="CO2">Emision de CO2</option">
  63.         <option value="deforestacion" selected="selected">Deforestacion</option">
  64.         <option value="otras" selected="selected">Otras</option">  
  65.     </select>
  66.     <p/>  
  67.    
  68. <script>   
  69.     console.log(selectRequiredValidate());
  70. </script>
__________________
Salu2!

Última edición por Italico76; 11/06/2014 a las 09:10
  #8 (permalink)  
Antiguo 11/06/2014, 09:38
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 16 años, 1 mes
Puntos: 36
Respuesta: Simplificar la funcion

Seria igual para el manejo de los checkbox y grupo de opciones, que el que aplicastes para los select options?

Gracias por el aporte, lo estoy probando y funciona perfecto.
Ahora se lo aplicare al los options.

Última edición por alexisverano; 11/06/2014 a las 09:44
  #9 (permalink)  
Antiguo 11/06/2014, 09:45
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Simplificar la funcion

A esos 18 elementos, añádeles una clase en particular, por ejemplo:

Código HTML:
Ver original
  1. <input type = "text" name = "foo" class = "requerido" />

Luego, solo es cuestión de que tomes al conjunto de elementos que poseen dicha clase y los valides:

Código Javascript:
Ver original
  1. var formulario = document.getElementById("id_formulario"),
  2.     requeridos = formulario.getElementsByClassName("requerido"),
  3.     total = requeridos.length;
  4.  
  5. formulario.addEventListener("submit", function(event){
  6.     event.preventDefault();
  7.  
  8.     var enviar = true;
  9.  
  10.     for (var i = 0; i < total; i++)
  11.         if (!requeridos[i].value.length){
  12.             alert ("Debe completar el campo " + requeridos[i].name);
  13.             requeridos[i].focus();
  14.             enviar = false;
  15.             break;
  16.         }
  17.  
  18.     if (enviar) this.submit();
  19. }, false);

Cuando se produzca el evento submit, es decir, cuando envíes los datos del formulario para procesarse, cancelas dicho evento con el método preventDefault, tomas a los elementos del formulario con la clase requerido, calculas el total de estos y declaras una variable que utilizarás como comodín para determinar si enviarás o no los datos para su procesamiento, iniciando esta variable con el valor booleano true. Enseguida, iteras el conjunto de elementos requeridos y si alguno de ellos no tuviera contenido, muestras una alerta indicándole al usuario que debe completar el campo en cuestión, le das el enfoque, cambias el valor del comodín a false y sales del bucle. Finalmente, evalúas el valor del comodín, si sigue siendo true, es decir, si no se encontraron elementos sin completas, envías los datos a procesarse.

También puedes hacerlo de una manera más corta:

Código Javascript:
Ver original
  1. var formulario = document.getElementById("id_formulario"),
  2.     requeridos = formulario.getElementsByClassName("requerido"),
  3.     map = Array.prototype.map;
  4.  
  5. formulario.addEventListener("submit", function(event){
  6.     event.preventDefault();
  7.  
  8.     var enviar = map.call(requeridos, function(elemento){
  9.         return elemento.value.length;
  10.     }).indexOf(0);
  11.  
  12.     if (enviar == -1) this.submit();
  13. }, false);

En este caso, creas un array con la longitud de los valores de cada campo, a los cuales iteras con el método Array.prototype.map que es el equivalente de map() en PHP y al igual que dicha función, aplica una llamada de retorno a cada elemento del array en cuestión que en este caso es el conjunto de elementos requeridos. Luego, con el método indexOf buscas en el array resultante el valor 0 para saber así si algún elemento no tiene contenido. Finalmente, evalúas el resultado de lo anterior, si es igual a -1, es decir, si no se encontraron coincidencias, lo cual indica que todos los campos se completaron, envías los datos a procesarse.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 11/06/2014 a las 09:51 Razón: Optimización
  #10 (permalink)  
Antiguo 11/06/2014, 10:16
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Simplificar la funcion

Tiene razon @Alexis88 ... cometi el error de querer "enmendar" tu codigo pero NO ES LA FORMA!


La forma correcta es con una clase del tipo "required" que ademas sera compatible con el codigo que te pase para los SELECT..OPTIONS
__________________
Salu2!
  #11 (permalink)  
Antiguo 11/06/2014, 10:37
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Simplificar la funcion

Para el tema de los bordes, puedes hacerlo como indico en esta respuesta, sin embargo, con HTML5 y CSS3 puedes realizar este proceso. A los campos, añádeles el atributo required y en la hoja de estilos, crea la pseudo-clase :invalid, la cual se encargará de añadir el color del borde. Lee la documentación de esta pseudo-clase, la cual se encuentra en el enlace adjunto, tiene ejemplos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #12 (permalink)  
Antiguo 11/06/2014, 12:56
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Simplificar la funcion

lo que referí, con la salvedad de usar map(), :required y :invalid por aquello del crossbrowser
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #13 (permalink)  
Antiguo 11/06/2014, 13:03
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Simplificar la funcion

Cita:
Iniciado por IsaBelM Ver Mensaje
lo que referí, con la salvedad de usar map(), :required y :invalid por aquello del crossbrowser
Por eso dije esto:

Cita:
Iniciado por Alexis88 Ver Mensaje
sin embargo, con HTML5 y CSS3...
Y claro, el problema con algunos de los nuevos métodos es que no son soportados en navegadores viejos, por lo que en esos caso hay que echar mano de bucles tradicionales y cambios de estilos de manera manual, pero creo que hay que ir apuntando al estándar actual y a que los usuarios se actualicen, porque aunque sea algo importante, no veo mucho futuro a la creación de aplicaciones pensando en que el usuario siga con IE6 u 8.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #14 (permalink)  
Antiguo 11/06/2014, 13:13
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Simplificar la funcion

alexis, esta es una discusión que se ha mantenido en este foro infinidad de ocasiones. y siempre se ha llegado a la disyuntiva; uso los nuevos estandares y añado polyfil o uso los estadares antiguos?? mi opinión es que aún hoy en día, por desgracia, hay que tener en cuenta a ie8
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #15 (permalink)  
Antiguo 11/06/2014, 13:17
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Simplificar la funcion

Y en otros foros también , pero es una opinión personal, a pesar de que yo también sigo elaborando aplicaciones pensadas hasta en IE6, igual, creo que esta forma de trabajo debe de cambiar y se debe instar a los usuarios a actualizar sus navegadores, en la medida de lo posible.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #16 (permalink)  
Antiguo 11/06/2014, 13:48
Avatar de jp91  
Fecha de Ingreso: mayo-2014
Mensajes: 94
Antigüedad: 10 años, 6 meses
Puntos: 11
Respuesta: Simplificar la funcion

En cierta medida @Alexis88 tiene razon las nuevas generaciones traen cosas interesantes pero tal como dice @IsabelM por desgracia no hay opcion en este trabajo el cliente tiene la razon y si un sponsor quiere que funcione en un navegador tipo dinosaurio pues toca jejejejej. Todo es un equilibrio amigos :)
__________________
OOoo Como hacer ooOO
juegos con Html5.

Etiquetas: ajax, funcion, php, simplificar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:33.