{"id":809,"date":"2024-07-31T07:27:34","date_gmt":"2024-07-31T05:27:34","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=809"},"modified":"2024-07-31T07:27:34","modified_gmt":"2024-07-31T05:27:34","slug":"003-dom-nodos-elementos-y-selectores","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/13-dom-document-object-model\/003-dom-nodos-elementos-y-selectores\/","title":{"rendered":"003. DOM: Nodos, Elementos y Selectores"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este cap\u00edtulo comenzamos a ver como manejar e interactuar con los <strong>nodos<\/strong>, y particularmente los <strong>elementos<\/strong>, que son las <strong>etiquetas HTML<\/strong>.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Nodo no es elemento<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No hay que confundir un <strong>nodo<\/strong> con una <strong>etiqueta HTML<\/strong> (<strong>elemento<\/strong>). hay diferentes tipos de <strong>nodos<\/strong>, por ejm los <strong>comentarios HTML<\/strong> son un tipo de <strong>nodo<\/strong>, las <strong>etiquetas HTML<\/strong> son otro tipo de <strong>nodo<\/strong>, los <strong>textos<\/strong> para las <strong>etiquetas textuales<\/strong> como <strong>p\u00e1rrafos<\/strong>, <strong>encabezados<\/strong>&#8230; son otro tipo de nodo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para interactuar con el <strong>HTML<\/strong> como desarrollador web, no nos van a interesar todos los tipos de <strong>nodos<\/strong>. Si vamos a <a href=\"https:\/\/developer.mozilla.org\/es\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>MDN<\/strong><\/a> y buscamos <a href=\"https:\/\/developer.mozilla.org\/es\/docs\/Web\/API\/Node\/nodeType\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Node.nodeType<\/strong><\/a>, existe una tabla que indica los diferentes tipos de <strong>nodos<\/strong>, una breve descripci\u00f3n y el valor de los mismos. Encontraremos 12 tipos de <strong>nodos<\/strong> distintos, algunos son <strong>nodos<\/strong> que se encuentran en documentos <a href=\"https:\/\/www.xml.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>XML<\/strong><\/a>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: Cada <strong>nodo<\/strong> tiene una raz\u00f3n de ser.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">B\u00e1sicamente, para la interacci\u00f3n de <strong>HTML<\/strong>, los que nos va a interesar son los <strong>nodos de tipo elemento<\/strong> y los nodos de <strong>tipo texto<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Node.ELEMENT_NODE\nNode.TEXT_NODE<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto es algo muy importante a considerar, sobre todo cuando lleguemos a la parte del <strong>DOM traversing<\/strong> (como recorrer el <strong>DOM<\/strong>). Un <strong>nodo de texto<\/strong> es el texto que se encuentra dentro de las etiquetas de tipo texto, y un <strong>nodo de tipo elemento<\/strong> es una <strong>etiqueta HTML<\/strong> en particular.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a dejar un c\u00f3digo <strong>HTML<\/strong> sobre el que estaremos trabajando. El c\u00f3digo es el siguiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm archivo dom.html<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n  &lt;meta charset=\"UTF-8\"&gt;\n  &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n  &lt;title&gt;Manejo de DOM&lt;\/title&gt;\n  &lt;script src=\"dom.js\"&gt;&lt;\/script&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n  &lt;h2&gt;Manejo de DOM&lt;\/h2&gt;\n  &lt;p id=\"que-es\"&gt;\n   Lorem ipsum dolor sit, amet consectetur adipisicing elit. \n   Vitae facilis, adipisci necessitatibus veritatis maiores, \n   magni amet nisi dolor excepturi obcaecati laudantium animi \n   eos accusamus. Eaque at voluptate quidem ipsa mollitia!\n  &lt;\/p&gt;\n\n&lt;nav id=\"menu\"&gt;\n  &lt;ul&gt;\n   &lt;li&gt;&lt;a href=\"\"&gt;Secci\u00f3n S&lt;\/a&gt;&lt;\/li&gt;\n   &lt;li&gt;&lt;a href=\"\"&gt;Secci\u00f3n S&lt;\/a&gt;&lt;\/li&gt;\n   &lt;li&gt;&lt;a href=\"\"&gt;Secci\u00f3n S&lt;\/a&gt;&lt;\/li&gt;\n   &lt;li&gt;&lt;a href=\"\"&gt;Secci\u00f3n S&lt;\/a&gt;&lt;\/li&gt;\n   &lt;li&gt;&lt;a href=\"\"&gt;Secci\u00f3n S&lt;\/a&gt;&lt;\/li&gt;\n  &lt;\/ul&gt;\n&lt;\/nav&gt;\n\n&lt;input type=\"text\" name=\"nombre\" placeholder=\"Nombre\"&gt;\n\n&lt;a class=\"link-dom\" href=\"dom.html\"&gt;DOM&lt;\/a&gt;\n\n&lt;section class=\"cards\"&gt;\n  &lt;figure class=\"card\"&gt;\n   &lt;img src=\"https:\/\/placeimg.com\/200\/200\/tech\" alt=\"Tech\"&gt;\n   &lt;figcaption&gt;Tech&lt;\/figcaption&gt;\n  &lt;\/figure&gt;\n  &lt;figure class=\"card\"&gt;\n   &lt;img src=\"https:\/\/placeimg.com\/200\/200\/animals\" alt=\"Animals\"&gt;\n   &lt;figcaption&gt;Animals&lt;\/figcaption&gt;\n  &lt;\/figure&gt;\n  &lt;figure class=\"card\"&gt;\n   &lt;img src=\"https:\/\/placeimg.com\/200\/200\/people\" alt=\"People\"&gt;\n   &lt;figcaption&gt;People&lt;\/figcaption&gt;\n  &lt;\/figure&gt;\n  &lt;figure class=\"card\"&gt;\n   &lt;img src=\"https:\/\/placeimg.com\/200\/200\/arch\" alt=\"Arch\"&gt;\n   &lt;figcaption&gt;Arch&lt;\/figcaption&gt;\n  &lt;\/figure&gt;\n  &lt;figure class=\"card\"&gt;\n   &lt;img src=\"https:\/\/placeimg.com\/200\/200\/nature\" alt=\"Nature\"&gt;\n   &lt;figcaption&gt;Nature&lt;\/figcaption&gt;\n  &lt;\/figure&gt;\n&lt;\/section&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e9todos del DOM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a comenzar a ver cuales son los <strong>m\u00e9todos<\/strong> que tiene el <strong>DOM<\/strong> para poder capturar elementos del documento <strong>HTML<\/strong> en variables <strong>Javascript<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">M\u00e9todos en desuso<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Existen algunos m\u00e9todos en desuso, que han sido reemplazados por otros, y son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>getElementsByTagName()<\/em><\/strong>: imprime todos los elementos de cierta etiqueta.<\/li>\n\n\n\n<li><strong><em>getElementsByClassName()<\/em><\/strong>: imprime los elementos con cierta clase.<\/li>\n\n\n\n<li><strong><em>getElementsByName()<\/em><\/strong>: accede a trav\u00e9s del atributo <strong><em>name<\/em><\/strong>. Se utiliza sobretodo en los elementos de formulario, donde es importante poner el atributo <strong><em>name<\/em><\/strong> porque cuando procesamos un <strong>formulario<\/strong> y enviamos esa informaci\u00f3n, gracias a dicho atributo <strong><em>name<\/em><\/strong>, el lenguaje de lado de servidor lo detecta como una <strong>variable<\/strong> de tipo <strong><em>POST<\/em><\/strong> o de tipo <strong><em>GET<\/em><\/strong>.<\/li>\n\n\n\n<li><strong><em>getElementById()<\/em><\/strong>: accede a los elementos con el id pasado como par\u00e1metro.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con <em>getElementsByTagName()<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(document.getElementsByTagName(\"li\"));\n\/\/ Imprime en la consola todas las etiquetas.<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: recordar que lo que imprime la consola no es un <strong>array<\/strong>, es una <strong>colecci\u00f3n HTML<\/strong> (<strong>HTMLCollection<\/strong>), parecido a los <strong>arrays<\/strong>, pero no igual, no soporta las mismas caracter\u00edsticas que ellos, aunque s\u00ed comparte algunas.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con getElementsByClassName()<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(document.getElementsByClassName(\"card\"));\n\/\/ Imprime en consola todos los elementos con la clase card<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con getElementsByName()<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(document.getElementsByName(\"nombre\"));\n\/\/ Imprime en consola los elementos con el atributo name = \"nombre\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En el caso del m\u00e9todo <strong><em>getElementsByName()<\/em><\/strong> nos va a devolver un <strong><em>NodeList()<\/em><\/strong> que es otro tipo de objeto parecido a un <strong>array<\/strong>, pero que tiene que ver con el <strong>DOM<\/strong>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: todas las <strong>propiedades<\/strong> que empiezan por <strong>on-<\/strong> son los <strong>eventos<\/strong> que tenemos.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con <em>getElementById()<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(getElementById(\"menu\"));\n\/\/ Imprime todos los elementos con el id = \"menu\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los 3 primeros m\u00e9todos: <strong><em>getElementsByTagName()<\/em><\/strong>, <strong><em>getElementsByClassName()<\/em><\/strong> y <strong><em>getElementsByName()<\/em><\/strong> han sido reemplazados por dos nuevos m\u00e9todos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>querySelector()<\/em><\/strong>: si lo traducimos, significa \u00abconsulta de selector\u00bb, el cual recibe como par\u00e1metro un <strong>selector<\/strong> v\u00e1lido de <strong>CSS<\/strong> (un <strong>id<\/strong>, un <strong>class<\/strong>, una <strong>etiqueta HTML<\/strong> que est\u00e9 dentro de cierta clase, cualquier selector v\u00e1lido que no sea <strong>pseudo-clase<\/strong> o <strong>pseudo-elemento<\/strong>). Para este <strong>m\u00e9todo<\/strong>, S\u00cd que hay que especificar el <strong>punto<\/strong> (.) en el caso de las <strong>clases<\/strong>, y la <strong>almohadilla<\/strong> (#) si se trata de un <strong>id<\/strong>. <strong><em>querySelector()<\/em><\/strong> hace referencia a que va a recibir un selector v\u00e1lido de <strong>CSS<\/strong>. Muy importante, s\u00f3lo imprime el primer selector del tipo que hayamos especificado que haya encontrado en el documento <strong>HTML<\/strong>.<\/li>\n\n\n\n<li><strong><em>querySelectorAll()<\/em><\/strong>: el uso es el mismo que <strong><em>querySelector()<\/em><\/strong>, pero trae todos los selectores, no s\u00f3lo uno.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con <em>querySelector()<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(document.querySelector(\"#menu\"));\n\/\/ Imprime en consola el primer elemento con id = \"menu\"\n\/\/ Si hay mas elementos no los imprime<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: aunque se pueden utilizar tanto <strong><em>querySelector()<\/em><\/strong> como <strong><em>getElementById()<\/em><\/strong> para mostrar elementos con un id espec\u00edfico, a nivel de rendimiento, <strong><em>getElementById()<\/em><\/strong> funciona mejor que <strong>querySelector()<\/strong>, ya que \u00e9ste \u00faltimo tiene que hacer el filtro para detectar que se le pasa como par\u00e1metro (si es un <strong>class<\/strong>, un <strong>id<\/strong>&#8230;).<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm con querySelectorAll()<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">console.log(document.querySelectorAll(\"a\"));\n\/\/ Imprime una nodeList con todos los elementos\nconsole.log(document.querySelectorAll(\"a\")[1]);\n\/\/ Imprime (como los arrays) el segundo elemento\n\/\/ de la nodeList\nconsole.log(document.querySelectorAll(\"#menu li\"));\n\/\/ Imprime las listas que se encuentran dentro\n\/\/ del id = \"menu\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En la actualidad, los m\u00e9todos que se est\u00e1n utilizando son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>getElementById()<\/em><\/strong><\/li>\n\n\n\n<li><strong><em>querySelector()<\/em><\/strong><\/li>\n\n\n\n<li><strong><em>querySelectorAll()<\/em><\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tanto el m\u00e9todo <strong><em>querySelector()<\/em><\/strong> como <strong><em>querySelectorAll()<\/em><\/strong> devolver\u00e1n una <strong><em>nodeList()<\/em><\/strong>, que no es lo mismo que un <strong>array<\/strong>, aunque se parezcan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Junto con los <strong>arrays<\/strong>, comparten la <strong>propiedad<\/strong> <strong><em>length<\/em><\/strong>, tambi\u00e9n comparten, no todo los <strong>m\u00e9todos<\/strong>, pero s\u00ed algunos de ellos, como es por ejm el bucle <strong><em>forEach<\/em><\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">document.querySelectorAll(\"a\").forEach(el =&gt; console.log(el));<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A partir de este cap\u00edtulo vamos a estar utilizando <strong><em>querySelector()<\/em><\/strong>, <strong><em>querySelectorAll()<\/em><\/strong> y <strong><em>getElementById()<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>getElementsByTagName()<\/em><\/strong>, <strong><em>getElementsByClassName()<\/em><\/strong> y <strong><em>getElementsByName()<\/em><\/strong> los vamos a dejar a un lado porque se considera mala pr\u00e1ctica utilizarlos a d\u00eda de hoy. Para ids vamos a utilizar <strong><em>getElementById()<\/em><\/strong>, para traernos el primer selector v\u00e1lido vamos a utilizar <strong><em>querySelector()<\/em><\/strong>, y para traernos todos, vamos a utilizar <strong><em>querySelectorAll()<\/em><\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este cap\u00edtulo comenzamos a ver como manejar e interactuar con los nodos, y particularmente los elementos, que son las [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":800,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-809","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"En este cap\u00edtulo comenzamos a ver como manejar e interactuar con los nodos, y particularmente los elementos, que son las [&hellip;]","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=809"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/809\/revisions"}],"predecessor-version":[{"id":811,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/809\/revisions\/811"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/800"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}