Foros del Web » Programando para Internet » Javascript »

funcion tabular

Estas en el tema de funcion tabular en el foro de Javascript en Foros del Web. hola a todos no se si me podrían ayudar con una consulta tengo un formulario para captura con mas de 3000 campos para llenar, y ...
  #1 (permalink)  
Antiguo 21/01/2011, 16:42
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
funcion tabular

hola a todos

no se si me podrían ayudar con una consulta tengo un formulario para captura con mas de 3000 campos para llenar, y tengo un problema con una función que hace que pase automáticamente al siguiente campo pero el problema es que se tarda mucho tiempo para pasar y la verdad no se que hacer para hacerla mas rapida esta es mi función

Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. function mostrarTab(obj) {
  3.     rolling=obj.scrollTop;
  4.     if(typeof obj.selectionStart == 'number') {
  5.         // Resto de navegadores
  6.         var start = obj.selectionStart;
  7.         var end = obj.selectionEnd;
  8.         obj.value = obj.value.substring(0, start)+"\t";
  9.         obj.value+= obj.value.substring(start, obj.value.length);
  10.         obj.focus();
  11.         obj.selectionStart =  obj.selectionEnd= end + 2;
  12.     }
  13.     else if(document.selection) {
  14.         // Internet Explorer
  15.         obj.focus();
  16.         var range = document.selection.createRange();
  17.         if(range.parentElement() != obj) return false;
  18.         if (range.text != "") {
  19.             if(typeof range.text == 'string'){
  20.                 document.selection.createRange().text ="\t"+range.text;
  21.             }
  22.             else obj.value += "\t";
  23.         }
  24.         else
  25.             obj.value += "\t";
  26.     }
  27.     obj.scrollTop=rolling;
  28. }
  29.  
  30.  
  31.  
  32. function tabulador(form,field)
  33. {
  34. var next=0, found=false
  35. var f=form
  36. //if(event.keyCode!=13) return;
  37. for(var i=0;i<f.length;i++) {
  38.     if(field.name==f.item(i).name){
  39.         next=i+1;
  40.         found=true
  41.         break;
  42.     }
  43. }
  44. //MODIFICACION A LA FUNCION &&  f.item(next).style.display!='none'
  45. while(found){
  46.     if( f.item(next).disabled==false &&  f.item(next).type!='hidden' &&  f.item(next).style.display!='none'){
  47.         f.item(next).focus();
  48.         break;
  49.     }
  50.     else{
  51.         if(next<f.length-1)
  52.             next=next+1;
  53.         else
  54.             break;
  55.     }
  56. }
  57. }
  58. </script>

de antemano les doy las gracias y ojala halla una solución para este problema que tengan una buena tarde

Saludos
  #2 (permalink)  
Antiguo 21/01/2011, 17:30
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

para que corra mas rapido, de acuerdo a mi experiencia

primero hacer una funcion que recorra los campo para llenar y generar un array de datos. Esto va a demorar lo mismo que se te demora, pero solo en el inicio. Por ejemplo (esta hecho a la rapida)

Código Javascript:
Ver original
  1. var arrayelementos=new Array()
  2. var contador=0;
  3.  
  4. elementos=document.forms[0]
  5. for(i=0;i<elementos.length;i++){
  6. //AQUI VALIDAS LOS DISABLED, READONLY, BUTTON, SUBMIT, ETC
  7. arrayelementos[contador]=elementos.elements[i];
  8. contador++;
  9. }

Luego de eso le asignas valores a los eventos onkeydown y de acuerdo al indice del array te posicionas uno mas adelante, hasta llegar al ultimo, le puedes agregar tambien que se devuelva o comienze de cero al llegar al ultimo.

La idea es que te trabaje con el array de objetos identificados y no los recorra una y otra vez, sino que despues de ello compare con array que es mas rapido

salu2 y que te vaya bien
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip

Última edición por Perr0; 21/01/2011 a las 17:44
  #3 (permalink)  
Antiguo 21/01/2011, 22:01
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: funcion tabular

te doy las gracias pero la verdad soy novato en todo esto si me podrias explicar por que nunca he utilizado los array

de antemano te voy las gracias buena noche
  #4 (permalink)  
Antiguo 24/01/2011, 08:15
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

PROBADO EN IE 7 - IE 8 - FF - OPERA - CHROME

NOTA: funciona en todos bien, salvo que en opera al dejar el enter apretado no tabula automaticamente, sino que hay que presionar para avanzar uno a uno y los checkbox me los marca automaticamente (el resto de los navegadores lo hace con la SPACEBAR)...me dio lata seguir agrandando el codigo, ademas no me gusta opera.


que tal, te hice una demo para que la veas como funciona

se demora en cargar los elementos (3 seg aprox.) pero despues va como avion

http://perr0.netii.net/exs/tabulador/

se le pueden agregar opciones como para que se salte ciertos elementos para que no los tomes y cosas asi.

le puse un efecto de color para que sepas donde esta posicionado

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip

Última edición por Perr0; 24/01/2011 a las 08:24
  #5 (permalink)  
Antiguo 24/01/2011, 10:30
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: funcion tabular

ok ya cheque el ejemplo esta muy bien, pero si quiero que cuando llegue al máximo del campo me pase sin apretar enter ni tab como le puedo hacer ?????

de antemano te doy las gracias por toda tu ayuda, buen dia
  #6 (permalink)  
Antiguo 24/01/2011, 10:50
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

Cita:
Iniciado por mexbale Ver Mensaje
ok ya cheque el ejemplo esta muy bien, pero si quiero que cuando llegue al máximo del campo me pase sin apretar enter ni tab como le puedo hacer ?????

de antemano te doy las gracias por toda tu ayuda, buen dia
la manera mas simple es atacar aca

antiguo
Código Javascript:
Ver original
  1. if(a<arrayelementos.length-1){
  2.     newfoco=arrayelementos[a+1];
  3.     newfoco.focus();
  4. }else{
  5.     newfoco=arrayelementos[0];
  6.     newfoco.focus();
  7. }

nuevo
Código Javascript:
Ver original
  1. if(a<arrayelementos.length-1){
  2.     newfoco=arrayelementos[a+1];
  3.     newfoco.focus();
  4. }else{
  5.     //FUNCION A EJECUTAR
  6.     funcionfinaltab();
  7. }
  8.  
  9. funcionfinaltab(){
  10.       //accion que planeas hacer, como un submit, etc...
  11. }


salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #7 (permalink)  
Antiguo 24/01/2011, 11:16
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

nueva version
achique el codigo, le quite el evento onclick agragado por un onblur y onfocus para no recorrer tanto el array, esta donde mismo (http://perr0.netii.net/exs/tabulador/), solo que hay que recargar la página nuevamante.

ahora el foco va con clase en vez de estilos y le puedes dar el que tu quieras
eso y suerte

http://perr0.netii.net/exs/tabulador/

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #8 (permalink)  
Antiguo 24/01/2011, 11:34
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: funcion tabular

ya no comprendí el ejemplo, lo que necesito es si tengo muchos campos con capacidad de 2 números y cuando tecleen los dos números que me salte automáticamente al otro campo lo que dices es que nada mas modifique lo que me pusiste en el primer comentario pero lo que no comprendo es donde dice funcionfinaltab()

hay tengo que tener otra función o como ?????

de antemano te voy las gracias buen dia
  #9 (permalink)  
Antiguo 24/01/2011, 12:05
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

lo que coloque anteriormente es para que al llegar al final de los elementos, vaya a una funcion de cualquier nombre (q invente)...pasa una de dos cosas, o no te explicas bien o tengo mi comprension mal...ahora entendi que quieres.

mira te dejo un código y trata de estudiarlo, por mi parte me desconecto hasta nuevo aviso.


http://perr0.netii.net/exs/tabulador...;20ejemplo.htm

todo va en el maxlength que le coloques para que se salte al siguiente



salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #10 (permalink)  
Antiguo 24/01/2011, 13:22
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: funcion tabular

Hola

O algo mas sencillo
Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. function tabular(evt, obj, tam) {
  5. tecla=(evt) ? evt.keyCode : evt.charCode;
  6. if(tecla==8) { return; }
  7. var frm=obj.form;
  8. var largo = obj.value.length;
  9. if (largo == tam) {
  10.     for(i=0;i<frm.elements.length;i++) {
  11.         if(frm.elements[i]==obj) {
  12.             if (i==frm.elements.length-1) { i=-1; }
  13.     break;
  14.         }
  15.     }
  16.  
  17. frm.elements[i+1].focus();
  18. return false;
  19.  
  20. }
  21. }
  22. </script>
  23. </head>
  24. <body>
  25. <form>
  26. <input type="text" maxlength="2" onkeypress="return tabular(event, this, this.maxLength)" />
  27. <input type="text" maxlength="2" onkeypress="return tabular(event, this, this.maxLength)" />
  28. <input type="text" maxlength="3" onkeypress="return tabular(event, this, this.maxLength)" />
  29. <input type="text" maxlength="4" onkeypress="return tabular(event, this, this.maxLength)" />
  30. </form>
  31. </body>
  32. </html>
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #11 (permalink)  
Antiguo 24/01/2011, 13:47
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

Adler, lo que pasa es que si hace ese recorrido para 3000 textbox, se pone muy lento en cada enter, o caracter que ingrese, por ello los arrays.

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #12 (permalink)  
Antiguo 24/01/2011, 14:11
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: funcion tabular

hola perr0 una pregunta ya estudie la función que me pusiste pero tengo estas dos funciones mas para validar los campos

Código Javascript:
Ver original
  1. <script language="JavaScript" type="text/javascript">
  2. function activaEstado(iden) //funcion para activar los campos
  3. {
  4. var elhtml2 = document.getElementById(iden);
  5. var elhtml = iden;
  6. if(elhtml2.style.display == 'none'){
  7. elhtml2.style.display = 'block';}
  8. else {elhtml2.style.display = 'block';}
  9. }
  10. </script>
  11. <script language="JavaScript" type="text/javascript">
  12. function desactivaEstado(iden) //funcion para desactivar los campos
  13. {
  14. var elhtml2 = document.getElementById(iden);
  15. var elhtml = iden;
  16.  
  17. elhtml2.style.display = 'none';
  18. elhtml2.value="";
  19. }
  20. </script>

que me oculta cuando no tiene que pasar al campo que sigue y entonces me manda un error

de antemano te doy las gracias y espero que me puedas ayudar con esta duda

buena tarde
  #13 (permalink)  
Antiguo 24/01/2011, 14:36
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: funcion tabular

mexbale, que tal

mira, esa función que te envie se ejecuta postcarga de la página, si por algun motivo haces desaparacer algun textbox cambiando el display tambien desabilitalo y en caso contrario habilitalo, asi:

Código Javascript:
Ver original
  1. if(elhtml2.style.display == 'none')
  2. {
  3. elhtml2.style.display = 'block';
  4. elhtml2.disabled = false;
  5. }else {
  6. elhtml2.style.display = 'block';
  7. elhtml2.disabled = true;
  8. }
  9.  
  10. //al final ejecutas la funcion
  11. carga()

cuando ejecutes la funcion carga() nuevamente, ésta te leera todos los array y si antes habian 400 y ocultaste uno ahora habran 399...osea tienes que aplicarle ante alguna modificacion de un textbox

la funcion carga() la agrege hace poco, la ves en el segundo ejemplo que actualizé ahora
http://perr0.netii.net/exs/tabulador...;20ejemplo.htm


salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #14 (permalink)  
Antiguo 24/01/2011, 15:16
Avatar de mexbale  
Fecha de Ingreso: septiembre-2010
Ubicación: Iztapalapa
Mensajes: 146
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: funcion tabular

a ok entonces tendría que buscar otra opción por que los campos que oculto están es constante movimiento todo depende de la forma que llenen el formulario, otra opción que puedas tener

de antemano te doy las gracias por toda tu ayuda eres muy amable

que tengas una buena tarde suerte
  #15 (permalink)  
Antiguo 29/01/2011, 16:55
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: funcion tabular

Hola
Cita:
Iniciado por Perr0 Ver Mensaje
Adler, lo que pasa es que si hace ese recorrido para 3000 textbox, se pone muy lento en cada enter, o caracter que ingrese, por ello los arrays.

salu2
No es mi intención polemizar, pero no estoy tan seguro que el proceso fuese mas lento, aunque sean 3000 campos. A ver si mañana tengo tiempo y monto algo
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #16 (permalink)  
Antiguo 03/02/2011, 06:54
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: funcion tabular

Hola

Me he tardado mas, pero como lo dicho es deuda
Código Javascript:
Ver original
  1. window.onload = function() {
  2. var frm=document.form1;
  3. for(var i=0,elementos=frm.elements;i<elementos.length;i++)
  4. Evento(elementos[i], 'keydown', function(event){tabular(event, this);});
  5. }
  6.  
  7.  
  8. function Evento(elemento,nomevento,funcion) {
  9.     if (elemento.attachEvent) {
  10.         var fnc=function(){
  11.             funcion.call(elemento,window.event);
  12.         }
  13.         elemento.attachEvent('on'+nomevento,fnc);
  14.         return true;
  15.     }
  16.     else  
  17.         if (elemento.addEventListener) {
  18.         elemento.addEventListener(nomevento,funcion,false);
  19.         return true;
  20.         }
  21.         else
  22.         return false;
  23. }
  24.  
  25.  
  26.  
  27. var inicio;
  28. function tabular(evt, obj) {
  29. inicio = new Date();
  30. tecla = (evt) ? evt.keyCode : evt.which;
  31.  
  32.     if(tecla==8) return;
  33.     else if (tecla==13) tabulaEnter(evt, obj);
  34.     else tabulaLength(evt, obj);
  35. }
  36.  
  37.  
  38.  
  39.  
  40. function tabulaEnter(evt, obj) {
  41. for(var j=0, elementos=document.form1.elements;j<elementos.length;j++)
  42.  
  43.     if (elementos[j] == obj) {
  44.         if (j == elementos.length-2) j =-1;
  45.         break;
  46.     }
  47.  
  48. /*el campos está disabled o hidden*/
  49.     if ((elementos[j+1].disabled ==true) || (elementos[j+1].type=='hidden'))
  50.                     tabulaEnter(evt,elementos[j+1]);
  51.  
  52. /*el campo es readOnly */
  53.                 else if  (elementos[j+1].readOnly == true )  
  54.                     tabulaEnter(evt,elementos[j+1]);
  55.  
  56.                 else
  57.         elementos[j+1].focus();
  58. var final = new Date();
  59. alert('ha tardado: ' +parseInt(final-inicio))
  60.                     return false;
  61. }
  62.  
  63.  
  64.  
  65. function tabulaLength(evt, obj) {
  66. if (obj.value.length == obj.maxLength) {
  67. tabulaEnter(evt, obj);
  68. }
  69. }
lo puedes probar con el HTML de 300 campos que creastes
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: funcion, tabular
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 06:15.