{"id":3140,"date":"2015-03-23T10:59:32","date_gmt":"2015-03-23T12:59:32","guid":{"rendered":"https:\/\/www.kadunew.com\/blog\/?p=3140"},"modified":"2015-05-09T16:39:17","modified_gmt":"2015-05-09T18:39:17","slug":"atribuindo-eventos-a-elementos-criados-dinamicamente","status":"publish","type":"post","link":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente","title":{"rendered":"Atribuindo eventos a elementos criados dinamicamente"},"content":{"rendered":"<p>Trabalhar com eventos no JavaScript nem sempre \u00e9 uma tarefa f\u00e1cil. H\u00e1 momentos que precisamos retirar um evento de um elemento ou adicionar um evento a determinado elemento HTML. Vou mostrar duas fun\u00e7\u00f5es de manipula\u00e7\u00e3o de eventos para os elementos ou seletores selecionados. Estou me referindo aos m\u00e9todos .on() e .off(). Neste artigo vou mostrar uma breve introdu\u00e7\u00e3o a estes dois manipuladores e como resolver algumas dificuldade frequentes de quem trabalha com JavaScript.<\/p>\n<p>Trabalhar com esses m\u00e9todos de associa\u00e7\u00e3o de eventos \u00e9 realmente f\u00e1cil de adicionar um evento que n\u00e3o est\u00e1 mais \u201couvindo\u201d seu JavaScript. Da mesma forma \u00e9 f\u00e1cil para remover o evento de um elemento. Voc\u00ea pode querer adicionar um evento ou retirar um evento de um elemento que foi criado depois da p\u00e1gina carregar. .on(), .off() e namespaces v\u00e3o lhe ajudar.<\/p>\n<p>Imagine que voc\u00ea tenha o c\u00f3digo HTML abaixo:<\/p>\n<pre class=\"brush: xml; title: HTML; notranslate\" title=\"HTML\">\r\n&lt;body&gt;\r\n    &lt;h2&gt;Adicionar itens&lt;\/h2&gt;\r\n    &lt;input type=&quot;text&quot; name=&quot;checkListItem&quot; id=&quot;inpudAdd&quot;\/&gt;\r\n    &lt;button id=&quot;button&quot;&gt;OK&lt;\/button&gt;\r\n    &lt;div class=&quot;boxLista&quot;&gt;&lt;\/div&gt;\r\n&lt;\/body&gt;\r\n<\/pre>\n<p>E o seguinte c\u00f3digo jQuery<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$('#button').click(function(){\r\n    var textAdd = $('#inpudAdd').val();\r\n    $('#inpudAdd').val('');\r\n    $('.boxLista').append('&lt;div class=&quot;item&quot;&gt;' + textAdd + '&lt;\/div&gt;');\r\n});\r\n<\/pre>\n<p>Bom, n\u00e3o precisamos entender muito de jQuery para entender o que o c\u00f3digo acima faz. Resumindo: O usu\u00e1rio digita um texto no input, clica em ok, o texto \u00e9 adicionado em uma div.<br \/>\nCaso o usu\u00e1rio queira exclui o texto clicando sobre a linha podemos adicionar a seguinte linha de c\u00f3digo:<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$(document).on('click', '.item', function(){\r\n    $(this).remove();\r\n});\r\n<\/pre>\n<p>Num primeiro momento muitos s\u00e3o capazes de dizer que isso funciona. A verdade \u00e9 que isso n\u00e3o vai funcionar. Essa \u00e9 uma d\u00favida muito comum por quem est\u00e1 come\u00e7ando com JavaScript: \u201c<strong>Por que meus eventos n\u00e3o funcionam quando clico em elementos criado ap\u00f3s o carregamento da p\u00e1gina.<\/strong>\u201d A resposta \u00e9 simples. Ao carregar a p\u00e1gina a biblioteca jQuery \/Javascript procura por todos os elementos quando o DOM \u00e9 carregado. Quando seu documento estiver pronto a biblioteca j\u00e1 ter\u00e1 decidido que n\u00e3o h\u00e1 uma classe chamada \u201c.item\u201d para ser removida com a m\u00e9todo .remove(), e seu script n\u00e3o vai funcionar. <\/p>\n<p>A maioria dos c\u00f3digos JavaScript \u00e9 acionado a partir de um evento. A p\u00e1gina \u00e9 carregada, voc\u00ea pressiona uma tecla, clica em um bot\u00e3o, etc. Tudo isso s\u00e3o eventos.<\/p>\n<h2>Manipulador de eventos on()<\/h2>\n<p>Para resolver o problema descrito vamos usar o manipulador de evento .on() que nos permite lidar com a manipula\u00e7\u00e3o do DOM em tempo real. O m\u00e9todo .no () fornece todas as funcionalidades necess\u00e1rias para anexar manipuladores de eventos.  Ele funciona como um manipulador geral de eventos que pega o evento, seu seletor, e uma a\u00e7\u00e3o a ser disparada. Exemplo da sintaxe .on() \u00e9 algo como:<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$(document).on('event', 'selector', function() {\r\n    Realize Alguma Coisa!\r\n});\r\n<\/pre>\n<p>Traduzindo essa sintaxe para o nosso problema ter\u00edamos o seguinte c\u00f3digo:<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$(document).on('click', '.item', function(){\r\n    $(this).remove();\r\n});\r\n<\/pre>\n<p><iframe loading=\"lazy\" width=\"100%\" height=\"300\" src=\"http:\/\/jsfiddle.net\/kadunew\/a2o0f9gd\/1\/embedded\/\" allowfullscreen=\"allowfullscreen\" frameborder=\"0\"><\/iframe><\/p>\n<p>Repare no exemplo acima que usamos $(document).on(&#8216;event&#8217;, &#8216;selector&#8217;, function(). Usei document pois ele \u00e9 o documento em si, a p\u00e1gina e essa sempre ir\u00e1 existir indepenendete se o seu seletor j\u00e1 foi criado ou n\u00e3o, ou seja, o evento sempre ir\u00e1 disparar. Nada nos impede de usar algo um pouco diferente, por exemplo.<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$(&quot;#box&quot;).on(&quot;click&quot;, function() {\r\n  \/\/seu c\u00f3digo aqui\r\n});\r\n<\/pre>\n<p>Caso utiliza o script acima e o seletor #box  ainda n\u00e3o exista na \u00e1rvore do documento (DOM) ou tiver sido removido o evento n\u00e3o ser\u00e1 executado. Na d\u00favida utilize document, como dito anteriormente ele sempre estar\u00e1 presente no DOM.<\/p>\n<p>A diferen\u00e7a fica por conta do seguinte se voc\u00ea estiver utilizando $(seletor).(event, function) e o seu seletor ainda n\u00e3o existir no DOM ou tiver sido removido o evento n\u00e3o ser\u00e1 executado. Por\u00e9m se voc\u00ea utilizar $(document).on(evento, seletor, function) o document sempre ir\u00e1 existir na p\u00e1gina independente se o seletor j\u00e1 est\u00e1 criado ou foi removido e adicionado posteriormente, fazendo com que o evento dispare.<\/p>\n<h2>Como usar namespaces em jQuery<\/h2>\n<p>Como voc\u00ea pode garantir de uma maneira segura que n\u00e3o vai acidentalmente desvincular outros manipuladores de clique. Por exemplo, clicar em um bot\u00e3o e ser disparado dois eventos ao mesmo tempo. Eventos namespaces resolvem o problema. Para isso utilizamos o m\u00e9todo .on()  informando o evento que queremos e o nomamespace separados por um ponto(.) e a fun\u00e7\u00e3o que dever\u00e1 ser executada.Abaixo dois exemplos de c\u00f3digo. O primeiro n\u00e3o usa namespaces. Nesse caso n\u00e3o seria poss\u00edvel desassociar os eventos. J\u00e1 no segundo caso fizemos uso de namespaces.<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n\/*Sem namespaces*\/\r\n$('#button').click(function(){\r\n    console.log(&quot;Primeiro evento click&quot;);\r\n});\r\n\r\n$('#button').click(function(){\r\n    console.log(&quot;Segundo evento click&quot;);\r\n});\r\n\r\n\/*Com namespaces*\/\r\n$(document).on(&quot;click.primeiro&quot;, function() {\r\nconsole.log(&quot;Primeiro evento click&quot;);\r\n});\r\n$(document).on(&quot;click.segundo&quot;, function() {\r\nconsole.log(&quot;Segundo evento click&quot;);\r\n});\r\n<\/pre>\n<p>Se executarmos os dois scripts perceba que ambos ir\u00e3o mostrar as duas mensagens, por\u00e9m no segundo exemplo como fizemos uso de namespaces (um apelido) conseguimos desassoicar os eventos.<\/p>\n<h2>Desassociando eventos com .off()<\/h2>\n<p>Dependendo do tamanho do seu c\u00f3digo, fun\u00e7\u00f5es e uso de outras bibliotecas pode ocorrer de voc\u00ea precisar disparar o mesmo evento num elemento que j\u00e1 possui evento associado a ele. Como vimos no exemplo anterior ao clicar no bot\u00e3o os dois eventos ser\u00e3o disparados. Mas e se eu quiser que apenas um deles seja disparado.<\/p>\n<p>Com o m\u00e9todo  .off () podemos retirar eventos dos elementos. Todos os par\u00e2metros desse m\u00e9todo s\u00e3o opcionais &#8211; usando os par\u00e2metros lhe permitir\u00e1 ser mais espec\u00edfico na manipula\u00e7\u00e3o de eventos que voc\u00ea deseja desativar.  No exemplo abaixo acrescentamos uma linha que removera o evento no qual tem como namespace o valor primeiro. Agora ao clicar no bot\u00e3o apenas a mensagem \u201cSegundo evento click\u201d ir\u00e1 aparecer no console.<\/p>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n$(document).on(&quot;click.primeiro&quot;, function() {\r\n  console.log(&quot;Primeiro evento click&quot;);\r\n});\r\n$(document).on(&quot;click.segundo&quot;, function() {\r\n  console.log(&quot;Segundo evento click&quot;);\r\n});\r\n\r\n$(document).off(&quot;click.primeiro&quot;);\r\n<\/pre>\n<h3>Outros exemplos de uso do m\u00e9todo .off()<\/h3>\n<pre class=\"brush: jscript; title: jQuery; notranslate\" title=\"jQuery\">\r\n\/\/remove todos eventos cliques\r\n$(document).off(&quot;click&quot;);\r\n\/\/remove qualquer evento associado a todos par\u00e1grafos\r\n$(p).off();\r\n<\/pre>\n<p>Curta a p\u00e1gina do <a href=\"https:\/\/www.facebook.com\/pages\/Kadunew-Artigos-e-tutoriais-sobre-Web-Design\/787883281258323\" title=\"Artigos e tutoriais sobre Web Design\" target=\"_blank\">blog kadunew<\/a> no Facebook. Siga-me no Twitter: <a href=\"http:\/\/twitter.com\/kadunew\" rel=\"nofollow\">@kadunew<\/a> ou assine nosso <a href=\"https:\/\/www.kadunew.com\/blog\/feed\">Feed<\/a> e fique por dentro de todas atualiza\u00e7\u00f5es aqui do blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trabalhar com eventos no JavaScript nem sempre \u00e9 uma tarefa f\u00e1cil. H\u00e1 momentos que precisamos retirar um evento de um elemento ou adicionar um evento a determinado elemento HTML. Vou mostrar duas fun\u00e7\u00f5es de manipula\u00e7\u00e3o de eventos para os elementos ou seletores selecionados. Estou me referindo aos m\u00e9todos .on() e .off(). Neste artigo vou mostrar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-3140","post","type-post","status-publish","format-standard","hentry","category-jquery"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Atribuindo eventos a elementos criados dinamicamente<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Atribuindo eventos a elementos criados dinamicamente\" \/>\n<meta property=\"og:description\" content=\"Trabalhar com eventos no JavaScript nem sempre \u00e9 uma tarefa f\u00e1cil. H\u00e1 momentos que precisamos retirar um evento de um elemento ou adicionar um evento a determinado elemento HTML. Vou mostrar duas fun\u00e7\u00f5es de manipula\u00e7\u00e3o de eventos para os elementos ou seletores selecionados. Estou me referindo aos m\u00e9todos .on() e .off(). Neste artigo vou mostrar [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente\" \/>\n<meta property=\"og:site_name\" content=\"KADUNEW\" \/>\n<meta property=\"article:published_time\" content=\"2015-03-23T12:59:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-05-09T18:39:17+00:00\" \/>\n<meta name=\"author\" content=\"Kadu Oliveira\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kadu Oliveira\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente\",\"url\":\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente\",\"name\":\"Atribuindo eventos a elementos criados dinamicamente\",\"isPartOf\":{\"@id\":\"https:\/\/www.kadunew.com\/blog\/#website\"},\"datePublished\":\"2015-03-23T12:59:32+00:00\",\"dateModified\":\"2015-05-09T18:39:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/07b2297c4825efbd1e9f2a1018926b05\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.kadunew.com\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JS\/jQuery\",\"item\":\"https:\/\/www.kadunew.com\/blog\/category\/jquery\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Atribuindo eventos a elementos criados dinamicamente\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.kadunew.com\/blog\/#website\",\"url\":\"https:\/\/www.kadunew.com\/blog\/\",\"name\":\"KADUNEW\",\"description\":\"Artigos sobre Front-End e Programa\u00e7\u00e3o web\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.kadunew.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/07b2297c4825efbd1e9f2a1018926b05\",\"name\":\"Kadu Oliveira\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/780660fded589936b30467c54c99d51a?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/780660fded589936b30467c54c99d51a?s=96&r=g\",\"caption\":\"Kadu Oliveira\"},\"sameAs\":[\"https:\/\/www.kadunew.com\/blog\"],\"url\":\"https:\/\/www.kadunew.com\/blog\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Atribuindo eventos a elementos criados dinamicamente","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente","og_locale":"pt_BR","og_type":"article","og_title":"Atribuindo eventos a elementos criados dinamicamente","og_description":"Trabalhar com eventos no JavaScript nem sempre \u00e9 uma tarefa f\u00e1cil. H\u00e1 momentos que precisamos retirar um evento de um elemento ou adicionar um evento a determinado elemento HTML. Vou mostrar duas fun\u00e7\u00f5es de manipula\u00e7\u00e3o de eventos para os elementos ou seletores selecionados. Estou me referindo aos m\u00e9todos .on() e .off(). Neste artigo vou mostrar [&hellip;]","og_url":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente","og_site_name":"KADUNEW","article_published_time":"2015-03-23T12:59:32+00:00","article_modified_time":"2015-05-09T18:39:17+00:00","author":"Kadu Oliveira","twitter_misc":{"Escrito por":"Kadu Oliveira","Est. tempo de leitura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente","url":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente","name":"Atribuindo eventos a elementos criados dinamicamente","isPartOf":{"@id":"https:\/\/www.kadunew.com\/blog\/#website"},"datePublished":"2015-03-23T12:59:32+00:00","dateModified":"2015-05-09T18:39:17+00:00","author":{"@id":"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/07b2297c4825efbd1e9f2a1018926b05"},"breadcrumb":{"@id":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.kadunew.com\/blog\/jquery\/atribuindo-eventos-a-elementos-criados-dinamicamente#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.kadunew.com\/blog"},{"@type":"ListItem","position":2,"name":"JS\/jQuery","item":"https:\/\/www.kadunew.com\/blog\/category\/jquery"},{"@type":"ListItem","position":3,"name":"Atribuindo eventos a elementos criados dinamicamente"}]},{"@type":"WebSite","@id":"https:\/\/www.kadunew.com\/blog\/#website","url":"https:\/\/www.kadunew.com\/blog\/","name":"KADUNEW","description":"Artigos sobre Front-End e Programa\u00e7\u00e3o web","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kadunew.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/07b2297c4825efbd1e9f2a1018926b05","name":"Kadu Oliveira","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.kadunew.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/780660fded589936b30467c54c99d51a?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/780660fded589936b30467c54c99d51a?s=96&r=g","caption":"Kadu Oliveira"},"sameAs":["https:\/\/www.kadunew.com\/blog"],"url":"https:\/\/www.kadunew.com\/blog\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/posts\/3140"}],"collection":[{"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/comments?post=3140"}],"version-history":[{"count":15,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/posts\/3140\/revisions"}],"predecessor-version":[{"id":3882,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/posts\/3140\/revisions\/3882"}],"wp:attachment":[{"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/media?parent=3140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/categories?post=3140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kadunew.com\/blog\/wp-json\/wp\/v2\/tags?post=3140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}