Foros del Web » Programando para Internet » Javascript »

Cambiar propiedades en DOM generado dinámicamente

Estas en el tema de Cambiar propiedades en DOM generado dinámicamente en el foro de Javascript en Foros del Web. Hola. Cosa rara la que me está pasando esta mañana. Es la primera vez que genero un árbol DOM dinámicamente mediante appendChilds y createElements. Por ...
  #1 (permalink)  
Antiguo 23/08/2011, 06:06
 
Fecha de Ingreso: agosto-2011
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Cambiar propiedades en DOM generado dinámicamente

Hola.

Cosa rara la que me está pasando esta mañana. Es la primera vez que genero un árbol DOM dinámicamente mediante appendChilds y createElements. Por ejemplo:

Código Javascript:
Ver original
  1. var checkbox = document.createElement("input");
  2. checkbox.setAttribute("onclick","seleccionaCheck(this)");
  3. document.body.append(checkbox);

Hasta aquí todo bien, se crea el checkbox y se marca/desmarca. El problema es que cuando se pincha y se ejecuta la función seleccionaCheck(this), llega un momento en el que tengo que cambiar la visibilidad (ocultar) de una serie de divs (lo más normal del mundo). El Firebug se vuelve loco y deja de funcionar en ese momento y me doy cuenta de que se oculta el primero de los divs pero no el resto. En IE ni siquiera funciona. El código que utilizo es una cosa muy normalita:

Código Javascript:
Ver original
  1. div.style.visibility = "hidden";
  2.  
  3. // También he probado con este otro:
  4.  
  5. div.setAttribute("visibility","hidden");

Y nada. Peta y no funciona. Ya no sé si tiene algo que ver con generar el DOM dinámicamente, porque antes lo tenía hecho a mano y funcionaba perfectamente.

He terminado por ponerlo a mano, pero no me gusta porque hay muchas id's y acabaré equivocándome cada vez que quiera cambiar algo.

Por cierto, no puedo utilizar PHP en este caso.

¿Alguna sugerencia?

Gracias.
  #2 (permalink)  
Antiguo 23/08/2011, 06:38
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Cambiar propiedades en DOM generado dinámicamente

¿Qué hace exactamente la función seleccionaCheck? De todas formas es mejor que uses directamente onclick y le pongas el handler, en vez de usar setAttribute.
A todo esto, estás creando un input, pero no un checkbox; y es appendChild, no append.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #3 (permalink)  
Antiguo 23/08/2011, 06:41
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Cambiar propiedades en DOM generado dinámicamente

no es append sino appendChild
en lugar de agregar el atributo click usa onclick. checkbox.onclcik = function() {fnc()}
y finalmente qué hace la función seleccionaCheck??
  #4 (permalink)  
Antiguo 23/08/2011, 07:12
 
Fecha de Ingreso: agosto-2011
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cambiar propiedades en DOM generado dinámicamente

A ver, que me han faltado un par de cosas y hay un par de errores. De todas formas no son demasiado importantes. Pongo el código de nuevo y corregido:

Código Javascript:
Ver original
  1. var checkbox = document.createElement("input");
  2. checkbox.type="checkbox";    
  3. checkbox.setAttribute("onclick","seleccionaCheck(this)");
  4. document.body.appendChild(checkbox);

Todo esto, como ya he dicho, funciona correctamente, pero con las prisas me había equivocado. Por otra parte, también genero dinámicamente una serie de DIVs:

Código Javascript:
Ver original
  1. for (var i=0; i < 3; i++) {
  2.    var div = document.createElement("div");
  3.    div.id = "div_" + i;
  4.    document.body.appendChild(div);
  5. }

Por otra parte, la función seleccionaCheck(this) hace, además de otras cosas, algo así:

Código Javascript:
Ver original
  1. for (var i=0; i < 3; i++) {
  2.         var bloque = document.getElementById('div_' + i);
  3.                 bloque.style.visibility = 'hidden'; //Aquí es donde se vuelve loco
  4.     }

La línea donde digo que se vuelve loco, en realidad se ejecuta, pero debugando con el Firebug, parece que para ahí. En realidad el código sigue ejecutándose, pero no termina de hacer el loop entero, por lo que no oculta todos los divs, sino sólo el primero. Es algo muy rarito que puede tener que ver con haber generado el código dinámicamente, o eso creo yo.

Gracias por las contestaciones.
  #5 (permalink)  
Antiguo 23/08/2011, 08:05
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Cambiar propiedades en DOM generado dinámicamente

no tiene nada que ver con generarlo dinámicamente. el código que muestras debería de funcionar. de cualquier modo algunas correcciones
Cita:
var checkbox = document.createElement("input");
checkbox.setAttribute("type","checkbox"); // lo añade como atributo
checkbox.onclick = function() {seleccionaCheck(this);}; // no añade el evento como atributo
document.body.appendChild(checkbox);
Cita:
for (var i=0; i < 3; i++) {
var div = document.createElement("div");
div.setAttribute("id", "div_" + i); // lo añades como atributo
document.body.appendChild(div);
}
  #6 (permalink)  
Antiguo 23/08/2011, 10:22
 
Fecha de Ingreso: agosto-2011
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cambiar propiedades en DOM generado dinámicamente

Uhm. Acabo de probar en casa un ejemplo más fácil y me ha funcionado. Tendré que revisar en el trabajo a ver qué es lo que puede estar pasando. No sé si la cabecera del documento está mal, pero la función seleccionaCheck se ejecutaba con normalidad.

Parece que no tiene nada que ver con asignar un evento onclick como atributo o directamente desde Javascript como propones (aunque es menos intrusivo,claro). He intentado ahora hacer el ejemplo añadiendo las id's como atributos y accediendo a ellas con check.id. Ambas formas funcionan, aunque desconozco cuál es mejor. Entiendo que la segunda forma no llama a otra función adicional, así que creo que es mejor ¿Me corrigen si pueden?

Si mañana me tengo que dedicar al tema en el trabajo y descubro el problema, lo escribiré por aquí.

Gracias a todos.
  #7 (permalink)  
Antiguo 24/08/2011, 03:59
 
Fecha de Ingreso: agosto-2011
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Cambiar propiedades en DOM generado dinámicamente

Bueno, finalmente he visto lo que pasaba. El Firebug me ha despistado porque cuando llega a la sentencia bloque.style.visibility = 'hidden' se para, pero en realidad la ejecución continuaba y había un error en una sentencia posterior. Parece que es un fallo del propio Firebug. Ahora va todo bien.

Gracias a todos por vuestro interés. Creo que esto se podría cerrar como solucionado...
  #8 (permalink)  
Antiguo 24/08/2011, 07:01
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Cambiar propiedades en DOM generado dinámicamente

Igual me gano algún enemigo
Pero te recomiendo altamente que dejes Firebug y te pases a la consola de Chrome. Aparte de que es built-in, para mí es mucho más intuitiva y con más features, pero si estás acostumbrado a Firebug igual es un poco coñazo
Saludos :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: dom
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 17:25.