{"id":845,"date":"2024-07-31T07:44:18","date_gmt":"2024-07-31T05:44:18","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=845"},"modified":"2024-07-31T07:44:18","modified_gmt":"2024-07-31T05:44:18","slug":"015-dom-flujo-de-eventos-burbuja-y-captura","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/13-dom-document-object-model\/015-dom-flujo-de-eventos-burbuja-y-captura\/","title":{"rendered":"015. DOM: Flujo de Eventos (Burbuja y Captura)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este cap\u00edtulo veremos como trabaja <strong>Javascript<\/strong> con los <strong>eventos<\/strong>. El m\u00e9todo <strong><em>addEventListener()<\/em><\/strong> dispone de un tercer par\u00e1metro que nos permite elegir el <strong>tipo de flujo<\/strong> que deseamos (<strong>burbuja<\/strong> o <strong>captura<\/strong>), y es lo que vamos a trabajar en este cap\u00edtulo.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">El <strong>flujo de eventos<\/strong> es la manera mediante la cual se propaga dicho <strong>evento<\/strong>. Una vez que un <strong>evento<\/strong> se origina, tiene una <strong>propagaci\u00f3n<\/strong> a lo largo del <strong>\u00e1rbol del DOM<\/strong>, por defecto, dicha <strong>propagaci\u00f3n<\/strong> se va dando del elemento m\u00e1s interno al mas externo, que es el documento, y esa fase es denominada <strong>fase de burbuja<\/strong>, que es el esquema por defecto que los navegadores soportan, de hecho no hay que hacer nada a nuestros <strong>manejadores m\u00faltiples<\/strong> para que funcione esta <strong>fase de burbuja<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento de la fase de captura<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En los cap\u00edtulos anteriores estuvimos asignando <strong>eventos<\/strong> de manera individual a cada uno de los botones, pero imaginemos que en una interfaz din\u00e1mica, dicha botonera se forma a partir de un cat\u00e1logo que tengamos en una base de datos, por lo que tenemos que ir a consultar la base de datos, imprimir un bot\u00f3n por cada registro que venga de la base de datos, y a ese bot\u00f3n asignarle din\u00e1micamente un <strong>evento<\/strong>, para lo que tendr\u00edamos que asignar dinamicamente el <strong>evento<\/strong> a todos los elementos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos un ejm para entender todo de mejor manera.<\/p>\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;Flujo de eventos&lt;\/title&gt;\n&lt;style&gt;\n.eventos-flujo div {\npadding: 4rem;\nfont-size: 2rem;\ntext-align: center;\n}\n\n.uno {\nbackground-color: yellow;\n}\n\n.dos {\nbackground-color: gold;\n}\n\n.tres {\nbackground-color: lightyellow;\n}\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;h1&gt;Flujo de eventos&lt;\/h1&gt;\n&lt;section class=\"eventos-flujo\"&gt;\n &lt;div class=\"uno\"&gt;\n  1\n  &lt;div class=\"dos\"&gt;\n   2\n   &lt;div class=\"tres\"&gt;\n     3\n   &lt;\/div&gt;\n &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;\/section&gt;\n\n&lt;script&gt;\nconst $divEventos = document.querySelectorAll(\".eventos-flujo div\");\nconsole.log($divEventos);\n\/\/ Devuelve un nodeList\n\n\/\/ Vamos a crear previamente la funci\u00f3n flujoEventos\n\/\/ de donde va a tirar nuestro bucle forEach\nfunction flujoEventos(e) {\nconsole.log(\"Hola\")\n}\n\n$divEventos.forEach(div =&gt; {\ndiv.addEventListener(\"click\", flujoEventos);\n});\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando hago clic al div3, internamente la div3 est\u00e1 dentro de la div2 y de la div1, y como los 3 elementos tienen asignado ese evento clic, ah\u00ed vemos la propagaci\u00f3n, la div3 imprimir\u00e1 en consola 3 veces Hola, la div2 lo har\u00e1 dos veces, y la div1 lo har\u00e1 \u00fanicamente una vez.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a cambiar la funci\u00f3n <em>flujoEventos()<\/em> con la siguiente sintaxis.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">function flujoEventos(e) {\n  console.log(`Hola, te saluda ${this.className}, el clic\nlo origin\u00f3 ${e.target.className}`)\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A esto se le denomina la <strong>fase de burbuja<\/strong>, porque va del elemento m\u00e1s interno, que tiene asociado el <strong>evento<\/strong>, hacia el m\u00e1s externo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n <strong><em>addEventListener()<\/em><\/strong> tiene un tercer par\u00e1metro opcional, que son una serie de opciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>false<\/em><\/strong>: estamos en <strong>fase de burbuja<\/strong>, por lo tanto, el <strong>flujo de los eventos<\/strong> se propaga desde el m\u00e1s interno hasta el m\u00e1s externo dentro del <strong>\u00e1rbol del DOM<\/strong>.<\/li>\n\n\n\n<li><strong><em>true<\/em><\/strong>: origina la <strong>fase de captura<\/strong>, la cual va de los <strong>eventos<\/strong> m\u00e1s externos hasta el elemento m\u00e1s interno.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fase de burbuja<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La sintaxis de nuestra <strong>funci\u00f3n manejadora <em>addEventListener()<\/em><\/strong>&nbsp; ser\u00eda la siguiente.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">div.addEventListener(\"click\", flujoEventos);\n\/\/ O bien\ndiv.addEventListener(\"click\", flujoEventos, false);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fase de captura<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">div.addEventListener(\"click\", flujoEventos, true);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En la pr\u00e1ctica, normalmente no se utiliza este tercer par\u00e1metro de la funci\u00f3n <strong><em>addEventListener()<\/em><\/strong>. En foros de dise\u00f1o web se comenta que cuando la estructura del <strong>DOM<\/strong> tiene muchos elementos, existen comprobaciones matem\u00e1ticas las cuales dicen que en este tipo de elementos concatenados donde tenemos el mismo <strong>evento<\/strong> asociado a elemento padre, hijo, nieto&#8230; es decir, que se tenga que propagar el <strong>evento<\/strong>, funciona mejor la fase de captura que la de burbuja, es m\u00e1s \u00f3ptima, ya que no consume tanta memoria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tanto <strong>fase de captura<\/strong> como <strong>de burbuja<\/strong> la podemos omitir si delegamos los <strong>eventos<\/strong> a un elemento padre mas externo, lo que ayudar\u00e1 a mejorar el rendimiento de la memoria y los recursos que nuestra aplicaci\u00f3n ocupe en el navegador.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Adicionales<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sobre el tercer par\u00e1metro, adem\u00e1s de tener <strong><em>true<\/em><\/strong> o <strong><em>false<\/em><\/strong>, tenemos otras palabras reservadas.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Podemos pasar un objeto al que le podemos pasar las siguientes propiedades\n<ul class=\"wp-block-list\">\n<li><strong><em>capture<\/em><\/strong>: esta propiedad hace referencia a si la fase es de burbuja o de captura, dependiendo de si el valor que asignamos a esta propiedad es false o true.<\/li>\n\n\n\n<li><strong><em>once<\/em><\/strong>: si lo activamos a true, nuestro evento se va a ejecutar una s\u00f3la vez, si lo activamos a false se ejecutar\u00e1 siempre<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La sintaxis de nuestro <strong><em>addEventListener()<\/em><\/strong> ser\u00eda la siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">div.addEventListener(\"click\", flujoEventos, {\ncapture: (true \/ false),\nonce: (true \/ false),\n});<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En este cap\u00edtulo veremos como trabaja Javascript con los eventos. El m\u00e9todo addEventListener() dispone de un tercer par\u00e1metro que nos permite elegir el tipo de flujo que deseamos (burbuja o captura), y es lo que vamos a trabajar en este cap\u00edtulo.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":800,"menu_order":14,"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-845","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 veremos como trabaja Javascript con los eventos. El m\u00e9todo addEventListener() dispone de un tercer par\u00e1metro que nos permite elegir el tipo de flujo que deseamos (burbuja o captura), y es lo que vamos a trabajar en este cap\u00edtulo.","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/845","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=845"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/845\/revisions"}],"predecessor-version":[{"id":847,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/845\/revisions\/847"}],"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=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}