JavaScript og DOM-serien Leksjon 1

Hei og velkommen til den første delen av det som forhåpentligvis vil være en omfattende serie som dekker kjerneaspekter av JavaScript-programmeringsspråket og DOM API.

Mens rammer som jQuery, Prototype og MooTools er gode måter å undertrykke nettleserveil på og øke utviklingen, er det viktig å kjenne og forstå de underliggende teknologiene. Denne serien har til hensikt å fortelle deg hva du trenger å vite om JavaScript og Document Object Model (DOM). Selv om du sverger ved et bestemt bibliotek, vil dette fortsatt være til nytte for deg - å vite hvordan noe fungerer under huden, kan bare være en god ting!

introduksjoner

Javascript

JavaScript er en dynamisk, løst skrevet, prototype-basert programmeringsspråk som brukes i mange forskjellige miljøer. I tillegg til å være det utbredte programmeringsspråket på klientsiden på nettet, er det også brukt til å skrive plugins for IDEs, i PDF-filer og som grunnlag for andre plattformer og høyere abstraksjoner.

JavaScript er basert på ECMAScript-standarden (ECMA-262) og ble skapt av Brendan Eich of Netscape. Det ble opprinnelig kalt LiveScript, men det ble senere omdøpt til JavaScript, sannsynligvis med den eneste hensikten å forårsake forvirring.

Her er noen av funksjonene i litt mer detaljert:

  • dynamisk programmeringsspråk utføres ved kjøring; de er ikke kompilert. På grunn av dette er JavaScript noen ganger betraktet som et skriptspråk i motsetning til et sant programmeringsspråk (åpenbart en misforståelse). Når du har JavaScript i et HTML-dokument, blir det analysert siden siden lastes inn i nettleseren, derav på "runtime".
  • Løst skrevet språk insisterer ikke på noen sterk skrive system. Hvis du har programmert i C eller Java (ikke det samme som JavaScript), vet du at når du erklærer en variabel, må du spesifisere en type som "int" (heltall). JavaScript er annerledes fordi du ikke trenger å spesifisere typen.
  • For å utføre arv innen JavaScript må du bruke noe som heter prototyper. JavaScript støtter ikke klasser.
  • JavaScript er også en funksjonell Språk. Den behandler funksjoner som førsteklasses objekter; Dette er ideen bak lambda.

Forståelse av de ovennevnte punktene er ikke viktig for å lære om JavaScript; det er bare noen få ideer for å få hjernen din i utstyr, og bør hjelpe deg å skille mellom JavaScript fra andre programmeringsspråk du kanskje har opplevd.

Dokumentobjektmodell

Dokumentobjektmodellen, som vanligvis forkortes til DOM, er APIen som JavaScript samhandler med innholdet på et nettsted. JavaScript og DOM er vanligvis sett som en enkelt enhet siden JavaScript er mest brukt til dette formålet (interagere med innhold på nettet). DOM-API-en brukes til å få tilgang til, krysse og manipulere HTML- og XML-dokumenter.


En grunnleggende oversikt over det typiske DOM-hierarkiet (forenklet)

Her er noen få bemerkelsesverdige ting om DOM:

  • Vinduet objektet fungerer som det globale objektet, du får tilgang til det ved bare å skrive "vindu". Det er innenfor dette objektet at all JavaScript-koden din er utført. Som alle objekter har det egenskaper og metoder.
    • En egenskap er en variabel lagret under en gjenstand. Alle variabler som opprettes på en nettside, blir automatisk egenskaper av vinduobjektet.
    • En metode er en funksjon lagret under en gjenstand. Siden alle funksjoner er lagret under (i det minste) vinduet objektet de alle kan refereres til som "metoder".
  • DOM skaper en hierarki som svarer til strukturen til hvert webdokument. Dette hierarkiet består av noder. Det finnes flere forskjellige typer DOM noder, de viktigste er 'Element', 'Text' og 'Document'.
    • En 'Element'-nod representerer et element på en side. Så hvis du har et avsnittelement ('

      ') så kan den nås via DOM som en knutepunkt.

    • En "Tekst" node representerer all tekst (innenfor elementer) innenfor en side. Så hvis avsnittet ditt har litt tekst i det, kan det nås direkte gjennom DOM.
    • Dokumentdokumentet representerer hele dokumentet. (det er rotnoden til DOM-hierarkiet / treet).
    • Vær også oppmerksom på at elementattributtene er DOM noder selv.
  • Hver layoutmotor har en litt annen implementering av DOM-standarden. Firefox-nettleseren, som bruker Gecko-layoutmotoren, har en ganske god implementering (selv om den ikke er helt i tråd med W3C-spesifikasjonen), men Internet Explorer, som bruker Trident-layoutmotor, er kjent for at den er buggy og ufullstendig implementering. en årsak til mye angst i webutviklingssamfunnet!

Last ned Firebug

Hvis du bruker Firefox, og du ikke allerede har Firebug-tillegget, anbefaler jeg at du laster ned og installerer det nå. Det er et veldig nyttig verktøy for å få et anstendig bilde av hele dokumentstrukturen.

JavaScript på nettet

The Script Element

Når du vil bruke JavaScript på et nettsted, må det inkluderes i et SCRIPT-element:

     Javascript!     

Som du kan se har vi et SCRIPT-element nederst i dokumentet vårt. TYPE-attributtet bør strengt sett settes til 'application / javascript' men uten overraskelse fungerer det ikke i Internet Explorer, så vi står fast med enten 'text / javascript' eller ingen TYPE-attributt i det hele tatt. Hvis du bryr deg om validering, vil det tidligere forslaget trolig passe deg.


Husk å spesifisere skriptene dine som CDATA!

Du har også lagt merke til at innenfor dette SCRIPT-elementet har vi et par kommentert linjer. Disse informerer XHTML-støttende nettlesere om at innholdet i SCRIPT-elementet er "tegndata" og ikke skal tolkes som XHTML-oppslag. Det er bare virkelig nødvendig hvis du planlegger å bruke enten "<' or '>'tegn i JavaScript-koden din. Åpenbart kan du glemme alt dette hvis du bruker vanlig HTML.

Defer Attribut

Eventuelle JavaScript vi legger inn i det SCRIPT-elementet, vil løpe som siden laster. Det eneste unntaket er når et SCRIPT-element har et "defer" -attributt. Som standard, når en nettleser møter et SCRIPT-element, stopper den og kjører koden, og den fortsetter å analysere dokumentet. DEFER-attributtet informerer nettleseren om at koden ikke inneholder noen dokumentendringskode og så kan kjøres senere. Det eneste problemet med dette er at det bare fungerer i IE, så det er sannsynligvis best å unngå dette attributtet.

Kobling til eksterne skript

Hvis du vil koble til en ekstern skriptfil, legg du bare til et SRC-attributt til ditt SCRIPT-element som svarer til plasseringen. Det er normalt en bedre ide å ha separate skriptfiler enn å skrive kode inline som det betyr at nettleseren kan cache filen. Pluss du trenger ikke å bekymre deg for noe av det CDATA-tullet:

 

JavaScript Essentials

Før vi fortsetter med DOM, er det en god ide å ha en grunnleggende forståelse av noen JavaScript-nødvendigheter. Hvis du har problemer med å forstå noen av disse, ikke bekymre deg - du vil etterhvert plukke dem opp!

I JavaScript kan du ha forskjellige typer verdier. Det er Numbers, Strings, Booleans, Objects, Undefined og Null:

Enkeltlinjemessige kommentarer skrives med to fremoverstreker (//), alt gjenværende tekst på den linjen antas å være en kommentar fra parseren. Multi-line kommentarer er signified using '/ *' og '* /' for å fullføre kommentaren.

tall

I JavaScript er alle tall representert som flytende punktverdier. Når du definerer en tallvariabel, husk å ikke pakke den inn i noen anførselstegn.

 // Merk: Bruk ALDRI 'var' til å erklære en variabel: var leftSide = 100; var topSide = 50; var areaOfRectangle = leftSide * topSide; // = 5000

Strings

En hvilken som helst streng du definerer er tatt bokstavelig, vil JavaScript ikke behandle det. En streng er en sekvens av Unicode-tegn og bør pakkes inn i et matchende par med enten enkelt eller dobbelt anførselstegn.

 var firstPart = 'Hei'; var secondPart = 'Verden!'; var allOfIt = firstPart + "+ secondPart; // Hello World! // Signaturet brukes som string-concatenation operatør // (det brukes også til numerisk tillegg)

booleans

Boolske typer er nyttige når du vil evaluere en tilstand - for å se om den oppfyller en bestemt kriterier. Det er bare to mulige boolske verdier: ekte og falsk. Enhver sammenligning, ved hjelp av logiske operatører, vil resultere i en boolsk.

 5 === (3 + 2); // = true // Du kan tilordne boolske verdier til variabler: var veryTired = true; // Du kan teste for det slik: hvis (veldig slitt) // Sove

Den '===' du ser ovenfor er en sammenligningsoperatør, vi vil dekke dem senere.

funksjoner

En funksjon er et spesialisert objekt:

 // Bruk funksjonen operatør til å opprette en ny funksjon: funksjon myFunctionName (arg1, arg2) // Funksjonskode går her.  // Hvis du slipper funksjonens navn, så // du lager en "anonym funksjon": funksjon (arg1, arg2) // Funksjonskode går her.  // Kjører en funksjon er bare et tilfelle av referanse // og deretter legger du til en parentes (med argumenter): myFunctionName (); // Ingen argumenter myFunctionName ('foo', 'bar'); // med argumenter // Du kan også kjøre en funksjon uten å anta // det til en variabel: (funksjon () // Dette er kjent som en egenaktiverende anonym funksjon) ();

arrays

En Array er også et spesialobjekt og kan inneholde et hvilket som helst antall dataverdier. For å få tilgang til dataverdier i en matrise må du bruke et tall, referert til som «indeks» for elementet du prøver å hente:

 // 2 forskjellige måter å erklære et nytt utvalg på, // Literal: var frukt = ['apple', 'sitron', 'banan']; // Bruke Array-konstruktøren: var frukt = ny Array ('eple', 'sitron', 'banan'); frukt [0]; // Få tilgang til det første elementet i matrisen (apple) [1]; // Få tilgang til det andre elementet i matrisen (sitron) frukt [2]; // Få tilgang til det tredje elementet i matrisen (banan)

objekter

Et objekt er en samling av navngitte verdier (nøkkelverdier par). Det ligner på en matrise, den eneste forskjellen er at du kan angi et navn for hver dataverdi.

 // 2 forskjellige måter å erklære et nytt objekt på, // Literal (curly braces): var profil = navn: 'Bob', alder: 99, jobb: 'Freelance Hitman'; // Bruke Object-konstruktøren: var profil = nytt objekt (); profile.name = 'Bob'; profile.age = 99; profile.job = 'Freelance Hitman';

Hvis / Else erklæring

En av de vanligste konstruksjonene i JavaScript er 'IF' / 'ELSE' uttalelse. Det går noe slikt:

 var legalDrinkingAge = 21; var dinAge = 29; hvis (yourAge> = legalDrinkingAge) // Vi kan bruke 'varsel' for å varsle brukeren: varsel ('Du kan drikke.');  ellers alert ('Beklager, du kan ikke drikke.'); 

JavaScript operatører:

I stedet for å notere dem alle her ute foreslår jeg at du besøker MDC-artikkelen om Operatører. Det forklarer dem i stor detalj. Jeg har satt opp noen få eksempler for å gi deg en ide om hvordan noen av operatørene blir brukt nedenfor:

 // addioa / substraction / multiply / divide var someMaths = 2 + 3 + 4 - 10 * 100/2; // Likestilling hvis (2 == (5 - 3) / * Gjør ting * / // == sjekker for eqaulity // Ulikhet hvis (2! = 5 - 3) / * Gjør ting * / / / Strict Equality Operators: // (Jeg foreslår at du bruker disse) 2 === 2 // I stedet for 2 == 2 2! == 3 // I stedet for 2! = 3 // Oppgave: var numberOfFruit = 9; numberOfFruit - = 2; // Samme som "numberOfFruit = numberOfFruit - 2" numberOfFruit + = 2; // Samme som "numberOfFruit = numberOfFruit + 2"

looping

Looping er nyttig når du må gå gjennom alle elementene i en matrise eller alle medlemmer av et objekt. Den vanligste måten å løse i JavaScript, er å bruke enten FOR eller WHILE-setningen.

 var envatoTutSites = ['NETTUTS', 'PSDTUTS', 'AUDIOTUTS', 'AETUTS', 'VECTORTUTS']; // WHILE loop var counter = 0; var lengthOfArray = envatoTutSites.length; mens (teller < lengthOfArray)  alert(envatoTutSites[counter]); counter++; // Same as counter += 1;  // FOR loop // (The i stands for "iterator" - you could name it anything) for (var i = 0, length = envatoTutSites.length; i < length; i++)  alert(envatoTutSites[i]); 

FOR løkker er mer populære for looping gjennom Arrays.

Tilbake til DOM

Tilgang til DOM-noder

La oss anta at vi har et grunnleggende XHTML-dokument som inneholder et avsnitt og en uordnet liste:

     Javascript!   

Mitt første avsnitt ...

  • Liste 1
  • Liste 1
  • Liste 1
  • Liste 1
  • Liste 1

I dette første eksemplet kommer vi til å få tilgang til vårt avsnitt ved å bruke 'getElementById' DOM-metoden:

(Denne koden går innenfor SCRIPT-elementet i ovennevnte mal).

 var introParagraph = document.getElementById ('intro'); // Vi har nå en referanse til DOM-noden. Denne DOM // node representerer innledningsavsnittet.

Variabelen 'introParagraph' er nå en referanse til DOM-noden. Vi kan gjøre en rekke ting med denne noden, - vi kan spørre innholdet og attributter, og kan manipulere ethvert aspekt av det. Vi kan fjerne den, klone den eller flytte den til andre deler av DOM-treet.

Alt som er til stede i et dokument vi kan få tilgang til ved hjelp av JavaScript og DOM API. Så, vi vil kanskje få tilgang til den uordnede listen på lignende måte, det eneste problemet er at det ikke har en ID. Du kan gi den en ID og deretter bruke samme metode som ovenfor, eller vi kunne få tilgang til den ved hjelp av "getElementsByTagName":

 var allUnorderedLists = document.getElementsByTagName ('ul'); // 'getElementsByTagName' returnerer en live node samling / liste // - Det ligner veldig på en rekke med noen få små forskjeller.

getElementsByTagName

Metoden GetElementsByTagName returnerer en live node-samling / liste. Det ligner en matrise ved at den har en lengdeegenskap. En viktig ting å merke seg er at disse samlingene er "live" - ​​hvis du legger til et nytt element i DOM, vil samlingen oppdatere seg selv. Siden det er et array-lignende objekt, kan vi få tilgang til hver node via en indeks, fra 0 til samlet lengde på samlingen (minus 1):

 // Få tilgang til en uordnet liste: [0] index var unorderedList = document.getElementsByTagName ('ul') [0]; // Opprett nodeliste over alle listeposter i UL: var allListItems = unorderedList.getElementsByTagName ('li'); // Nå kan vi løkke gjennom hvert liste element ved hjelp av en FOR-sløyfe: for (var i = 0, lengde = allListItems.length; i < length; i++)  // Extract text node within and alert its content: alert( allListItems[i].firstChild.data ); 

Tilgang til noder og attributter i DOM

Traverserer DOM

Begrepet "traverse" brukes til å beskrive handlingen av å reise gjennom DOM, finne noder. DOM API gir oss nok av nodeegenskaper som vi kan bruke til å flytte opp og ned gjennom alle noder i et dokument.

Disse egenskapene er iboende av alle noder og gir deg tilgang til relaterte / lukkede noder:

  • Node.childNodes: Du kan bruke dette for å få tilgang til alle direkte barnnoder av et enkelt element. Det vil være et array-lignende objekt, som du kan løse gjennom. Noder i dette arrayet vil inkludere alle de forskjellige nodetyper, inkludert tekstnoder og andre elementnoder.
  • Node.firstChild: Dette er det samme som å få tilgang til det første elementet i 'childNodes' array ('Element.childNodes [0]'). Det er bare en snarvei.
  • Node.lastChild: Dette er det samme som å få tilgang til det siste elementet i 'childNodes'-arrayet (' Element.childNodes [Element.childNodes.length-1] '). Det er bare en snarvei.
  • Node.parentNode: Dette gir deg tilgang til hovedkoden til din nåværende node. Det vil bare være noen foreldre node. For å få tilgang til besteforeldre ville du bare bruke 'Node.parentNode.parentNode' etc.
  • Node.nextSibling: Dette gir deg tilgang til neste node på samme nivå i DOM-treet.
  • Node.previousSibling: Dette gir deg tilgang til den siste noden på samme nivå i DOM-treet.

Traverserer et dokument (forenklet - vennligst les nedenfor)

Så, som du ser, er det utrolig enkelt å krysse DOM'en, det er bare et tilfelle av å kjenne eiendomsnavnet.

En ting å merke seg om grafikken ovenfor: Listen elementer kan bare hentes på den måten hvis det ikke er mellomrom mellom dem. Fordi du kan ha tekstnoder og elementnoder i et dokument, er plassen mellom '

    'og den første'
  • 'teller faktisk som en knute selv. På samme måte er den uordnede listen egentlig ikke avsnittets neste søsken - siden det er på en ny linje, er det mellomrom mellom de to elementene - dermed en annen knutepunkt! Normalt vil det du vil gjøre i denne situasjonen være å gå gjennom "childNodes" -arrangementet og teste "nodeType". En "nodeType" på 1 betyr at det er et element, 2 betyr at det er en attributt, 3 betyr at det er en tekstknute. Du kan se en fullstendig liste her: https://developer.mozilla.org/En/DOM/Node.nodeType.

    Det er alt det er!

    Slik fungerer alle de store JavaScript-bibliotekene bak kulissene; ved hjelp av native DOM metoder og egenskaper for å gi deg tilgang til disse elementene gjennom en pent polert abstraksjon. Det som skiller deg fra rammen, er at du nå har en ide om hvordan du overlever uten rammebetingelser (hvis du ikke allerede)!

    Til neste gang…

    Vel, det er det for første del. Jeg håper du har lært noe fra alle mine ramblings. I neste del av serien vil vi forhåpentligvis fokusere på noen flere gjeldende eksempler; vi vil trolig også dekke nettleseren hendelse modellen.

    I mellomtiden og hvis du ikke allerede har sjekket ut disse snakkene av Doug Crockford (Yahoo! Videoside):

    • Douglas Crockford: "JavaScript-programmeringsspråket" / 1 av 4
    • Douglas Crockford: "JavaScript-programmeringsspråket" / 2 av 4
    • Douglas Crockford: "JavaScript-programmeringsspråket" / 3 av 4
    • Douglas Crockford: "JavaScript-programmeringsspråket" / 4 av 4

    Takk for at du leste!

    • Abonner på NETTUTS RSS-feed for flere daglige webutviklinger og artikler.