{"id":230389,"date":"2022-11-24T19:17:00","date_gmt":"2022-11-24T16:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230389"},"modified":"2022-11-09T22:09:27","modified_gmt":"2022-11-09T19:09:27","slug":"dynaamiset-elementit-staattiset-elementit-tapahtumakaesittelijaet-ja-niiden-monimutkaisuudet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/dynaamiset-elementit-staattiset-elementit-tapahtumakaesittelijaet-ja-niiden-monimutkaisuudet\/","title":{"rendered":"Dynaamiset elementit, staattiset elementit, tapahtumak\u00e4sittelij\u00e4t ja niiden monimutkaisuudet"},"content":{"rendered":"\n<p>Sivulla pinottujen elementtien k\u00e4sittely, joista osa on ankkureita ja toiset tapahtumak\u00e4sittelijill\u00e4, voi joskus aiheuttaa outoa k\u00e4ytt\u00e4ytymist\u00e4.<\/p>\n<p>Loppujen lopuksi se kaikki liittyy tapahtumien levi\u00e4miseen, mutta jos et ole joutunut k\u00e4sittelem\u00e4\u00e4n sit\u00e4 (tai tapahtumakuplaa tai muuta vastaavaa), se voi olla pieni haaste.<\/p>\n<p>Ja t\u00e4ss\u00e4 on esimerkki: Ent\u00e4 jos sinulla on kuva, joka on k\u00e4\u00e4ritty ankkuriin. Mit\u00e4 tapahtuu, kun dynaaminen elementti sijoitetaan JavaScriptin kautta sivun latautumisen j\u00e4lkeen, joka lataa toisen dynaamisen elementin? Lis\u00e4ksi haluat est\u00e4\u00e4 sivua uudelleenohjaamasta, kun dynaamista elementti\u00e4 napsautetaan, mutta silti ohjaamasta, kun kuvaa napsautetaan?<\/p>\n<p>Se saattaa kuulostaa yksinkertaiselta \u2013 ja joissain tapauksissa sit\u00e4 onkin \u2013 mutta jos sinulla on l\u00e4pin\u00e4kyv\u00e4 elementti koko alkuper\u00e4isen kuvan p\u00e4\u00e4ll\u00e4, siit\u00e4 voi tulla aivan toinen haaste.<\/p>\n<p>T\u00e4ss\u00e4 tulee esiin tapahtumakohteiden ymm\u00e4rt\u00e4minen. Mutta ennen kuin k\u00e4sittelen sen ratkaisemista, yrit\u00e4n tislata kaiken yksinkertaisemmalle selitykselle ja kaavion, kuinka se render\u00f6id\u00e4\u00e4n DOM:ssa.<\/p>\n<h2>Dynaamiset elementit, staattiset elementit ja tapahtumak\u00e4sittelij\u00e4t<\/h2>\n<p>Joten yrit\u00e4 kuvitella t\u00e4m\u00e4: Sinulla on\u2026<\/p>\n<ul>\n<li>Sivu, jolla on kuva ja kuva on k\u00e4\u00e4ritty ankkuriin, joka vie sinut esimerkiksi toiselle sivulle.<\/li>\n<li>Kun sivu latautuu, luodaan kaksi dynaamista elementti\u00e4. Kun ensimm\u00e4ist\u00e4 napsautetaan, sen pit\u00e4isi n\u00e4ytt\u00e4\u00e4 toinen dynaaminen elementti.<\/li>\n<li>Kun ensimm\u00e4ist\u00e4 dynamiikkaa napsautetaan, sen ei pit\u00e4isi ohjata sivua uudelleen.<\/li>\n<li>Kun alkuper\u00e4ist\u00e4 kuvaa napsautetaan, sen tulee toimia odotetulla tavalla.<\/li>\n<\/ul>\n<p>Vaikeinta t\u00e4ss\u00e4 on, ett\u00e4 dynaamiset elementit sijoitetaan olemassa olevan ankkuri- ja kuvayhdistelm\u00e4n p\u00e4\u00e4lle.<\/p>\n<h3>Katso DOM<\/h3>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 DOM n\u00e4ytt\u00e4isi suunnilleen t\u00e4lt\u00e4:<\/p>\n<p>Huomaa yll\u00e4 olevassa kuvassa, ett\u00e4 <strong>ankkuri<\/strong> laukaisee <strong>kuvan<\/strong> ja <strong>dynaaminen elementti<\/strong> <strong>dynaamisen peittokuvan<\/strong>.<\/p>\n<p>Miten sitten n\u00e4ytet\u00e4\u00e4n toinen dynaaminen elementti, kun ensimm\u00e4inen napsautettiin siirtym\u00e4tt\u00e4 pois sivulta? Voit tehd\u00e4 t\u00e4m\u00e4n tutkimalla k\u00e4ynnistetyn tapahtuman kohdetta.<\/p>\n<h3>Tapahtumien k\u00e4sittelykoodi<\/h3>\n<p>K\u00e4yt\u00e4n alla jQuery\u00e4, koska useimmat lukijani ty\u00f6skentelev\u00e4t WordPressin kanssa ja WordPress toimitetaan jQueryn kanssa, mutta t\u00e4m\u00e4 voidaan k\u00e4sitell\u00e4 my\u00f6s vanilja-JavaScriptilla (mutta yritt\u00e4\u00e4 menn\u00e4 t\u00e4lle tielle on enemm\u00e4n kuin olen valmis selitt\u00e4m\u00e4\u00e4n t\u00e4ss\u00e4 l\u00e4hett\u00e4\u00e4).<\/p>\n<p>T\u00e4m\u00e4n sanottuani t\u00e4ss\u00e4 on ydin, jonka selit\u00e4n, mit\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c2d33cce48603de444d2a620927f32da#file-00-example-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koodille tapahtuu:<\/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>Ensin teen oletuksen, ett\u00e4 dynaamisia elementtej\u00e4 on useita, mist\u00e4 syyst\u00e4 <a href=\"https:\/\/api.jquery.com\/jquery.each\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kunkin<\/a> iteraattorin syy.<\/p>\n<p>Seuraavaksi se luo viittauksen <strong>ankkurielementtiin<\/strong>, joka on dynaamisen elementin nykyisen ilmentym\u00e4n emo (<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> :n k\u00e4ytt\u00f6 t\u00e4ss\u00e4 on t\u00e4rke\u00e4\u00e4, jotta se viittaa aina elementtiin, joka on iteroinnin nykyisen ilmentym\u00e4n emo, verrattuna edellisen ilmentym\u00e4n p\u00e4\u00e4llekirjoitukseen ).<\/p>\n<p>Kun elementti\u00e4 napsautetaan, asetamme <strong>napsautusk\u00e4sittelij\u00e4n<\/strong>, jotta voimme katsoa napsautustapahtuman kohdetta. T\u00e4ss\u00e4 menee v\u00e4h\u00e4n h\u00e4mment\u00e4v\u00e4ksi.<\/p>\n<p>Meill\u00e4 on <strong>e-<\/strong> ja <strong>evt-<\/strong> muuttujat, joista jokainen viittaa tietyn elementin tapahtumak\u00e4sittelij\u00e4\u00e4n. Yll\u00e4 olevassa koodissa:<\/p>\n<ul>\n<li><strong>e<\/strong> viittaa tapahtumaan, joka on sidottu dynaamiseen elementtiimme,<\/li>\n<li><strong>evt<\/strong> viittaa elementtiin, mutta se vaikuttaa my\u00f6s tapahtumien kuplitusprosessiin, mik\u00e4 tarkoittaa, ett\u00e4 se k\u00e4ynnist\u00e4\u00e4 tapahtumia koko muun DOM:n ajan.<\/li>\n<\/ul>\n<p>Ja n\u00e4in ollen ehtolausekkeessamme arvioimme ensimm\u00e4isen tapahtumak\u00e4sittelij\u00e4n kohteen varmistaaksemme, ett\u00e4 se ei vastaa tietty\u00e4 elementti\u00e4. Sielt\u00e4, kuten n\u00e4et koodikommentista, voit m\u00e4\u00e4ritt\u00e4\u00e4, miten haluat edet\u00e4 (esimerkiksi ehk\u00e4 menn\u00e4 eteenp\u00e4in ja antaa sen navigoida muualle tai tehd\u00e4 jotain muuta).<\/p>\n<p>Lopulta se on sinun puhelusi. Mutta kun p\u00e4\u00e4set joukkoon dynaamisia elementtej\u00e4, staattisia elementtej\u00e4 ja tapahtumak\u00e4sittelij\u00f6it\u00e4, siit\u00e4 voi tulla nopeasti monimutkainen.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kun joudut dynaamisten elementtien, staattisten elementtien ja tapahtumak\u00e4sittelij\u00f6iden joukkoon, siit\u00e4 voi tulla nopeasti monimutkainen.<\/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":[730,719,895],"tags":[1166],"class_list":["post-230389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript-5","category-kehittaejae","category-koodi","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230389"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230389\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224006"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}