JavaScript
Børre Stenseth

Ting og tang

Hva

Noen nyttige oppslag

Finne elementer

Vi er ofte interessert i å identifisere elementer ved: id, elementtype, class, eller 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.

Endre class

HTML5 gir oss mulighet for å endre class. Utgangspunktet e altså at vi har en class-attributt med flere klassenavn skilt med blank. Vi oppfatter dette som en liste, classList. Anta elt er et eller annet element.

	// add or remove a class name
	elt.classList.add("hilited");
	elt.classList.remove("hidden");

	// add more than one
	elt.classList.add("hilited","fixed"); 

	// remove or add
	elt.classList.toggle("hilited");

	// is it in the list
	if(elt.classList.contains("hilited"))
		alert("yes");

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)
{
    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";
}

Plante metoder

En annen oppgave kan være at vi ønsker å plante metoder i identifiserbare elementer. Framgangsmåten blir helt tilsvarende:

...
elt.onmousedown=select;
elt.onmouseup=drop;
...

der select og drop er metoder vi har definert.

Element posisjon

Hvor er dette element i vinduet? (klikk her)

Følgende funksjon er nyttig:

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];
}

Cookies

Cookies er måten vi tradisjonelt har brukt til "sette spor" på en webside

For mange formål er HTML5 standarden localstorage og sessionStorage å foretrekke, se HTML.

I alle fall for de som har bruk for det, et enkelt bibliotek fra Peter-Paul Kochs Quirksmodeside [1] .

function createCookie(name,value,days) {
        if (days) {
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                var expires = "; expires="+date.toGMTString();
        }
        else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
}

function eraseCookie(name) {
        createCookie(name,"",-1);

Referanser
  1. Quirksmode Peter-Paul Koch Quirksmode.org www.quirksmode.org/ 14-03-2010