{"id":230349,"date":"2022-12-08T17:32:00","date_gmt":"2022-12-08T14:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230349"},"modified":"2022-12-07T11:54:37","modified_gmt":"2022-12-07T08:54:37","slug":"varfoer-och-hur-foer-anpassade-jquery-haendelser","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/varfoer-och-hur-foer-anpassade-jquery-haendelser\/","title":{"rendered":"Varf\u00f6r och hur f\u00f6r anpassade jQuery-h\u00e4ndelser"},"content":{"rendered":"\n<p>S\u00e5 l\u00e5ngt tillbaka som 1.0 har jQuery tillhandah\u00e5llit en <a href=\"https:\/\/api.jquery.com\/trigger\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">triggerfunktion<\/a> som l\u00e5ter oss:<\/p>\n<blockquote>\n<p>K\u00f6r alla hanterare och beteenden kopplade till de matchade elementen f\u00f6r den givna h\u00e4ndelsetypen.<\/p>\n<\/blockquote>\n<p>Men det var inte f\u00f6rr\u00e4n 1.3 som just den h\u00e4r funktionen blev betydligt mer anv\u00e4ndbar, \u00e5tminstone vad jag betr\u00e4ffar. Jag s\u00e4ger det eftersom det var d\u00e5 vi fick m\u00f6jligheten att definiera anpassade h\u00e4ndelser och sedan st\u00e4lla in hanterare f\u00f6r dem.<\/p>\n<p>Men vad \u00e4r ett troligt anv\u00e4ndningsfall d\u00e4r anpassade jQuery-h\u00e4ndelser \u00e4r anv\u00e4ndbara i WordPress-sammanhang? Av huvudet kanske du kan komma p\u00e5 m\u00e5nga. Eller kanske inte.<\/p>\n<p>Det har inte varit f\u00f6rr\u00e4n p\u00e5 sistone som jag har anv\u00e4nt dem betydligt mer \u00e4n vanligt. S\u00e5 jag t\u00e4nkte dela med mig av hur jag anv\u00e4nder dem om det \u00e4r av annan anledning \u00e4n att visa dig hur du kopplar upp dem till ditt arbete.<\/p>\n<h2>Anpassade jQuery-h\u00e4ndelser<\/h2>\n<p>Om du har erfarenhet av JavaScript \u2013 vanilj eller inte \u2013 \u00e4r du f\u00f6rmodligen bekant med grundl\u00e4ggande h\u00e4ndelsehanterare. Det vill s\u00e4ga n\u00e4r n\u00e5gon klickar p\u00e5 ett element har vi en funktion inst\u00e4lld p\u00e5 att aktiveras som g\u00f6r n\u00e5got.<\/p>\n<p>Anpassade jQuery-h\u00e4ndelser \u00e4r ungef\u00e4r s\u00e5, f\u00f6rutom att det \u00e4r h\u00e4ndelser som vi definierar. Det betyder att vi inte beh\u00f6ver lita p\u00e5 n\u00e4r n\u00e5gon f\u00f6r musen \u00f6ver ett element eller n\u00e4r de klickar p\u00e5 ett element.<\/p>\n<p>Ist\u00e4llet kan vi utl\u00f6sa en h\u00e4ndelse och sedan ha en hanterare inst\u00e4lld f\u00f6r att svara p\u00e5 l\u00e4mpligt s\u00e4tt. H\u00e4r \u00e4r ett exempel.<\/p>\n<h3>F\u00f6rbereder f\u00f6r ett anpassat event<\/h3>\n<p>L\u00e5t oss s\u00e4ga att du arbetar med ett projekt och det har en administrationssida som ansvarar f\u00f6r att h\u00e4mta data fr\u00e5n ett tredje parts API. Kontrollfl\u00f6det skulle se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<ol>\n<li>Anv\u00e4ndaren klickar p\u00e5 en knapp,<\/li>\n<li>En Ajax-f\u00f6rfr\u00e5gan initieras och beg\u00e4r information fr\u00e5n tredje part,<\/li>\n<li>Medan beg\u00e4ran sker b\u00f6r knapparna p\u00e5 sk\u00e4rmen vara inaktiverade,<\/li>\n<li>N\u00e4r beg\u00e4ran \u00e4r klar kan knapparna \u00e5teraktiveras,<\/li>\n<li>Alternativt kan ett statusmeddelande skrivas till sk\u00e4rmen.<\/li>\n<\/ol>\n<p>F\u00f6r att detta ska h\u00e4nda, f\u00f6rv\u00e4ntar den sig att det finns minst en knapp (som i ett <strong>inmatningselement<\/strong>) och ett valfritt textf\u00e4lt eller <strong>textomr\u00e5de<\/strong> d\u00e4r statusen f\u00f6r beg\u00e4ran kan ske.<\/p>\n<p>N\u00e4r anv\u00e4ndaren klickar p\u00e5 h\u00e4ndelsen kan vi utl\u00f6sa en anpassad h\u00e4ndelse. Vi kan kalla denna h\u00e4ndelse <strong>acme.ajax.processing<\/strong>. Sedan kan vi sedan anv\u00e4nda den <a href=\"https:\/\/api.jquery.com\/jquery.ajax\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00e4rdiga<\/a> funktionen som tillhandah\u00e5lls av jQuery f\u00f6r att hantera allt vi vill st\u00e4da upp efter\u00e5t eller s\u00e5 kan vi anv\u00e4nda v\u00e5r anpassade funktion om det \u00e4r n\u00e5got vi vill hantera i slutet ocks\u00e5.<\/p>\n<p>F\u00f6r b\u00e5da dessa kommer vi att titta p\u00e5 b\u00e5da. S\u00e5 vi kommer ocks\u00e5 att ha ett event som heter <strong>acme.ajax.complete<\/strong>.<\/p>\n<p>S\u00e5 vi \u00e4r bekymrade \u00f6ver:<\/p>\n<ul>\n<li>skapa ett anpassat evenemang,<\/li>\n<li>utl\u00f6ser det,<\/li>\n<li>st\u00e4lla in en h\u00e4ndelsehanterare f\u00f6r det,<\/li>\n<li>avslutas n\u00e4r beg\u00e4ran \u00e4r klar.<\/li>\n<\/ul>\n<p>Och det \u00e4r vad vi kommer att g\u00f6ra.<\/p>\n<h3>Definiera en anpassad h\u00e4ndelse<\/h3>\n<p>S\u00e5 n\u00e4r en anv\u00e4ndare klickar p\u00e5 en knapp, g\u00f6rs en Ajax-f\u00f6rfr\u00e5gan. Samtidigt kommer detta ocks\u00e5 att utl\u00f6sa h\u00e4ndelsen <strong>acme.ajax.processing<\/strong> som kommer att ha sin h\u00e4ndelsehanterare.<\/p>\n<p>S\u00e5 f\u00f6rst, l\u00e5t oss skapa Ajax-f\u00f6rfr\u00e5gan. <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-00-button-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">F\u00f6r detta<\/a><\/strong> kommer jag att anta att knappen som \u00e4r ansvarig f\u00f6r att utl\u00f6sa Ajax-f\u00f6rfr\u00e5gan helt enkelt kallas <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>Observera att det f\u00f6rsta vi vill g\u00f6ra \u00e4r att utl\u00f6sa bearbetningsh\u00e4ndelsen och sedan g\u00f6r vi beg\u00e4ran.<\/p>\n<h3>Hantera ett anpassat event<\/h3>\n<p>D\u00e4refter vill vi se till att vi har en h\u00e4ndelsehanterare inst\u00e4lld f\u00f6r att inaktivera knappen medan f\u00f6rfr\u00e5gan sker.<\/p>\n<p>Detta \u00e4r l\u00e4tt att g\u00f6ra och f\u00f6r att h\u00e5lla det h\u00e4r enkelt, och jag kommer att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-01-disable-button-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inaktivera knappen:<\/a><\/strong><\/p>\n<pre><code>$(document).on('acme.ajax.processing', function() {\n  $button.attr('disabled', 'disabled');\n});<\/code><\/pre>\n<p>L\u00e4tt, eller hur?<\/p>\n<h3>Hantera en annan anpassad h\u00e4ndelse<\/h3>\n<p>D\u00e4refter m\u00e5ste vi hantera situationen n\u00e4r Ajax-f\u00f6rfr\u00e5gan \u00e4r klar. S\u00e5 vi m\u00e5ste se till att trigga h\u00e4ndelsen och d\u00e5 m\u00e5ste vi hantera h\u00e4ndelsen.<\/p>\n<p>Att utl\u00f6sa h\u00e4ndelsen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-02-request-complete-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e4r l\u00e4tt:<\/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>Och hanteringen av h\u00e4ndelsen kan \u00e4ndras till den kod <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/61bd05c60b40d9f3ecd9eb81e5cb3f86#file-03-enable-button-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vi redan har:<\/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>Det kan kedjas eftersom det h\u00e4nder p\u00e5 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentobjektet<\/a> \u2013 inte ett separat element.<\/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=\"Varf\u00f6r och hur f\u00f6r anpassade jQuery-h\u00e4ndelser\" ><\/a><\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let, s\u00e5 det \u00e4r mycket l\u00e4ttare att hantera.<\/p>\n<h2>Bara ett exempel<\/h2>\n<p>Naturligtvis \u00e4r detta bara ett exempel p\u00e5 hur man hanterar anpassade jQuery-h\u00e4ndelser.<\/p>\n<p>Det finns m\u00e5nga andra s\u00e4tt att g\u00f6ra detta, och du kan g\u00f6ra n\u00e5gra ganska komplicerade saker med det; Detta b\u00f6r dock ge tillr\u00e4ckligt med information f\u00f6r vad du beh\u00f6ver om hur du arbetar med anpassade h\u00e4ndelser p\u00e5 en grundl\u00e4ggande niv\u00e5.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Men vad \u00e4r ett troligt anv\u00e4ndningsfall d\u00e4r anpassade jQuery-h\u00e4ndelser \u00e4r anv\u00e4ndbara i WordPress-sammanhang? Och hur kan vi faktiskt anv\u00e4nda dem i v\u00e5rt dagliga arbete?<\/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":[838,734,901,724],"tags":[1173],"class_list":["post-230349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-javascript-9","category-koda","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230349"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230349\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236464"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}