Hei,
Täällä taas javascript vinkkejä ruinaamassa :)
Mietin vain tässä miten tekisin javascript:tillä seuraavanlaisen toiminnallisuuden. Minulla olisi esimerkiksi lista-elementillä tehty lista tuotteet.
<ul> <li> Makkara </li> <li> Peruna </li> <li> Mehu </li> </ul>
Painaessani esimerkiksi kohtaa Peruna, siirtyisi peruna <textareaan>. Sen jälkeen kirjoittaisin sinne, että mätähän tuo oli ja tarvitsisin vielä mehua. Tässä vaiheessa painaisin kohtaa mehua ja mehu siirtyisi vielä sanan perään.
Eli document.wrieillahan tämä menee, mutta miten sen tekisi helpoiten.
Kannattaako minun aina painaessasi jotain elementtiä, kerätä textareassa olevat tiedot erilliseen muuttujaan, lisätä teksti sen loppuun ja liittää se taas textareaan, vai miten tämä olisi helpoiten toteutettavissa ilman sivun latausta?
Document.writeä ei nykyään suositella käytettävän enää mihinkään (citation needed), käytämma sen sijaan DOMia. Sido listaelementteihin funktio, joka lisää textarean nykyiseen arvoon painetun elementin sisältämän tekstin.
Avainsanat: events, selectors, manipulation
<script type="text/javascript"> function lisaa(elementti){ document.getElementById("teksti").appendChild(document.createTextNode(elementti.innerHTML)); } </script> </head> <body> <ul> <li onclick="lisaa(this)">Pottu</li> <li onclick="lisaa(this)">Porkkana</li> <li onclick="lisaa(this)">Sipuli</li> </ul> <textarea id="teksti" cols="60" rows="6"></textarea>
Sama jQueryllä:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("li").click(function () { $("#ostoslista").append($(this).text()); }); }); </script> </head> <body> <ul> <li>Maito</li> <li>Peruna</li> <li>Silli</li> </ul> <textarea id="ostoslista"></textarea>
Mietin vain sitä, että kuinka herkästi itse kukin tekee. esim.. näin pienen ominaisuuden jQueryllä, jos olettaa, että ei enää muuhun tarvitse sitä koskaan kyseisessä paikassa. Onko järkeä ladata apukirjasto vain tämän ominaisuuden takia vai kannattaako tehdä se ilman jQueryä. Kuinka paljon apukirjasto hidastaa sivustoa? Tuskin kovinkaan paljon?
Hyvä kysymys. Testailin ja vertailin tässä päivän mittaan: ensimmäisellä latauksella sivun lataus kesti jQueryn kanssa noin 200-300ms pidempään kuin ilman. Gzipattuna jQuery v1.3.2 tuo sivun kokoon lisää 20kB. Tuon kun cachettaa niin en uskoisi sen koituvan sivustolla pullonkaulaksi.
Valmiista kirjastoista on se hyöty, että niiden valmiita toimintoja käyttämällä saadaan helposti aikaiseksi tuki useammalle selaimelle pienellä vaivalla. Osa tässäkin keskustelussa esitetyistä koodinpätkistä ei luultavastikaan toimi (samoin) kaikilla selaimilla ilman selainkohtaisia korjauksia.
Teuro kirjoitti:
<script type="text/javascript"> function lisaa(elementti){ document.getElementById("teksti").appendChild(document.createTextNode(elementti.innerHTML)); } </script> </head> <body> <ul> <li onclick="lisaa(this)">Pottu</li> <li onclick="lisaa(this)">Porkkana</li> <li onclick="lisaa(this)">Sipuli</li> </ul> <textarea id="teksti" cols="60" rows="6"></textarea>
tämä toimi muuten loistavasti, mutta jos kirjoitin itse kenttään jotain niin onclick funcktio ei enää toiminut. Mistähän tämä voisi johtua?
Hyvä huomio, mikään esimerkeistä ei toimi odotetulla tavalla Fx3:lla. IE6:lla kylläkin, mutta se lisäsi automaagisesti välejä tekstikenttään (solmujen välille?). Ongelma liittynee jotenkin noihin nodeihin. Seuraava toimii halutunlaisesti:
ilman apukirjastoa
window.onload = function() { var lis = document.getElementsByTagName('li'); for (var i = 0; i < lis.length; i++) { lis[i].onclick = function() { document.getElementById('textarea').value += this.firstChild.nodeValue; }; } };
w/ jQuery
$(document).ready(function() { $("li").click(function () { $("#textarea").val($("#textarea").val() + $(this).text()); }); });
EDIT: Lisäsin edellisen viestin loppuun vielä unohtuneen seikan valmiiden kirjastojen käytön eduista.
Kiitoksia. nämä selainkohtaiset erot ovat ikuinen riesa, joten taidanpa ottaa suosiolla kirjaston käyttöön. Helpottaahan se muutenkin elämää :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.