{"id":230308,"date":"2022-11-24T19:00:00","date_gmt":"2022-11-24T16:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230308"},"modified":"2022-11-09T21:02:59","modified_gmt":"2022-11-09T18:02:59","slug":"elementos-dinamicos-elementos-estaticos-manipuladores-de-eventos-e-suas-complexidades","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/elementos-dinamicos-elementos-estaticos-manipuladores-de-eventos-e-suas-complexidades\/","title":{"rendered":"Elementos din\u00e2micos, elementos est\u00e1ticos, manipuladores de eventos e suas complexidades"},"content":{"rendered":"\n<p>Trabalhar com elementos empilhados em uma p\u00e1gina, alguns que s\u00e3o \u00e2ncoras e outros que s\u00e3o elementos com manipuladores de eventos, \u00e0s vezes pode causar um comportamento estranho.<\/p>\n<p>Em \u00faltima an\u00e1lise, tudo tem a ver com a propaga\u00e7\u00e3o de eventos, mas se voc\u00ea n\u00e3o teve que lidar com isso (ou eventos borbulhantes ou algo assim), pode ser um desafio.<\/p>\n<p>E aqui est\u00e1 um exemplo: E se voc\u00ea tiver uma imagem envolvida em uma \u00e2ncora. O que acontece quando voc\u00ea coloca um elemento din\u00e2mico via JavaScript ap\u00f3s o carregamento da p\u00e1gina que carrega outro elemento din\u00e2mico? Al\u00e9m disso, voc\u00ea deseja impedir que a p\u00e1gina seja redirecionada quando o elemento din\u00e2mico for clicado, mas ainda direto quando a imagem for clicada?<\/p>\n<p>Pode parecer simples \u2013 e em alguns casos \u00e9 \u2013 mas se voc\u00ea tiver um elemento transparente sobrepondo toda a imagem original, isso pode se tornar um outro desafio.<\/p>\n<p>\u00c9 aqui que a compreens\u00e3o dos alvos de eventos entra em jogo. Mas antes de entrar em como resolv\u00ea-lo, tentarei destilar tudo em uma explica\u00e7\u00e3o mais simples e diagramar como \u00e9 renderizado no DOM.<\/p>\n<h2>Elementos din\u00e2micos, elementos est\u00e1ticos e manipuladores de eventos<\/h2>\n<p>Ent\u00e3o tente imaginar isso: Voc\u00ea tem\u2026<\/p>\n<ul>\n<li>Uma p\u00e1gina que tem uma imagem e a imagem est\u00e1 envolta em uma \u00e2ncora que o levar\u00e1 a, digamos, outra p\u00e1gina.<\/li>\n<li>Quando a p\u00e1gina \u00e9 carregada, dois elementos din\u00e2micos s\u00e3o criados. Quando o primeiro \u00e9 clicado, ele deve exibir o segundo elemento din\u00e2mico.<\/li>\n<li>Quando a primeira din\u00e2mica \u00e9 clicada, ela n\u00e3o deve redirecionar a p\u00e1gina.<\/li>\n<li>Quando a imagem original \u00e9 clicada, ela deve se comportar conforme o esperado.<\/li>\n<\/ul>\n<p>A parte dif\u00edcil disso \u00e9 que os elementos din\u00e2micos s\u00e3o colocados em cima da combina\u00e7\u00e3o de \u00e2ncora e imagem existente.<\/p>\n<h3>Um olhar sobre o DOM<\/h3>\n<p>Isso significa que o DOM ficaria mais ou menos assim:<\/p>\n<p>Observe na imagem acima que a <strong>\u00e2ncora<\/strong> aciona a <strong>imagem<\/strong> e o <strong>elemento din\u00e2mico<\/strong> aciona a <strong>sobreposi\u00e7\u00e3o din\u00e2mica<\/strong>.<\/p>\n<p>Ent\u00e3o, como vamos exibir o segundo elemento din\u00e2mico quando o primeiro clicou sem sair da p\u00e1gina? Voc\u00ea pode fazer isso examinando o destino do evento que foi acionado.<\/p>\n<h3>O C\u00f3digo para Tratamento de Eventos<\/h3>\n<p>Estarei usando jQuery abaixo, j\u00e1 que a maioria dos meus leitores trabalha com WordPress e WordPress vem com jQuery, mas isso tamb\u00e9m pode ser tratado com JavaScript vanilla (mas tentar seguir esse caminho \u00e9 mais do que estou disposto a explicar neste particular publicar).<\/p>\n<p>Com isso dito, aqui est\u00e1 a ess\u00eancia da qual vou explicar o que est\u00e1 acontecendo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c2d33cce48603de444d2a620927f32da#file-00-example-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">com o 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>Primeiro, estou assumindo que existem v\u00e1rios elementos din\u00e2micos, portanto, o 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>Em seguida, ele cria uma refer\u00eancia ao elemento <strong>\u00e2ncora<\/strong> que \u00e9 pai da inst\u00e2ncia atual do elemento din\u00e2mico (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> aqui \u00e9 importante para que sempre se refira ao elemento que \u00e9 o pai da inst\u00e2ncia atual da itera\u00e7\u00e3o versus substituir uma inst\u00e2ncia anterior ).<\/p>\n<p>Quando o elemento \u00e9 clicado, configuramos um manipulador de <strong>cliques<\/strong> para que possamos dar uma olhada no destino do evento do evento click. \u00c9 aqui que fica um pouco confuso.<\/p>\n<p>Temos vari\u00e1veis <strong>\u200b\u200be<\/strong> e <strong>evt<\/strong>, cada uma das quais se refere ao manipulador de eventos para um elemento espec\u00edfico. No c\u00f3digo acima:<\/p>\n<ul>\n<li><strong>e<\/strong> refere-se ao evento vinculado ao nosso elemento din\u00e2mico,<\/li>\n<li><strong>evt<\/strong> se refere ao elemento, mas tamb\u00e9m afetar\u00e1 o processo de borbulhamento de eventos, o que significa que ele acionar\u00e1 eventos em todo o resto do DOM.<\/li>\n<\/ul>\n<p>E assim, em nossa condicional, avaliamos o destino do primeiro manipulador de eventos para garantir que ele n\u00e3o corresponda ao elemento espec\u00edfico. A partir da\u00ed, como voc\u00ea pode ver no coment\u00e1rio do c\u00f3digo, voc\u00ea pode determinar como deseja prosseguir (como talvez seguir em frente e deix\u00e1-lo navegar em outro lugar ou fazer outra coisa).<\/p>\n<p>Em \u00faltima an\u00e1lise, a decis\u00e3o \u00e9 sua. Mas quando voc\u00ea entra em um v\u00ednculo de elementos din\u00e2micos, elementos est\u00e1ticos e manipuladores de eventos, pode ficar complicado rapidamente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando voc\u00ea entra em um v\u00ednculo de elementos din\u00e2micos, elementos est\u00e1ticos e manipuladores de eventos, pode ficar complicado rapidamente.<\/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":[898,722,733],"tags":[1170],"class_list":["post-230308","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-javascript-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230308"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230308\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224006"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}