{"id":229966,"date":"2022-11-24T18:50:00","date_gmt":"2022-11-24T15:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229966"},"modified":"2022-11-09T19:30:04","modified_gmt":"2022-11-09T16:30:04","slug":"elementos-dinamicos-elementos-estaticos-controladores-de-eventos-y-sus-complejidades","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/elementos-dinamicos-elementos-estaticos-controladores-de-eventos-y-sus-complejidades\/","title":{"rendered":"Elementos din\u00e1micos, elementos est\u00e1ticos, controladores de eventos y sus complejidades"},"content":{"rendered":"\n<p>Trabajar con elementos apilados en una p\u00e1gina, algunos que son anclas y otros que son elementos con controladores de eventos, a veces puede causar un comportamiento extra\u00f1o.<\/p>\n<p>En \u00faltima instancia, todo tiene que ver con la propagaci\u00f3n de eventos, pero si no ha tenido que lidiar con eso (o el burbujeo de eventos o algo as\u00ed), puede ser un desaf\u00edo.<\/p>\n<p>Y aqu\u00ed hay un ejemplo: \u00bfQu\u00e9 sucede si tiene una imagen envuelta en un ancla? \u00bfQu\u00e9 sucede cuando un elemento din\u00e1mico que se coloca a trav\u00e9s de JavaScript despu\u00e9s de que se carga la p\u00e1gina carga otro elemento din\u00e1mico? Adem\u00e1s de eso, \u00bfdesea evitar que la p\u00e1gina se redirija cuando se hace clic en el elemento din\u00e1mico pero a\u00fan as\u00ed dirigir cuando se hace clic en la imagen?<\/p>\n<p>Puede sonar simple, y en algunos casos lo es, pero si tiene un elemento transparente superpuesto a la imagen original completa, puede convertirse en un desaf\u00edo completamente diferente.<\/p>\n<p>Aqu\u00ed es donde entra en juego la comprensi\u00f3n de los objetivos de los eventos. Pero antes de entrar en c\u00f3mo resolverlo, intentar\u00e9 resumir todo en una explicaci\u00f3n m\u00e1s simple y diagramar c\u00f3mo se representa en el DOM.<\/p>\n<h2>Elementos din\u00e1micos, elementos est\u00e1ticos y controladores de eventos<\/h2>\n<p>As\u00ed que trata de imaginar esto: Tienes&#8230;<\/p>\n<ul>\n<li>Una p\u00e1gina que tiene una imagen y la imagen est\u00e1 envuelta en un ancla que te llevar\u00e1, por ejemplo, a otra p\u00e1gina.<\/li>\n<li>Cuando se carga la p\u00e1gina, se crean dos elementos din\u00e1micos. Cuando se hace clic en el primero, deber\u00eda mostrar el segundo elemento din\u00e1mico.<\/li>\n<li>Cuando se hace clic en la primera din\u00e1mica, no deber\u00eda redirigir la p\u00e1gina.<\/li>\n<li>Cuando se hace clic en la imagen original, deber\u00eda comportarse como se esperaba.<\/li>\n<\/ul>\n<p>La parte dif\u00edcil de esto es que los elementos din\u00e1micos se colocan encima de la combinaci\u00f3n existente de ancla e imagen.<\/p>\n<h3>Una mirada al DOM<\/h3>\n<p>Esto significa que el DOM se ver\u00eda as\u00ed:<\/p>\n<p>Observe en la imagen de arriba que el <strong>ancla<\/strong> activa la <strong>imagen<\/strong> y el <strong>elemento din\u00e1mico<\/strong> activa la <strong>superposici\u00f3n din\u00e1mica<\/strong>.<\/p>\n<p>Entonces, \u00bfc\u00f3mo hacemos para mostrar el segundo elemento din\u00e1mico cuando se hace clic en el primero sin salir de la p\u00e1gina? Puede hacer esto examinando el objetivo del evento que se activ\u00f3.<\/p>\n<h3>El c\u00f3digo para el manejo de eventos<\/h3>\n<p>Usar\u00e9 jQuery a continuaci\u00f3n, ya que la mayor\u00eda de mis lectores trabajan con WordPress y WordPress se env\u00eda con jQuery, pero esto tambi\u00e9n se puede manejar con JavaScript est\u00e1ndar (pero tratar de seguir ese camino es m\u00e1s de lo que estoy dispuesto a explicar en este particular correo).<\/p>\n<p>Dicho esto, aqu\u00ed est\u00e1 la esencia de la cual explicar\u00e9 lo que est\u00e1 pasando <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c2d33cce48603de444d2a620927f32da#file-00-example-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">con el c\u00f3digo:<\/a><\/strong><\/p>\n<pre><code>$('.acme-element').each(function(e) { \n  var $anchor = $(this).parents('a');\n  $(this).on('click', function(evt) {\n    if(e.target !== this) {\n      evt.preventDefault();\n    }\n    \/\/ Here, you may want to action to redirect to an original anchor.\n  });\n});<\/code><\/pre>\n<p>Primero, asumo que hay m\u00faltiples elementos din\u00e1micos, de ah\u00ed el motivo de <a href=\"https:\/\/api.jquery.com\/jquery.each\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cada<\/a> iterador.<\/p>\n<p>A continuaci\u00f3n, crea una referencia al elemento de <strong>anclaje<\/strong> que es el padre de la instancia actual del elemento din\u00e1mico (usar <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/var\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">var<\/a> aqu\u00ed es importante para que siempre se refiera al elemento que es el padre de la instancia actual de la iteraci\u00f3n en lugar de sobrescribir una instancia anterior ).<\/p>\n<p>Cuando se hace clic en el elemento, configuramos un controlador de <strong>clics<\/strong> para que podamos ver el objetivo del evento del clic. Aqu\u00ed es donde se vuelve un poco confuso.<\/p>\n<p>Tenemos variables <strong>e<\/strong> y <strong>evt<\/strong>, cada una de las cuales se refiere al controlador de eventos para un elemento espec\u00edfico. En el c\u00f3digo de arriba:<\/p>\n<ul>\n<li><strong>e<\/strong> se refiere al evento ligado a nuestro elemento din\u00e1mico,<\/li>\n<li><strong>evt<\/strong> se refiere al elemento, pero tambi\u00e9n afectar\u00e1 el proceso de generaci\u00f3n de eventos, lo que significa que activar\u00e1 eventos en el resto del DOM.<\/li>\n<\/ul>\n<p>Y as\u00ed, en nuestro condicional, evaluamos el objetivo del primer controlador de eventos para asegurarnos de que no coincida con el elemento espec\u00edfico. A partir de ah\u00ed, como puede ver en el comentario del c\u00f3digo, puede determinar c\u00f3mo desea proceder (tal vez seguir adelante y dejar que navegue a otro lugar o haga otra cosa).<\/p>\n<p>En \u00faltima instancia, es su llamada. Pero cuando se encuentra en un aprieto de elementos din\u00e1micos, elementos est\u00e1ticos y controladores de eventos, puede complicarse r\u00e1pidamente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando se encuentra en un aprieto de elementos din\u00e1micos, elementos est\u00e1ticos y controladores de eventos, puede complicarse r\u00e1pidamente.<\/p>\n","protected":false},"author":1,"featured_media":224006,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,727],"tags":[1172],"class_list":["post-229966","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-javascript-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229966"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229966\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224006"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}