Foros del Web » Programando para Internet » Javascript »

Error en usando AppendChild

Estas en el tema de Error en usando AppendChild en el foro de Javascript en Foros del Web. Hola, estoy realizando un Script, para generar algo que yo llamo "Jerarquia Avanzada", entonses, lo que que hago es crear elementos dinamicamente y añadirlos a ...
  #1 (permalink)  
Antiguo 12/11/2010, 17:46
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Error en usando AppendChild

Hola,

estoy realizando un Script, para generar algo que yo llamo "Jerarquia Avanzada", entonses, lo que que hago es crear elementos dinamicamente y añadirlos a un elemento padre.

El error:

Código:
Error: uncaught exception: 
[Exception... "Node cannot be inserted at the specified point in the hierarchy"
code: "3"
nsresult: "0x80530003 (NS_ERROR_DOM_HIERARCHY_REQUEST_ERR)"
location: "file:///D:/mysite/lyn/dhtml/dhtml.js
Line: 82"]
y el Script:

Código Javascript:
Ver original
  1. dhtElement = new Class({ //dhtElement es un Objeto base para crear otros
  2.   initialize:function(data){
  3.     for (prop in data) {
  4.       this[prop] = data[prop]
  5.       if (typeof(data[prop].element) != 'undefined' || data[prop].element != null) {
  6.         alert(this.element)
  7.         this.element.appendChild(data[prop].element) // linea 82
  8.       }
  9.     }
  10.   },
  11.   element:null, // Este es el elemento HTML, se coloca
  12.   x:function(){},
  13.   y:function(){},
  14.   width:function(){},
  15.   height:function(){},
  16.   draw:function(){
  17.     return this.element
  18.   }
  19. })
  20. dhtComponent = new Class({
  21.   element:$C("div")
  22. },dhtElement)
  23.  
  24. /* Layer Types */
  25.  
  26. dhtLayer = new Class({},dhtElement) // Aquí creo la sub clase
  27.  
  28. lyrDIV = new Class({
  29.   element:$C('div') //$C = document.createElement, especifico el
  30.                     //elemento que estaba en null mas arriba
  31. },dhtLayer)
  #2 (permalink)  
Antiguo 12/11/2010, 18:15
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Error en usando AppendChild

Difícil dar una respuesta más certera con código tan incompleto, pero ese error suele aparecer cuando intentás insertar un elemento fuera de su estructura natural. Por ejemplo, cuando intentás colocar un formulario o una imagen fuera del tag body.
Asegurate de estar definiendo correctamente el contenedor de los elementos que quieras agregar a la estructura del DOM.
  #3 (permalink)  
Antiguo 12/11/2010, 18:26
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Error en usando AppendChild

el error HIERARCHY_REQUEST_ERR (3) significa que estas agregando un elemento en una posicion ilegal de la estructura del documento. o sea, que ese elemento no esta permitido agregarse en el elemento que lo intentas agregar. no puedo indicarte donde exactamente reside el error porque me parece que estas usando una libreria. de todos modos, es para que te sirva de indicacion que tienes que revisar cual es el elemento que intentas agregar y donde lo quieres agregar.

adivinando un poco, habria que entender primero que exactamente devuelve la funcion $C(). ¿la funcion devuelve un elemento o un objeto? si devuelve un objeto, entonces eso explica el por que del error. tienes que devolver el elemento en si, o al momento de agregar el elemento tienes que indicar la propiedad en si que retiene el elemento.

edit:
@panino, segunda vez que tropiezo contigo en tan poco tiempo! no lo hago a proposito...
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #4 (permalink)  
Antiguo 12/11/2010, 18:41
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Error en usando AppendChild

voy a completar mas el codigo:

Código Javascript:
Ver original
  1. /* DHTML Objects */
  2. dhtElement = new Class({
  3.   initialize:function(data){
  4.     for (prop in data) {
  5.       this[prop] = data[prop]
  6.       if (typeof(data[prop].element) != 'undefined' || data[prop].element != null) {
  7.         alert(this.element)
  8.         this.element.appendChild(data[prop].element) // Line 82
  9.       }
  10.     }
  11.   },
  12.   element:null,
  13.   x:function(){},
  14.   y:function(){},
  15.   width:function(){},
  16.   height:function(){},
  17.   draw:function(){
  18.     return this.element
  19.   }
  20. })
  21. dhtComponent = new Class({
  22.   element:$C("div")
  23. },dhtElement)
  24.  
  25. /* Layer Types */
  26.  
  27. dhtLayer = new Class({},dhtElement)
  28.  
  29. lyrDIV = new Class({
  30.   element:$C('div')
  31. },dhtLayer)
  32.  
  33.  
  34.  
  35. /* DHTML Default Componentes  */
  36. dhtLoader = new Class({
  37.   initialize:function(image,text,width,height,bgColor,color,progressBar,porcentage) {
  38.     usedHeight = 0
  39.     if (typeof(image) != 'undefined' && image != "") {
  40.       image = typeof(image) == 'string' ? new lyrImage(image) : image
  41.       image.x((image.width() + width) / 2 - image.width())
  42.       usedHeight = image.height()
  43.       this.ldrImage = image
  44.     } else {
  45.       image = null
  46.     }
  47.     if (porcentage) {
  48.       porcentage = new lyrDinamicText("[1]%")
  49.       porcentage.x(width-porcentage.width())
  50.       this.ldrPorcentage = porcentage
  51.      
  52.     } else {
  53.       porcentage = null
  54.     }
  55.     if (progressBar) {
  56.       progressBar = new dhtComponent({
  57.         box:new lyrDIV({
  58.           bar:new lyrDIV()
  59.         })
  60.       })
  61.       xs = porcentage ? porcentage.width() : 0
  62.       with (progressBar.box) {
  63.         width(width-xs)
  64.         height(height)
  65.         y(usedHeight)
  66.         bar.width(width-xs-2)
  67.         bar.height(height-2)
  68.         bar.x(1)
  69.         bar.y(1)
  70.       }
  71.       usedHeight+=height
  72.       this.ldrProgress = progressBar
  73.     }
  74.     if (typeof(text) == 'string' && text != "") {
  75.       text = new lyrStyledText(text,styLoaderText)
  76.       text.x((width + text.width()) / 2 - text.width())
  77.       text.y(usedHeight)
  78.       this.ldrText = text
  79.     }
  80.   }
  81. },dhtComponent)
  #5 (permalink)  
Antiguo 12/11/2010, 18:42
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Error en usando AppendChild

Ja, ja! Es bueno encontrarse con los amigos ;)
  #6 (permalink)  
Antiguo 12/11/2010, 18:59
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Error en usando AppendChild

no estoy haciendo ninguna libreria, es soloque simplefiqué algunas funciones:

Código Javascript:
Ver original
  1. /* Tools */
  2. Class = function($1,$2){
  3.   $2 = typeof $2 == 'undefined' ? {} : $2.prototype;
  4.   for($6 in $2){
  5.     if(typeof $1[$6] == 'undefined') $1[$6] = $2[$6];
  6.     else if(typeof $2[$6] == 'function'){
  7.       $1[$6] = (function($3){
  8.         $4 = function(){
  9.         this.parent = $4.parent;
  10.         return $3.apply(this, arguments);
  11.         }
  12.         return $4;
  13.       })($1[$6]);
  14.       $1[$6].parent = $2[$6];
  15.     }
  16.   }
  17.   $5 = function(){
  18.     if(this.initialize) this.initialize.apply(this,arguments);
  19.   }
  20.   $5.prototype = $1;
  21.   $5.constructor = Class;
  22.   return $5;
  23. }
  24. $G=function($1){return document.getElementById($1)}
  25. $T=function($1){return document.getElementsByTagName($1)}
  26. $C=function($1){return document.createElement($1)}
  27. $F=function()  {return document.createDocumentFragment()}

PD: ¿porqué no veo el boton editar?
  #7 (permalink)  
Antiguo 12/11/2010, 19:16
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Error en usando AppendChild

Cita:
PD: ¿porqué no veo el boton editar?
por nuevas politicas que se crearon. en el foro de soporte ya se ha discutido.
http://www.forosdelweb.com/showthread.php?t=850409

aunque no lo veas asi, es una libreria, pero propia. ¿no seria mas conveniente si subes la aplicacion a la red e indicarnos como producir el error? nos toma mas tiempo -al menos a mi- ensamblar todo he inducir adivinacion. de lo contrario, para que tambien nos ayude a encontrar el error, te diria que uses la consola de firebug. en la pestaña Script tienes varios controles para detener la ejecuccion del script cuando se genera un error. en ese instante puedes revisar los tipos de valores de las variables o propiedades, y determinar cual es el elemento que intenta agregar y donde. es la forma mas rapida que se me ocurre analizarlo, o sea una depuracion en proceso.


Cita:
Iniciado por Panino5001 Ver Mensaje
Ja, ja! Es bueno encontrarse con los amigos ;)
¡razon llevas!
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #8 (permalink)  
Antiguo 12/11/2010, 20:48
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Error en usando AppendChild

perdon por la demora, aqui está:

http://clubice.site50.net/new-lyn/
  #9 (permalink)  
Antiguo 12/11/2010, 21:30
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Error en usando AppendChild

no lo he revisado con mucha profundidad, pero creo que ya se por que es... estas agregando el mismo elemento a si mismo. es decir, por poner un ejemplo, estas haciendo algo como lo siguiente:
Código:
var d = document.createElement("div");
d.appendChild(d);
de todos modos sigo investigando de poco a poco para asegurarme.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #10 (permalink)  
Antiguo 13/11/2010, 02:26
Avatar de Tecna  
Fecha de Ingreso: enero-2010
Mensajes: 291
Antigüedad: 14 años, 3 meses
Puntos: 45
Respuesta: Error en usando AppendChild

Buenas,

yo me he encontrado con este problema pero unicamente sucedía en la versión 7.0.517.44 de chrome, porque parece que no deja crear elementos directamente dentro de la etiqueta <html> así que la solución fue crear primero el elemento <body> . En las pruebas que hice en el resto de navegadores funcionaba correctamente de las dos formas.
  #11 (permalink)  
Antiguo 13/11/2010, 10:28
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Error en usando AppendChild

creo que ya encontre el problema, resulta que cuando defino la propiedad element en el prototipo, esta creando en ese momento el DIV, y lo devuelve como protoripo, por eso el error. entonses, la solucion seria que se creara el elemento dentro del initialize del constructor, pero sucede que estos son subclases, los cuales dependen del initialize padre para definirse, y como nesesito definir objetos diferentes para cada una de las subclases, tendria que escribir el initialize a cada uno de estos, pero el problema es que no se como llamar al initialize padre que es el que termina de generar el objeto..... dentro del initialize se crea un parent, que se usa para llamar al initialize padre, pero no se como se hago para llamar a esa funcion y que se apliquen los cambios en el initialize de la sub clase.

PD: Tecna, a mi no me esta funcionando con el FF

Etiquetas: Ninguno
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:07.