Ting og tang
Finne elementer
Vi er ofte interessert i å identifisere elementer ved:
- id
- type
- class
- kombinasjoner
id
Dette er rett fram
var elt=document.getElemenById('minid');
Siden en id skal være unik er det ingen grunn til å gøre noe annet. Dersom id'en ikke er unik kan/bør vi ikke bruke denne.
type
Igjen ligger svaret i en standard javaskriptmetode:
var eltList=document.getElementsByTagName('div');
Merk at denne metoden også er implementert for andre objekter enn document, slik at vi kan finne alle paragrafer inne i et annet element.
var pList=wrapper.getElementsByTagName('p');
Merk også at '*' plukker alle elementer.
class
Vi kan ha flere class-name i en class angivelse. Hvert navn skal være skilt med blank. f.eks.:
<p class="hilited description whatever"> jada </p>
Vi har en metode som velger elementer ut fra match på en av disse delstrengene:
document.getElementsByClassName('hilited');
Dersom vi ønsker å få tak i hele class-attributten til et element skriver vi f.eks.
elt.className();
kombinasjoner
HTML5 introduserer to metoder som søker ved hjelp av en CSS-selector som filter. Noen eksempler:
document.querySelectorAll('div');
document.querySelectorAll('.hilited');
document.querySelectorAll('.refsection table');
document.querySelectorAll('.refsection table td+td');
document.querySelectorAll('.refsection, .hilited');
// the first or only
document.querySelector('#myid');
Vi ser at disse metodene faktisk gjør de andre (getElementsByClassName, getElementsByTagName, getElementById) overflødige. Du finner et eksempel på modulen Eksempel 6 .
Finne ved å klikke
Hvilket element har vi klikket på ? Vi vet at når vi låser f.eks. en mousdown til et element så kan vi la elementet idetifisere seg ved en parameter. F.eks. slik:
<div id="14" onmouseDown="doit('14')"> klikk </div>
<div onmouseDown="doit(this)"> klikk </div>
Men hva dersom vi ikke har plantet en slik mousedown-metode ? Vi er bare interessert i å plukke opp en mousedown, ett eller annet sted. Vi kan i utgangspunktet gjøre slik:
function doit(e)
{
// caring for old IE:
/*r e=window.event;
var elt=undefined;
if(e.target)
elt=e.target;
else //IE
elt=e.srcElement;
*/
var elt=e.target;
// elt is now the element where the event originated
return false;
}
og plante en generell evenhandler for det elementet som skal avgrense det området vi skal plukke opp. F.eks. ved å plassere følgende nederst på siden:
<script type="text/javascript"> document.onmousedown=doit;</script>
Nå er det ikke så enkelt siden begivenheter forplanter seg, bobler, oppover i sidestrukturen, DOMen. Det betyr at vi må ha en plan for hva vi ønsker å gjøre for å gå et skritt videre. La oss anta et typisk eksempel:
Vi ønsker at alle elementer vi klikker på som har, eller er inneholdt i et element som har, en bestemt verdi for class skal få en bestemt egenskap. For enkelhets skyld sier vi at class-verdien er "hilited" og teksten skal bli fet (bold).
Du kan f.eks klikke på en av disse tre paragrafene, som alle er inneholdt i en div med class="hilited".
function doit2(e)
{
var elt=e.target;
while ((elt.tagName != "HTML") //IE
&& (elt.tagName != "BODY")
&& (elt.className != "hilited"))
{
elt=elt.parentNode;//parenElement
}
if (elt.className=="hilited")
{
elt.style.fontWeight="bold";
return false;
}
}
En annen oppgave kan være at vi ønsker å plante metoder i identifiserbare elementer. Framgangsmåten blir helt lik. I stedet for å endre style, vil kanskje skrive:
... elt.onmousedown=select; elt.onmuseup=drop; ...
der select og drop er metoder vi har definert.
Element posisjon
Hvor er et element ? Følgende nyttige funksjon er funnet hos Quirksmode [1] .
function findPos(obj){
var curleft = curtop = 0;
if (obj && obj.offsetParent) {
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return [curleft,curtop];
}
}