Foros del Web » Programando para Internet » Javascript »

No entiendo bien el DOM

Estas en el tema de No entiendo bien el DOM en el foro de Javascript en Foros del Web. Hola, estoy empezando con Javascript y el DOM, y se me está haciendo bastante lioso. Veréis, he creado un pequeño código HTML para ir probando: ...
  #1 (permalink)  
Antiguo 09/07/2016, 21:01
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
No entiendo bien el DOM

Hola, estoy empezando con Javascript y el DOM, y se me está haciendo bastante lioso.

Veréis, he creado un pequeño código HTML para ir probando:

Código HTML:
Ver original
  1.     <head>
  2.    
  3.        
  4.     </head>
  5.    
  6.     <body>
  7.    
  8.    
  9.         <p>Hola qué tal</p>
  10.         <div id="wrapper"><p>Bien</p></div>
  11.  
  12.  
  13.         <script type="text/javascript">//pequeño js para ir probando
  14.         var msg='';
  15.        
  16.         msg=document.childNodes[0].childNodes[2].childElementCount; <!--esto (el body) devuelve tres elementos.
  17. ¿No deberían ser 2? El párrafo y el div... -->
  18.        
  19.        
  20.         alert(msg);
  21.        
  22.         </script>
  23.     </body>
  24.    
  25.  
  26.    
  27. </html>

En el comentario está una de mis dudas. Pensaría que quizá el tercer elemento es <script>, pero si lo saco del body (es decir, poniendo el código js después del body), me sigue contando tres elementos... Lo cuál me lleva a la siguiente duda:

He tratado de implementar ese código js en un .js aparte, para ver si así no me lo cuenta, de tal forma:


Código Javascript:
Ver original
  1. var msg='';
  2.        
  3.         msg=document.childNodes[0].childNodes[2].childElementCount; /*esto (el body) devuelve tres elementos. ¿No deberían ser 2? El párrafo y el Id... */
  4.        
  5.        
  6.         alert(msg);


Es decir, que ya he probado quitando lo del script y enlazándolo desde el head... pero el .js no se me ejecuta, y mirando línea a línea, parece que es esta la que me da problemas:

Código Javascript:
Ver original
  1. msg=document.childNodes[0].childNodes[2].childElementCount;

Vaya que por algún motivo, desde un .js externo no se ejecuta...

Un saludo a todos y gracias.
  #2 (permalink)  
Antiguo 10/07/2016, 03:25
 
Fecha de Ingreso: mayo-2013
Mensajes: 191
Antigüedad: 10 años, 11 meses
Puntos: 10
Respuesta: No entiendo bien el DOM

Pues seguro que habran otros que te pueden aconsejar mejor que yo.

No he probado tu ejemplo pero teorico ... en la manera que esta pensado al cambiarle de lugar al script estas cambiando tambien la estructura del dom

Cita:
devuelve tres elementos.
¿No deberían ser 2?
Pues no deberian ser 2 porque el <script> que tienes despues del <div> tambien cuenta como elemento del DOM. Asi que es correcto si te da 3

Lo que te aconsejaria yo es de cambiar un poco la manera de apuntar a los elementos añadendo id-s por lo menos para algunos que consideras mas importantes e ir a ellos de manera mas segura con getElementById y solo emplear childNodes de vez en cuando para no poner tampoco id a cada elemento

mira unos ejemplos aqui
http://www.w3schools.com/js/js_htmldom_elements.asp

Luego otro consejo que creo que te va ayudar es en vez de alert() ... hacer cequeos con console.log() para ver los mensajes en la consola ( F12 o click derecho en la pagina y luego inspeccionar para que te salga la consola ) ... para otros navegadores buscar en los menus algo como Herramientas de desarollo



Espero servirte saludos

Última edición por matake; 10/07/2016 a las 03:56
  #3 (permalink)  
Antiguo 10/07/2016, 09:34
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: No entiendo bien el DOM

La primera duda no te preocupes. La importante es la segunda. Revisa estas dos ligas https://developer.mozilla.org/en-US/...MContentLoaded y https://developer.mozilla.org/en-US/...eb/Events/load
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #4 (permalink)  
Antiguo 10/07/2016, 10:24
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: No entiendo bien el DOM

Cita:
Iniciado por matake Ver Mensaje
Pues seguro que habran otros que te pueden aconsejar mejor que yo.

No he probado tu ejemplo pero teorico ... en la manera que esta pensado al cambiarle de lugar al script estas cambiando tambien la estructura del dom



Pues no deberian ser 2 porque el <script> que tienes despues del <div> tambien cuenta como elemento del DOM. Asi que es correcto si te da 3

Lo que te aconsejaria yo es de cambiar un poco la manera de apuntar a los elementos añadendo id-s por lo menos para algunos que consideras mas importantes e ir a ellos de manera mas segura con getElementById y solo emplear childNodes de vez en cuando para no poner tampoco id a cada elemento

mira unos ejemplos aqui
http://www.w3schools.com/js/js_htmldom_elements.asp

Luego otro consejo que creo que te va ayudar es en vez de alert() ... hacer cequeos con console.log() para ver los mensajes en la consola ( F12 o click derecho en la pagina y luego inspeccionar para que te salga la consola ) ... para otros navegadores buscar en los menus algo como Herramientas de desarollo



Espero servirte saludos
Gracias matake por responderme.

Pues sí me he imaginado que es el script, pero como si lo saco fuera del body me sigue contando tres elementos... y hacerlo en un .js externo ya digo que por algún motivo no me funciona.

Lo que no entiendo de los childNodes es, ¿para usar eso no te tienes que hacer un esquema de tu DOM para saber a qué nodo debes llamar? Mucho rollo en DOMs complejos, ¿no?

¿Cómo lo hacéis, iterando sobre el elemento con un for para saber cuál es, quizá?

Ya miraré lo del console.log(). Aon muchos métodos y cosas nuevas de repente
  #5 (permalink)  
Antiguo 10/07/2016, 10:25
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: No entiendo bien el DOM

Cita:
Iniciado por IsaBelM Ver Mensaje
La primera duda no te preocupes. La importante es la segunda. Revisa estas dos ligas https://developer.mozilla.org/en-US/...MContentLoaded y https://developer.mozilla.org/en-US/...eb/Events/load
Muchísimas gracias, Isabel. Me pongo a mirar tu enlace.
  #6 (permalink)  
Antiguo 10/07/2016, 13:22
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: No entiendo bien el DOM

A ver, el problema es que al embeber o externalizar el .js, los elementos aún no existen
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #7 (permalink)  
Antiguo 10/07/2016, 14:00
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: No entiendo bien el DOM

Cita:
Iniciado por IsaBelM Ver Mensaje
A ver, el problema es que al embeber o externalizar el .js, los elementos aún no existen
Ah vale, por eso imagino que me está petando al hacer (desde el .js externo)

Código Javascript:
Ver original
  1. var msg=document.getElementById("p1").childNodes[0].nodeValue;



Pero sigo sin entenderlo, tras leer los links que me has pasado.

A ver, se supone que primero se ejecuta el DOMContentLoaded (que carga el HTML) y después el load, ¿no? (que carga lo demás).

Si yo hago un archivo.js con esto:

Código Javascript:
Ver original
  1. function cargarLoDemas()
  2.         {
  3.            
  4.            
  5.             alert("cargar lo demás");
  6.        
  7.         }
  8.        
  9.        
  10.         window.addEventListener("load",cargarLoDemas);
  11.        
  12.             function cargarDocumentoHtml()
  13.         {
  14.        
  15.             alert("DOMContentLoaded, el HTML cargado");
  16.        
  17.        
  18.         }
  19.  
  20.         document.addEventListener("DOMContentLoaded",cargarDocumentoHtml);

Y mi código HTML tiene lo siguiente:

Código HTML:
Ver original
  1.     <head>
  2.    
  3.        
  4.  
  5.         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  6.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7.         <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  8.  
  9.  
  10.         <script type="text/javascript" src="codigo.js"></script>
  11.        
  12.        
  13.     </head>
  14.    
  15.     <body>
  16.    
  17.        
  18.        
  19.         <p>Hola qué tal</p>
  20.         <div id="wrapper"><p id="p1">Bien</p></div><!--asas-->
  21.        
  22.         <script type="text/javascript" >
  23.        
  24.         var msg='';
  25.        
  26.         var msg=document.getElementById("p1").childNodes[0].nodeValue;
  27.        
  28.         alert(msg);
  29.        
  30.        
  31.         </script>
  32.     </body>
  33.    
  34.    
  35.    
  36. </html>

Primero se ejecuta lo que hay dentro del script que está en el body, y después el script que he externalizado en <head>.

No lo entiendo. Quizá sea que no es necesario llamar a los dos eventos, es decir, que ya son llamados cuando ejecuto el HTML de manera automática... pero es que aún en ese caso, sigo sin entender por qué no se me ejecuta la parte de código js que he puesto en el body si se me ocurre externalizarlo...

Por cierto, sigo utilizando el "alert()" porque el "console.log()" no me funciona...

Poco a poco me van quedando cosas claras, aunque por cada cosa que medio entiendo surgen tres dudas más... poco a poco XD

EDIT: Por cierto, una de las cosas por las que no me ejecutaba el .js anteriormente parece que era por la Codificación también.

Última edición por BramSt; 10/07/2016 a las 14:19
  #8 (permalink)  
Antiguo 10/07/2016, 14:43
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No entiendo bien el DOM

El evento DOMContentLoaded se dispara cuando ha terminado de cargar el modelo de objetos del documento, es decir, los elementos HTML que haya, mas no los subrecursos incluidos (fotos, vídeos, audio, frames). Cuando colocas el script al final de todo, este se ejecuta luego de que los elementos ubicados antes han cargado precisamente porque se encuentra después de ellos, lo cual no quiere decir que se hayan disparado los eventos DOMContentLoaded o load.

Para tener esto más claro, puedes utilizar el evento readystatechange, mismo que se dispara cada vez que cambia el estado de carga del documento:
Código Javascript:
Ver original
  1. document.addEventListener("readystatechange", function(){
  2.     switch (this.readyState){
  3.         case "loading":
  4.             console.log("El documento está cargando");
  5.             break;
  6.         case "interactive":
  7.             console.log("El DOM ha terminado de cargar, pero no los subrecursos");
  8.             break;
  9.         case "complete":
  10.             console.log("El DOM y los subrecursos han terminado de cargar");
  11.             break;
  12.     }
  13. }, false);

Como puedes apreciar, la propiedad readyState es la que contiene al estado de carga del documento, habiendo tres cuya descripción se encuentra en los mensajes que se muestran por cada caso. Cabe señalar que, el segundo estado, equivale al evento DOMContentLoaded; y el tercero, al evento load.

Y para utilizar la consola del navegador, tan solo necesitas ingresar al cuadro de herramientas para desarrolladores de tu navegador web, al cual puedes acceder a través del menú de opciones del mismo o, si usas Chrome, Firefox o IE/Edge, pulsando la tecla F12 y buscando la opción "Console" o "Consola" en el cuadro que se desplegará.

__________________
«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; 10/07/2016 a las 22:18 Razón: Corrección ortográfica
  #9 (permalink)  
Antiguo 10/07/2016, 15:26
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: No entiendo bien el DOM

Aaaaaaaaaaaaaaaah coño que esos eventos se disparan CUANDO TERMINAN de cargar lo que tienen que cargar. Así sí.

Comprendido también lo de console.log()

Ahora sólo me queda tratar de investigar la relación lógica de lo que me dice Isabel entre estos dos eventos y por qué no se me ejecuta un .js externo.

Muchas gracias alexis88 a ti también.
  #10 (permalink)  
Antiguo 15/07/2016, 01:03
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: No entiendo bien el DOM

Cita:
Iniciado por IsaBelM Ver Mensaje
La primera duda no te preocupes. La importante es la segunda. Revisa estas dos ligas https://developer.mozilla.org/en-US/...MContentLoaded y https://developer.mozilla.org/en-US/...eb/Events/load
Coooooño creo que ya lo voy pillando... voy poniendo estas cosas por si en el futuro alguien novato como yo se encuentra con los mismos problemas.

el tema es, como dices, que JS no puede actuar con unos elementos que aún no existen, y por eso el .js externo no se ejecuta si no "disparamos" ese JS cuando se termine de cargar la página, no?

Así que lo que habría que hacer es algo así, si queremos que cargue un .js externo:


Código Javascript:
Ver original
  1. //archivoExterno.js:
  2.  
  3.  
  4. function funcionCodigoACargar()
  5. {
  6.  
  7. //aquí va el código JS
  8.  
  9. }

Y luego:


Código HTML:
Ver original
  1.     <head>
  2.    
  3.        
  4.  
  5.         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  6.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7.         <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  8.  
  9.  
  10.         <script type="text/javascript" src="rutaArchivoExterno.js"></script><!--NO OLVIDAR ESTO-->
  11.        
  12.        
  13.     </head>
  14.    
  15.     <body onload="funcionEjemploCarga()"><!--CUANDO SE DISPARA EL EVENTO LOAD, EJECUTAMOS LA FUNCION QUE CONTIENE NUESTRO CODIGO JS-->
  16.    
  17.        
  18.        
  19.         <p>Hola qué tal</p>
  20.         <div id="wrapper"><p id="p1">Bien</p></div>
  21.        
  22.        
  23.     </body>
  24.    
  25.    
  26.    
  27. </html>




¿Es así la cosa?

Parece que así, porque ahora se ejecuta XD
  #11 (permalink)  
Antiguo 15/07/2016, 01:48
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: No entiendo bien el DOM

Así es, BramSt. Como el navegador interpreta el código de arriba hacia abajo, ya sea que hayas escrito el código directamente en el documento o se encuentre en un archivo externo y, en cualquiera de ambos casos, lo colocaste antes de los elementos que deseas afectar, si no controlas su accionar hasta que haya cargado el DOM, no surtirá efecto.

__________________
«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

Etiquetas: dom, html, js
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 00:15.