{"id":230923,"date":"2022-12-08T17:13:00","date_gmt":"2022-12-08T14:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230923"},"modified":"2022-12-07T11:54:36","modified_gmt":"2022-12-07T08:54:36","slug":"o-porque-e-como-dos-eventos-personalizados-do-jquery","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-porque-e-como-dos-eventos-personalizados-do-jquery\/","title":{"rendered":"O porqu\u00ea e como dos eventos personalizados do jQuery"},"content":{"rendered":"\n<p>J\u00e1 na vers\u00e3o 1.0, o jQuery forneceu uma fun\u00e7\u00e3o de <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">gatilho<\/a> que nos permite:<\/p>\n<blockquote>\n<p>Execute todos os manipuladores e comportamentos anexados aos elementos correspondentes para o tipo de evento fornecido.<\/p>\n<\/blockquote>\n<p>Mas n\u00e3o foi at\u00e9 1.3 que essa fun\u00e7\u00e3o espec\u00edfica se tornou significativamente mais \u00fatil, pelo menos no que me diz respeito. Digo isso porque foi quando ganhamos a capacidade de definir eventos personalizados e, em seguida, definir manipuladores para eles.<\/p>\n<p>No entanto, qual \u00e9 um caso de uso prov\u00e1vel em que os eventos personalizados do jQuery s\u00e3o \u00fateis no contexto do WordPress? De cabe\u00e7a, voc\u00ea pode criar muitos. Ou talvez n\u00e3o.<\/p>\n<p>N\u00e3o foi at\u00e9 recentemente que eu os tenho usado significativamente mais do que o habitual. Ent\u00e3o, pensei em compartilhar como estou usando-os se por agora outra raz\u00e3o al\u00e9m de mostrar como conect\u00e1-los ao seu trabalho.<\/p>\n<h2>Eventos jQuery personalizados<\/h2>\n<p>Se voc\u00ea tem experi\u00eancia com JavaScript \u2013 vanilla ou n\u00e3o \u2013 provavelmente est\u00e1 familiarizado com manipuladores de eventos b\u00e1sicos. Ou seja, quando algu\u00e9m clica em um elemento, temos uma fun\u00e7\u00e3o definida para disparar que faz algo.<\/p>\n<p>Os eventos personalizados do jQuery s\u00e3o muito parecidos com isso, exceto que s\u00e3o eventos que definimos. Isso significa que n\u00e3o precisamos depender de quando algu\u00e9m move o mouse sobre um elemento ou quando clica em um elemento.<\/p>\n<p>Em vez disso, podemos acionar um evento e, em seguida, ter um manipulador configurado para responder adequadamente. Aqui est\u00e1 um exemplo.<\/p>\n<h3>Preparando-se para um evento personalizado<\/h3>\n<p>Digamos que voc\u00ea esteja trabalhando em um projeto e ele tenha uma p\u00e1gina de administra\u00e7\u00e3o respons\u00e1vel por recuperar dados de uma API de terceiros. O fluxo de controle ficaria assim:<\/p>\n<ol>\n<li>O usu\u00e1rio clica em um bot\u00e3o,<\/li>\n<li>Uma solicita\u00e7\u00e3o Ajax \u00e9 iniciada e solicita informa\u00e7\u00f5es de terceiros,<\/li>\n<li>Enquanto a requisi\u00e7\u00e3o est\u00e1 acontecendo, os bot\u00f5es na tela devem estar desabilitados,<\/li>\n<li>Depois que a solicita\u00e7\u00e3o for conclu\u00edda, os bot\u00f5es podem ser reativados,<\/li>\n<li>Opcionalmente, uma mensagem de status pode ser gravada na tela.<\/li>\n<\/ol>\n<p>Para que isso aconte\u00e7a, espera-se que haja pelo menos um bot\u00e3o (como em um elemento de <strong>entrada) e um campo de texto ou \u00e1rea de<\/strong> <strong>texto<\/strong> opcional em que o status da solicita\u00e7\u00e3o possa acontecer.<\/p>\n<p>Assim que o usu\u00e1rio clicar no evento, podemos acionar um evento personalizado. Podemos chamar esse evento <strong>de acme.ajax.processing<\/strong>. Em seguida, podemos usar a fun\u00e7\u00e3o <a href=\"https:\/\/api.jquery.com\/jquery.ajax\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">done<\/a> fornecida pelo jQuery para lidar com qualquer coisa que queiramos limpar posteriormente ou podemos usar nossa fun\u00e7\u00e3o personalizada se houver algo que queremos manipular no final tamb\u00e9m.<\/p>\n<p>Para este ambos, vamos olhar para ambos. Ent\u00e3o tamb\u00e9m teremos um evento chamado <strong>acme.ajax.complete<\/strong>.<\/p>\n<p>Ent\u00e3o estamos preocupados com:<\/p>\n<ul>\n<li>criando um evento personalizado,<\/li>\n<li>acionando-o,<\/li>\n<li>configurando um manipulador de eventos para ele,<\/li>\n<li>terminando assim que o pedido for conclu\u00eddo.<\/li>\n<\/ul>\n<p>E \u00e9 isso que faremos.<\/p>\n<h3>Definindo um evento personalizado<\/h3>\n<p>Ent\u00e3o, quando um usu\u00e1rio clica em um bot\u00e3o, uma solicita\u00e7\u00e3o Ajax est\u00e1 fazendo para ser feita. Ao mesmo tempo, isso tamb\u00e9m acionar\u00e1 o evento <strong>acme.ajax.processing<\/strong> que ter\u00e1 seu manipulador de eventos.<\/p>\n<p>Ent\u00e3o, primeiro, vamos criar a solicita\u00e7\u00e3o Ajax. <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-00-button-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Para isso<\/a><\/strong>, vou assumir que o bot\u00e3o respons\u00e1vel por acionar a solicita\u00e7\u00e3o Ajax \u00e9 simplesmente chamado de <strong>$button:<\/strong><\/p>\n<pre><code>$button.on('click', function(evt) {\n  evt.preventDefault();\n  $(document).trigger('acme.ajax.processing');\n\n  $.get(ajaxurl, {\n    \/\/ Your action and security measures here.\n  }, function(response) {\n    \/\/ Your response behavior here.\n  });\n});<\/code><\/pre>\n<p>Observe que a primeira coisa que queremos fazer \u00e9 acionar o evento de processamento e ent\u00e3o fazemos a requisi\u00e7\u00e3o.<\/p>\n<h3>Manipulando um evento personalizado<\/h3>\n<p>Em seguida, queremos ter certeza de que temos um manipulador de eventos configurado para desabilitar o bot\u00e3o enquanto a solicita\u00e7\u00e3o est\u00e1 acontecendo.<\/p>\n<p>Isso \u00e9 f\u00e1cil de fazer e manter isso simples, e vou <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-01-disable-button-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desabilitar o bot\u00e3o:<\/a><\/strong><\/p>\n<pre><code>$(document).on('acme.ajax.processing', function() {\n  $button.attr('disabled', 'disabled');\n});<\/code><\/pre>\n<p>F\u00e1cil, certo?<\/p>\n<h3>Lidando com outro evento personalizado<\/h3>\n<p>Em seguida, precisamos lidar com a situa\u00e7\u00e3o quando a solicita\u00e7\u00e3o Ajax for conclu\u00edda. Portanto, precisamos ter certeza de acionar o evento e, em seguida, precisamos lidar com o evento.<\/p>\n<p>Acionar o evento <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-02-request-complete-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e9 f\u00e1cil:<\/a><\/strong><\/p>\n<pre><code>$button.on('click', function(evt) {\n  evt.preventDefault();\n  $(document).trigger('acme.ajax.processing');\n\n  $.get(ajaxurl, {\n    \/\/ Your action and security measures here.\n  }, function(response) {\n    \/\/ Your response behavior here.\n  })\n  .done(function() {\n     $(document).trigger('acme.ajax.complete');\n  });\n});<\/code><\/pre>\n<p>E a manipula\u00e7\u00e3o do evento pode ser alterada para o c\u00f3digo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-03-enable-button-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que j\u00e1 temos:<\/a><\/strong><\/p>\n<pre><code>$(document)\n  .on('acme.ajax.processing', function() {\n    $button.attr('disabled', 'disabled');\n  })\n  .on('acme.ajax.complete', function() {\n    $button.removeAttr('disabled');\n  });<\/code><\/pre>\n<p>Ele pode ser encadeado porque est\u00e1 acontecendo no objeto do <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documento<\/a> \u2013 n\u00e3o em um elemento separado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162324-61e73b9885ab3.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162324-61e73b9885ab3.png\" alt=\"O porqu\u00ea e como dos eventos personalizados do jQuery\" ><\/a><\/p>\n<p>Para esse fim, por isso \u00e9 muito mais f\u00e1cil de manusear.<\/p>\n<h2>Apenas um exemplo<\/h2>\n<p>Claro, este \u00e9 apenas um exemplo de como lidar com eventos jQuery personalizados.<\/p>\n<p>Existem muitas outras maneiras de fazer isso, e voc\u00ea pode fazer algumas coisas bem complicadas com isso; no entanto, isso deve fornecer informa\u00e7\u00f5es suficientes para o que voc\u00ea precisa sobre como trabalhar com eventos personalizados em um n\u00edvel fundamental.<\/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>No entanto, qual \u00e9 um caso de uso prov\u00e1vel em que os eventos personalizados do jQuery s\u00e3o \u00fateis no contexto do WordPress? E como podemos realmente us\u00e1-los em nosso trabalho di\u00e1rio?<\/p>\n","protected":false},"author":1,"featured_media":236464,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,733],"tags":[1170],"class_list":["post-230923","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-javascript-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230923","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=230923"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230923\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236464"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230923"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}