Foros del Web » Programando para Internet » Javascript »

Problema con eventos en la creación de inputs dinámicos

Estas en el tema de Problema con eventos en la creación de inputs dinámicos en el foro de Javascript en Foros del Web. Buenas tardes: Tengo este código que me permite adicionar campos input de manera dinámica Cita: <script type="text/javascript"> icremento =0; function crear(obj) { icremento++; field = ...
  #1 (permalink)  
Antiguo 09/02/2013, 13:13
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 8 meses
Puntos: 10
Problema con eventos en la creación de inputs dinámicos

Buenas tardes:
Tengo este código que me permite adicionar campos input de manera dinámica

Cita:
<script type="text/javascript">
icremento =0;
function crear(obj)
{
icremento++;

field = document.getElementById('field');
contenedor = document.createElement('div');
contenedor.id = 'div'+icremento;
field.appendChild(contenedor);

boton = document.createElement('input');
boton.type = 'text';
boton.name = 'text'+'[]';
boton.style.border = "1px solid white";
boton.style.background = "#4F6497";
boton.style.color = "white";
boton.style.font = "x-small Arial";
boton.onfocus = function () {estilo(this.id,1)}
boton.onblur = function () {estilo(this.id,2)}
boton.onchange = function () {formato(this.value,'dec',this.id)}
boton.onkeypress = function () {return acceptNum2(event,this.id)}
contenedor.appendChild(boton);

}
Y para llamar esta función hago esto

Cita:
<fieldset id="field" style="overflow: auto; height:70px; border:0px;"></fieldset>

<input type="button" value="Crear caja de texto" onclick="crear(this)" class="botones">


Sin embargo, las que están en negrita no funcionan. El código de esas 3 funciones es el siguiente

Cita:
function estilo(campo,n)
{
if(n==1)
{document.getElementById(campo).className="texto_n ormal_focus";}
else
{document.getElementById(campo).className="texto_n ormal";}
}

var nav4 = window.Event ? true : false;
function acceptNum2(evt,campo) //Sólo números y SÓLO 1 punto decimal
{
// Punto = 46
// Backspace = 8, Enter = 13, '0' = 48, '9' = 57
var key = nav4 ? evt.which : evt.keyCode;
cadena=document.getElementById(campo).value;
if(cadena.indexOf('.')==-1)
{return (key <= 13 || (key >= 48 && key <= 57) || key == 46);}
else
{return (key <= 13 || (key >= 48 && key <= 57));}

}
Estas 3 funciones funcionan muy bien cuando se trata de inputs clásico como este

Cita:
<input type="text" name="peso" id="peso" size="2" maxlength="5" class="texto_normal"
onFocus="estilo(this.id,1);" onBlur="estilo(this.id,2);" onKeyDown="miTabIndex(event,this.id,5);" tabindex="3"
onKeyPress="return acceptNum2(event,this.id);" onChange="formato(this.value,'dec',this.id)">
Lo que necesito es poder crear varios de estos inputs de manera dinámica y a requerimiento del usuario.

¿Alguien sabe por que con los eventos onfocus, onblur y onkeypress no se ejecutan las funciones?

Un saludo desde Lima, Perú
  #2 (permalink)  
Antiguo 09/02/2013, 14:21
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Problema con eventos en la creación de inputs dinámicos

El problema basicamente es que ese this.id que pasás en las funciones no existe, poruqe se refiere al id del elemento (input) creado

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <script type="text/javascript">
  8. //<![CDATA[
  9. var icremento =0;
  10. function crear(obj)
  11. {
  12. icremento++;
  13.  
  14. field = document.getElementById('field');
  15. contenedor = document.createElement('div');
  16. contenedor.id = 'div'+icremento;
  17. field.appendChild(contenedor);
  18.  
  19. boton = document.createElement('input');
  20. boton.type = 'text';
  21. boton.name = 'text'+'[]';
  22. boton.style.border = "1px solid white";
  23. boton.style.background = "#4F6497";
  24. boton.style.color = "white";
  25. boton.style.font = "x-small Arial";
  26. boton.id = "xxxxxxx_" + icremento;
  27. boton.onfocus = function () {estilo(this.id,'focus')};
  28. boton.onblur = function () {estilo(this.id,'blur')};
  29. //boton.onchange = function () {estilo(this.id,'change')};
  30. boton.onkeypress = function () {estilo(this.id,'keypress')};
  31. contenedor.appendChild(boton);
  32.  
  33. }
  34.  
  35. function estilo(a,b){
  36. document.getElementById('evento').innerHTML = a + '-' + b;
  37. }
  38. //]]>
  39. </head>
  40. <fieldset id="field" style="overflow: auto; height:70px; border:0px;"></fieldset>
  41.  
  42. <input type="button" value="Crear caja de texto" onclick="crear(this)" class="botones"><br />
  43. <div id="evento">
  44. </div>
  45. </body>
  46. </html>

fijate que previo a agregar los eventos definí
boton.id = "xxxxxxx_" + icremento;
el evento onchange, se va a sobreescribir con blur y focus asi no se si se justifica, menos si hay un keypress, pero bueno, ese es otro tema, ahora por lo menos los eventos deberían funcionarte

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 09/02/2013, 14:37
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 8 meses
Puntos: 10
Respuesta: Problema con eventos en la creación de inputs dinámicos

Muchas gracias por la respuesta.
Ingresé esta línea

Cita:
boton.name = 'text'+'[]';
boton.id = 'text'+'[]';
para que tanto name y id tengan el mismo nombre, y con eso logré hacer funcionar el evento onkeypress que era el más importante porque es el que me permite filtrar el ingreso sólo de números y 1 punto decimal.

No te he comprendido eso de

boton.id = "xxxxxxxx_" + incremento;

¿Podrías explicarme un poco más?

Muchas gracias por tu apoyo

Un saludo desde Lima, Perú
  #4 (permalink)  
Antiguo 09/02/2013, 15:30
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Problema con eventos en la creación de inputs dinámicos

los nombres de id de un elemento DEBEN ser únicos y no comenzar por un número, por lo tanto cambaindo el incremento no lo serían en caso de crear multiples inputs, cosa que por otra parte sería lo más logico si estas defineindo el name como un array name[].
en tu caso tambien hacer name="text[]" id="text[] tambien es un error, porque el id no puede contener [].

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 10/02/2013, 12:07
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 8 meses
Puntos: 10
Respuesta: Problema con eventos en la creación de inputs dinámicos

Sorry la demora en responder.
Modifiqué el código de esta forma

Cita:

boton = document.createElement('input');
boton.type = 'text';
boton.name = 'text'+icremento;
boton.id = 'text'+icremento;
boton.size = 10;
boton.style.border = "1px solid white";
boton.style.background = "#4F6497";
boton.style.color = "white";
boton.style.font = "x-small Arial";
boton.onfocus = function () {estilo(this.id,1)}
boton.onblur = function () {estilo(this.id,2)}
boton.onchange = function () {formato(this.value,'dec',this.id)}
boton.onkeypress = function () {return acceptNum2(event,this.id)}
contenedor.appendChild(boton);

sin embargo las funciones invocadas en los eventos onfocus y onblur no funcionan, las demás si.
No son funciones importantes pero me gustaría que funcionaran.

¿Alguna sugerencia?


Muchas gracias por tu apoyo
Un saludo desde Lima, Perú
  #6 (permalink)  
Antiguo 10/02/2013, 14:23
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Problema con eventos en la creación de inputs dinámicos

Si que funcionan, basta con que pruebes mi ejemplo, por supuesto que si ponés los 4 eventos juntos, el onchange no lo vas a ver, descomentá el onchange y comenta el onblur

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #7 (permalink)  
Antiguo 13/02/2013, 18:43
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 8 meses
Puntos: 10
Respuesta: Problema con eventos en la creación de inputs dinámicos

Me disculpo por la demora en responder, pero tuve algunos problemas familiares.
El código final es este:

Cita:
icremento =0;
function crear(obj)
{
icremento++;

field = document.getElementById('field');
contenedor = document.createElement('div');
contenedor.id = 'div'+icremento;
field.appendChild(contenedor);

boton = document.createElement('input');
boton.type = 'text';
boton.name = 'peso'+icremento;
boton.id = 'peso'+icremento;
boton.size = 10;
boton.style.border = "1px solid white";
boton.style.background = "#4F6497";
boton.style.color = "white";
boton.style.font = "x-small Arial";
boton.onfocus = function () {estilo(this.id,1)}
boton.onblur = function () {estilo(this.id,2)}

boton.onchange = function () {formato(this.value,'dec',this.id)}
boton.onkeypress = function () {return acceptNum2(event,this.id)}
contenedor.appendChild(boton);
}
Lamentablemente las funciones para los eventos onfocus y onblur siguen sin funcionar, más el resto de funciones si funcionan perfectamente bien. Creo que tiro la toalla jejejeje
  #8 (permalink)  
Antiguo 13/02/2013, 19:06
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Problema con eventos en la creación de inputs dinámicos

Cita:
Iniciado por freesoftwarrior Ver Mensaje
Me disculpo por la demora en responder, pero tuve algunos problemas familiares.
El código final es este:



Lamentablemente las funciones para los eventos onfocus y onblur siguen sin funcionar, más el resto de funciones si funcionan perfectamente bien. Creo que tiro la toalla jejejeje
Están funcionando perfectamente, el que debería de tirar la toalla soy yo
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #9 (permalink)  
Antiguo 13/02/2013, 20:45
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 8 meses
Puntos: 10
Respuesta: Problema con eventos en la creación de inputs dinámicos

Y te creo, pero sigo sin hacer que funcione. La función estilo es esta

Cita:
function estilo(campo,n)
{
if(n==1)
{document.getElementById(campo).className="texto_n ormal_focus";}
else
{document.getElementById(campo).className="texto_n ormal";}
}
y el código CSS es

Cita:
input.texto_normal{
border:1px solid White;
background: #4F6497;
font: x-small Arial;
color: White;
}

input.texto_normal_focus{
border:1px solid Yellow;
background: #374A77;
font: x-small Arial;
color: White;
}

Acabo de probar poner esto en el evento onfocus

Cita:
boton.onfocus = function () {alert("hoy")}
y veo que se ejecuta.... entonces ¿por que no invoca a la función misma? Es más, cree una función para eso

Cita:
boton.onfocus = function () {alerta(this.id,1)}
y la función alerta es

Cita:
function alerta(campo, tipo)
{alert(campo+" = "+tipo);}
y si funciona..... me parece que bajo esta modalidad, el invocar

Cita:
document.getElementById(campo).className="texto_normal_focus";
¿podría ser el problema? Porque el pasar el parámetro this.id no es el problema ya que eso mismo hago en las otras funciones.

¿que opinas ahora?... en verdad muchas gracias por tu apoyo, se que pronto podré solucionar el misterio de mi "gremlin"
  #10 (permalink)  
Antiguo 13/02/2013, 21:17
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Problema con eventos en la creación de inputs dinámicos

no, mirá
http://foros.emprear.com/javascript/objdin.html

y fijate que en mi ejemplo de
http://www.forosdelweb.com/f13/probl...5/#post4366618

justamente para cada evento te puse el nombre para que lo pase a la caja de texto, estilo(a,b)

Y te repito, si mezclas los 4 eventos juntos (keyup, keypress, onchange, etc) se van a sobreponer las acciones

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: campos, creación, eventos, funcion, input, inputs
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:11.