{"id":827,"date":"2024-07-31T07:36:43","date_gmt":"2024-07-31T05:36:43","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=827"},"modified":"2024-07-31T07:36:43","modified_gmt":"2024-07-31T05:36:43","slug":"009-dom-creando-elementos-y-fragmentos","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/13-dom-document-object-model\/009-dom-creando-elementos-y-fragmentos\/","title":{"rendered":"009. DOM: Creando Elementos y Fragmentos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este cap\u00edtulo vamos a ver como crear <strong>elementos<\/strong> (<strong>etiquetas HTML<\/strong>) din\u00e1micamente a trav\u00e9s de <strong>Javascript<\/strong>. Hasta ahora hemos aprendido a <strong>manipular las etiquetas existentes<\/strong> en nuestros archivos <strong>HTML<\/strong>, en este cap\u00edtulo vamos a comenzar a <strong>crear nuestras propias etiquetas din\u00e1micas<\/strong>.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Crear nodos uno por uno<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El <strong>DOM<\/strong> tiene un m\u00e9todo denominado <strong><em>createElement()<\/em><\/strong>, que como su nombre indica, va a crear un <strong>elemento del DOM<\/strong>. En nuestro ejm vamos a crear una etiqueta <strong><em>&lt;figure&gt;<\/em><\/strong> con la siguiente sintaxis.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Crear 3 nuevas etiquetas\nconst $figure = document.createElement(\"figure\"),\n$img = document.createElement(\"img\"),\n$figcaption = document.createElement(\"figcaption\");\n\n\/\/ Crear nuevos nodos de texto\n$figcaptionText = document.createTextNode(\"City\");<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de crear las 3 <strong>etiquetas<\/strong> nuevas que se unir\u00e1n a las tarjetas que est\u00e1n creadas en nuestro ejm, tenemos que configurar los <strong>atributos<\/strong> de las mismas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Posteriormente a ello vamos a capturar el elemento padre donde vamos a incluir la nueva tarjeta. La sintaxis es.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$cards = document.querySelector(\".cards\");<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Din\u00e1micamente, hasta ahora hemos creado ya las <strong>etiquetas<\/strong>, lo \u00fanico, no est\u00e1n incorporadas a\u00fan al <strong>\u00e1rbol del DOM<\/strong>. Para ello debemos irlas agregando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente paso es agregar las <strong>etiquetas<\/strong> al <strong>\u00e1rbol del DOM<\/strong>, para ello tenemos un m\u00e9todo llamado <strong><em>appendChild()<\/em><\/strong> (agregar un hijo en ingl\u00e9s) donde especificamos el nodo que queremos agregar.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Agregar atributos a $img\n$img.setAttribute(\"src\",\"city.jpg\");\n\n\/\/ Agregamoa a $figcaption (elemento padre) $figcaptiontext\n$figcaption.appendChild($figcaptionText);\n\n\/\/ Agregamos a $figure (elemento padre) $img y $figcaption\n$figure.appendChild($img);\n$figure.appendChild($figcaption);\n\n\/\/ Agregamos a $cards (elemento padre) $figure\n$cards.appendChild($figure);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ejm completo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/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;Creando elementos din\u00e1micamente&lt;\/title&gt;\n&lt;style&gt;\n:root {\n--yellow-color: #f7df1e;\n--dark-color: #222;\n}\n\n.cards {\nborder: thin solid var(--dark-color);\npadding: 1rem;\n}\n\n.card {\ndisplay: inline-block;\nbackground-color: var(--dark-color);\ncolor: var(--yellow-color)\n}\n\n.card figcaption {\npadding: 1rem;\n}\n\n.rotate-45 {\ntransform: rotate(45deg);\n}\n\nimg {\nwidth: 20px;\nheight: 300px;\n}\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;h1&gt;Creando elementos din\u00e1micamente&lt;\/h1&gt;\n&lt;section class=\"cards\"&gt;\n&lt;figure class=\"card\"&gt;\n&lt;img src=\"tech.jpg\" 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=\"animals.avif\" 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=\"people.avif\" 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=\"arch.webp\" 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=\"nature.jpg\" alt=\"Nature\"&gt;\n&lt;figcaption&gt;Nature&lt;\/figcaption&gt;\n&lt;\/figure&gt;\n&lt;\/section&gt;\n\n&lt;script&gt;\n\/\/ Crear elementos\nconst $figure = document.createElement(\"figure\"),\n$img = document.createElement(\"img\"),\n$figcaption = document.createElement(\"figcaption\");\n\n\/\/ Crear nodo de texto para figcaption\n$figcaptionText = document.createTextNode(\"City\");\n\n\/\/ Capturar el elemento padre donde se incluir\u00e1 el contenido nuevo\n$cards = document.querySelector(\".cards\");\n\n\/\/ Agregar atributos a $img\n$img.setAttribute(\"src\",\"city.jpg\");\n$img.setAttribute(\"alt\",\"City\");\n\n\/\/ A\u00f1adimos la clase card\n$figure.classList.add(\"card\");\n\n\/\/ Agregar etiquetas al \u00e1rbol del DOM\n$figcaption.appendChild($figcaptionText);\n$figure.appendChild($img);\n$figure.appendChild($figcaption);\n$cards.appendChild($figure);\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/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>: los pasos a seguir son: primero creamos el nuevo elemento con <strong><em>createElement()<\/em><\/strong>, despu\u00e9s le damos valor si hemos de d\u00e1rselo con <strong>textContent<\/strong> en el caso de que sea <strong>texto plano<\/strong>, despu\u00e9s le agregamos los <strong>atributos<\/strong> mediante <strong>setAttribute()<\/strong>, despu\u00e9s le agregamos las <strong>clases<\/strong> mediante <strong>classList.add()<\/strong>, y por \u00faltimo al elemento padre le agregamos los nuevos elementos hijos mediante el m\u00e9todo <strong>appenChild()<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Otro ejm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos otro ejm para familiarizarnos con el uso<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const estaciones = [\"Primavera\", \"Verano\", \"Oto\u00f1o\", \"Invierno\"];\n\n$ul = document.createElement(\"ul\");\n\ndocument.write(\"&lt;h3&gt;Estaciones del a\u00f1o&lt;\/h3&gt;\");\n\n\/\/ Agregamos al body (nodo padre) la etiqueta &lt;ul&gt;\ndocument.body.appendChild($ul);\n\nestaciones.forEach(el=&gt; {\n  \/\/ Creamos las etiquetas &lt;li&gt;\n  const $li = document.createElement(\"li\");\n\n  \/\/ A\u00f1adimos texto a cada etiqueta &lt;li&gt;\n  $li.textContent = el;\n\n  \/\/ Agregamos al elemento padre ($ul) el elemento\n  \/\/ hijo ($li)\n  $ul.appendChild($li);\n});<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Otro ejm usando template strings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamoslo con un ejm<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const dias = [\"lunes\",\"martes\"],\n$ul = document.createElement(\"ul\");\n\ndocument.write(\"Dias de la semana\");\ndocument.body.appenChild($ul);\n\n\/\/ Utilizamos innerHTML (ojo, no estamos creando un nodo)\n\/\/ Inicializamos la propiedad innerHTML con un valor nulo\n$ul.innerHTML = \"\";\ndias.forEach(el =&gt; $ul.innerHTML += <code>&lt;li&gt;${el}&lt;\/li&gt;<\/code>;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Renderizar varios elementos, crear fragmentos din\u00e1micos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el <strong>DOM<\/strong> podemos crear <strong>fragmentos din\u00e1micos<\/strong>, que son como una <strong>variable<\/strong> que se crea din\u00e1micamente, y a ese <strong>fragmento del DOM<\/strong> le podemos estar iterando, de tal manera que en vez de estar iterando directamente al <strong>DOM<\/strong>, se lo iteramos a dicho <strong>fragmento del DOM<\/strong>, el cual est\u00e1 en memoria, no directamente en el <strong>DOM<\/strong>, y una vez tengamos todos los elementos cargados en ese <strong>fragmento<\/strong>, hacemos una sola y \u00fanica inserci\u00f3n al <strong>DOM<\/strong>, con todos los registros que nuestra petici\u00f3n haya capturado, lo que mejora el rendimiento de nuestra p\u00e1gina web. Hagamos un ejm para entenderlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const meses = [\"Enero\", \"Febrero\"],\n$ul = document.createElement(\"ul\"),\n$fragment = document.createDocumentFragment();\n\nmeses.forEach(el =&gt; {\n  const $li = document.createElement(\"li\");\n  $li.textContent = el;\n\n  \/\/ Le agregamos al nodo fragmento un appenChild()\n  $fragment.appendChild($li);\n});\n\ndocument.write(\"&lt;h3&gt;Meses del a\u00f1o&lt;\/h3&gt;\");\n$ul.appendChild($fragment);\ndocument.body.appendChild($ul);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">De esta manera hacemos una s\u00f3la inserci\u00f3n al <strong>DOM<\/strong>, y funciona perfectamente. Es una manera m\u00e1s \u00f3ptima para no pedirle tanta demanda de recursos al navegador del usuario que est\u00e1 interactuando con nuestra aplicaci\u00f3n.<\/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>: desde ahora hay que irse acostumbrando a utilizar <strong>fragmentos<\/strong> en vez de insertar directamente <strong>nodos<\/strong> al <strong>DOM<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los m\u00e9todos que hemos visto en este cap\u00edtulo son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>createElement(\u00abetiqueta\u00bb)<\/em><\/strong>: crea un nuevo <strong>elemento<\/strong>.<\/li>\n\n\n\n<li><strong><em>createTextNode(\u00abtexto\u00bb)<\/em><\/strong>: crea un nuevo <strong>nodo de texto<\/strong>.<\/li>\n\n\n\n<li><strong><em>appenChild()<\/em><\/strong>: agrega elementos al <strong>\u00e1rbol del DOM<\/strong>.<\/li>\n\n\n\n<li><strong><em>createDocumentFragment()<\/em><\/strong>: crea un <strong>fragmento<\/strong>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>En este cap\u00edtulo vamos a ver como crear elementos (etiquetas HTML) din\u00e1micamente a trav\u00e9s de Javascript. Hasta ahora hemos aprendido [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":800,"menu_order":8,"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-827","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 vamos a ver como crear elementos (etiquetas HTML) din\u00e1micamente a trav\u00e9s de Javascript. Hasta ahora hemos aprendido [&hellip;]","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/827","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=827"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/827\/revisions"}],"predecessor-version":[{"id":829,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/827\/revisions\/829"}],"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=827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}