Kanskje du så det tweet: "jQuery er et gateway-stoff. Det fører til fullstendig JavaScript-bruk. "En del av den avhengigheten, bekrefter jeg, er å lære andre JavaScript-rammer. Og det er hva denne firedelte serien på den utrolige Dojo Toolkit handler om: tar deg til neste nivå av JavaScript-avhengigheten din.
Jeg bør nevne før vi begynner at den eneste forutsetningen for denne serien er at du i det minste har en grunnleggende kunnskap om JavaScript. Hvis du har brukt et annet JS-bibliotek før, blir du enda bedre. Men selv om jeg sammenligner Dojo med jQuery et par ganger, trenger du ikke å vite at jQuery er behagelig i denne klassen.
Og enda en ting: Jeg skal produsere en screen for hver enkelt av disse veiledningene, dekker alt i de skriftlige opplæringene, og kanskje litt mer. Kastingene er en del av abonnementet på Premium, så hvis du ikke er medlem, registrer deg for å få dem og et metrisk tonn med andre fantastiske Premium-innhold.
Dojo er offisielt kalt Dojo Toolkit. Dette er faktisk veldig passende. De fleste andre samlinger av linjer med JavaScript tilgjengelig regner seg som rammer eller biblioteker. I mitt sinn er et rammeverk en mer eller mindre ende-til-ende løsning for å bygge gode webapplikasjoner, og et bibliotek er en samling verktøy som hjelper deg med noen spesifikke (vanligvis relaterte) oppgaver. Dojo passer inn i begge kategorier, og deretter noen. Den har alle DOM-manipulasjon, hendelser og animasjonshjelpere, og AJAX-funksjoner som du vil få med et bibliotek som jQuery. Men det er mer, mye mer.
På dine første par datoer med Dojo, vil du ikke innse hvor mye det er til det. Så, la meg introdusere deg til de tre hoveddelene av Dojo:
Vi starter selvfølgelig ved å få Dojo på siden. Jeg vil fortelle deg at Dojo ikke er som jQuery, fordi det er dusinvis av filer som utgjør Dojo, Dijit og Dojox. Grunnen til at jeg er nølende med å si dette er at du sier at jQuery ikke bare er en fil: det er alle plugins og utvidelser som er laget for det. Forskjellen med Dojo er at alle disse ekstradelene er offisielt en del av Dojo, og kan bli kalt inn på din nettside når som helst.
Men akkurat nå trenger vi bare Dojo-basen. Dette er en delmengde av Dojo Core, tilgjengelig i en enkelt fil. Så, mens du kan laste ned alle Dojo (og Digit og Dojox), eller lage egendefinerte konstruksjoner av det med bare de delene du ønsker, skal vi ta den enkle ruten og få Base fra Google CDN.
Så opprett en index.html
fil og start med denne lille malen:
Intro til Dojo, del 1 Et overskrift
Dette er et avsnitt (om enn veldig kort avsnitt). Også her er en lenke.
Jeg har tatt med en mengde elementer i denne lille demosiden. Vi bruker dem når vi utforsker Dojo.
Jeg skal nevne en ting før vi kommer i gang: Når du lærer et bibliotek som Dojo, vil du sikkert finne det nyttig å vise vår testside i din valgte nettleser, og åpne den respektive JavaScript-konsollen. Ta noen linje med kode i denne opplæringen og lim den inn i konsollen, og du vil se hva som skjer.
I denne opplæringen skal vi lære Dojo først og fremst som en erstatning for jQuery, eller hva DOM-fokusert bibliotek du bruker. Det er selvfølgelig neppe et gulvbrett i denne Titanic, men det er et godt sted å starte. Når du er komfortabel med å bruke den i stedet for ditt vanlige bibliotek, kan vi fortsette med det som gjør Dojo unik.
Den vanlige M.O. med disse tingene er det få det, bruk det; så la oss begynne med å finne DOM-elementer.
Dojo har et par metoder for jakt gjennom DOM. Den første vi ser på er dojo.query
, som er veldig mye som jQuery
(eller $
) metode. Bare send det en CSS velg streng, og det vil finne alle elementene i dokumentet ditt som samsvarer med väljeren.
dojo.query ( "a");
Kjører det i en konsoll, får du en NodeList
med 5 elementer. Den har de fem ankeretikettene du forventer. Hva forventer du å få når du prøver dojo.query ("p> a")
? dojo.query
kan også ta et rot- eller kontekstelement som en andre parameter. Som du kanskje forventer, begrenser dette omfanget av spørringen til elementer i det rotelementet. Så:
dojo.query ("a", "nav"); // returnerer en 'NodeList' på 4 s
Roten parameteren kan enten være et DOM element, eller en streng som er en ID av et element.
Den returnerte NodeList
s har også a spørsmål
metode, som finner noder som matcher selektoren som er barn av noder i originalen NodeList
. For eksempel:
dojo.query ( "a"); // en 'NodeList' av 5 s dojo.query ("p"). spørring ("a"); // en 'NodeList' på 1
Men vent, det er mer, som de sier. Det finnes to andre Dojo-metoder for å få elementer. Hvis elementet du vil ha, har en id
attributt, kan du bruke dojo.byId
metode.
dojo.byId ( "nav");
Hvis du prøver det ut, vil du legge merke til at du ikke får en NodeList
objekt tilbake: det er bare et vanlig gammelt DOM-element. Dette vil være viktig å huske.
En annen, og det er enda mer spesifikk: dojo.body ()
. Den returnerer element, forutsigbart.
Nå, hvis det er en "main thing" som de fleste devs bruker sine JS-biblioteker for, fungerer det med DOM-elementer. Selvfølgelig har Dojo alle fasilitetene for dette også, så la oss ta turen.
Vi begynner med å lage elementer, med dojo.create
. For det første kan du bare få et nytt DOM-element som dette:
var h = dojo.create ("h2"); //
Enkel. Men vanligvis vil du gjøre mer. Vel, du kan passere et attributtobjekt som en annen parameter:
var h = dojo.create ("section", rolle: "banner", innerHTML: "Learning Dojo"); //role = "banner"> Lære Dojo
De dojo.create
Metoden kan også legge til elementer direkte til DOM. For det kan vi legge til parametere 3 og 4:
dojo.create ("p", innerHTML: "Hei!", dojo.body (), "first"); dojo.create ("h1", innerHTML: "Overskrift", dojo.query ("h1") [0], "før");
Den tredje parameteren kalles referansenummeret; vår nye node vil bli plassert i DOM i forhold til elementet.
Men hvor, i referanse?
Det er her de fjerde parametrene, posisjonen, kommer inn. Som standard (dvs. hvis du forlater det), er det "sist", som legger til det nye elementet til referansenoden (som sitt siste barn). Dine andre alternativer er disse:
Du vet det ennå ikke, men du har ganske mye lært dojo.attr
metode. La oss formalisere denne introduksjonen.
dojo.attr
brukes til å få og sette attributter på DOM noder. Husk at attributter objekt som vi passerte som den andre parameteren til dojo.create
? Du kan sende det som den andre parameteren til dojo.attr
. Den første parameteren er selvfølgelig noden som har sine attributter endret (eller en id-streng):
var navUl = dojo.query ("p") [0]; dojo.attr (navUl, onclick: function () alert ("Learning Dojo!");, rolle: "banner", stil: backgroundColor: "red", fontSize: "2em");
Hvis du bare vil sette et enkelt attributt, bare passere navnet som den andre parameteren og verdien som den tredje:
dojo.attr ("nav", "className", "module"); // første parameter er en id-streng
For å få et attributt er det bare to parametere som kreves:
dojo.attr (dojo.byId ("nav"), "id"); // "nav"
Du kan bruke NodeList
metode attr
på samme måten:
var items = dojo.query ("li"); items.attr ( "innerhtml"); // ["Hjem", "Portefølje", "Om", "Kontakt"] items.attr (className: "btn");
En ting til: å fjerne attributter, kan du bruke dojo.removeAttr
og NodeList
motpart for å fjerne attributter fra elementer helt:
dojo.removeAttr ("nav", "id"); dojo.query ( "# nav") removeAttr ( "id.");
Det er andre måter å modifisere disse noderne på. Hva med dojo.addClass
, dojo.removeClass
, eller dojo.toggleClass
? Du kan bruke disse til å legge til, fjerne eller bytte en klasse eller en rekke klasser på enkelte noder:
var nav = dojo.byId ("nav"); dojo.addClass (nav, "valgt");
Det er også NodeList
motparter for disse metodene:
dojo.query ("li"). removeClass (["valgt", "uthevet"]);
Å, og ikke glem det dojo.replaceClass
og NodeList
versjon:
dojo.query ("p"). replaceClass ("newClass", "oldClass");
Vil du bli kvitt en knute? Lett: pass dojo.destroy
enten en DOM-node eller en id-streng:
var navList = dojo.byId ("nav"); dojo.destroy (navList); // eller, lettere: dojo.destroy ("nav");
Jeg burde merke at det ikke er noen måte å ødelegge en NodeList
; dojo.destroy
aksepterer bare enkle noder, og har ikke en NodeList
motpartsmetode.
Men la oss si at du bare vil ta noder ut av DOM, men ikke egentlig ødelegge dem. Tross alt, vil du kanskje koble dem til et annet sted, eller når det skjer noe annet. Det er her foreldreløs
Metoden kommer inn. Denne metoden er bare en NodeList
metode:
dojo.query ( "LI") orphan (.);
På vår eksempelside fjerner dette de fire
s og returnerer a NodeList
av dem. Hvis du bare vil foreldreløs
enkelte noder fra originalen NodeList
, pass er en filtreringsvelger. Merk at dette filteret bare samsvarer med noder i originalen NodeList
, og ikke deres barn:
. Dojo.query ( "LI") orphan ( "li: første-av-type"); // vil bare forløse den første <li>
Mens det ikke fjerner et element, kaster jeg dette inn her: dojo.empty ()
vil ta en enkelt node eller id og fjerne alt inni den. Bak kulissene, gjør Dojo faktisk bare node.innerHTML = ""
. Det er også en NodeList
versjon av denne metoden som åpenbart krever ingen parametere.
Det er et par metoder knyttet til flytting eller duplisering av DOM noder.
Du finner at du allerede er delvis kjent med dojo.place
, fra dojo.create
. Det tar tre parametre: noden, referansekoden og stillingen. Som du kanskje forventer spiller disse parameterne de samme rollene de gjør i dojo.create
:
var nav = dojo.byId ("nav"), p = dojo.query ("p") [0]; dojo.place (nav, p, "after"); // beveger 'nav' til høyre etter 'p' i DOM
Etter trenden med så mange Dojo DOM-metoder, er det en NodeList
metode motpart:
dojo.query ("p"). sted (dojo.body (), "first");
Så er det dojo.clone
. Mens det vil klone mer enn bare DOM node strukturer, det er det vi skal bruke det for akkurat nå: Hvis du overfører denne metoden en referanse til en DOM node, vil den klone eller kopiere den noden og alle sine barn. Dette vil duplisere vår eksempel navigasjon ul
, og legg kopien øverst i dokumentet:
var u2 = dojo.clone (dojo.byId ("nav")); dojo.attr (u2, "id", "nav2"); dojo.place (u2, dojo.body (), "first");
Du kan bruke dojo.clone
å klone andre JavaScript-objekter også.
var o1 = one: "one", o2 = dojo.clone (o1); o1 === o2; // falsk
Deretter er det NodeList
metode adoptere
. Jeg må innrømme at mens dette er en interessant metode, er jeg fortsatt ikke helt sikker på hvor jeg ville bruke den. Her er hva det gjør: det tar to parametre: en valgstreng eller DOM-node (r), og en valgfri posisjonsverdi, som har de samme alternativene som dojo.place
("Sist" som standard, etc.). Og så adoptere
Metoden vil ta elementet / elementene du passerte inn som den første parameteren (eller elementene i DOM som samsvarer med väljeren) og plassere dem i forhold til det første elementet i NodeList
. Deretter returnerer den de adopterte elementene som en ny NodeList
. Så, på vår eksempelside, erstatter dette alle de første barnets barn
dojo.query ("li"). adopter ("p", "bare");
Så det er det.
Siden NodeList
s ligner på arrayer, du kan bare bruke en vanlig til
loop for å iterere over dem. derimot, NodeList
s har a for hver
metode:
dojo.query ("li"). forEach (funksjon (element, indeks, arr) // gjør din ting);
Som du kan se, tilbakekaller funksjonen tre parametere, elementet, indeksen og selve arrayet. Hvis du vil sløyfe over andre arrays, kan du bruke dojo.forEach
på samme måte, bare passerer den gruppen som den første parameteren:
dojo.forEach ([1,2,3], funksjon (element) // act here);
for hver
returnerer NodeList
eller array som du startet med. Hvis du vil returnere et endret system, kan du bruke kart
metode. Uansett hva du kommer tilbake fra tilbakeringingsfunksjonen, vil være i arrayet (eller NodeList
) returnert på slutten.
dojo.map ([1,2,3], funksjon (element) returelement * element;); // [1, 4, 9]
Noe knyttet til dette er filtrering noder ut av en NodeList
, med filter
.Du kan bare passere denne metoden en CSS-velg, og bare elementer som samsvarer med den, blir holdt.
dojo.query ( "LI") filter ( "heve.."); // NodeList med en
derimot, filter
kan også ta en tilbakeringingsfunksjon som mottar tre parametere: gjeldende element, indeks og array. Hvis funksjonen returnerer ekte
, elementet holdes; ellers er det utelatt. En ny NodeList
av de holdte elementene returneres.
dojo.query ("li"). filter (funksjon (el) return dojo.query ("a", el) [0] .innerHTML === "Om";); // returnerer en NodeList som bare inneholder listeposten med teksten "Om"
Handily, det er også en dojo.filter
versjon som tar en matrise som den første parameteren og tilbakeringingen som et sekund.
dojo.filter (["Nettuts", "Psdtuts", "Phototuts"], funksjon (el, idx, arr) return el.slice (0,1) === "P"); // ["Psdtuts", "Phototuts"]
La oss nå snakke om hendelser med Dojo. Og vi starter med DOM-hendelser, siden det er vanligvis det du bruker. la oss si at vi vil gjøre noe når vår er klikket. Det er flere måter å gjøre dette på, og vi diskuterer dem alle her.
Først må vi anta at vi håndterer en hendelse som oppstår på et element eller elementer som vi har hentet med dojo.query
. Vi kunne bruke ved trykk
metode som NodeList
barbere:
dojo.query ("h1"). onclick (function () alert ("Learning Dojo"););
Men dette er egentlig bare en "syntaktisk sukker" metode. Bak kulissene bruker Dojo den koble
NodeList metode:
dojo.query ("h1") .koble ("onclick", funksjon (e) alert ("learning Dojo"););
Denne metoden overfører faktisk jobben til en annen metode, dojo.connect
; du vil nok bruke denne metoden direkte når du har en enkelt DOM-node som du vil håndtere en hendelse på:
var h = dojo.query ("h1") [0]; // eller dojo.byId ("some_element"), for eksempel dojo.connect (h, "onclick", funksjon () alert ("learning Dojo"););
Legg merke til hvordan hver gang vi "flytter opp et lag", legger vi til en annen parameter i begynnelsen av metallsamtalen.
La oss snakke kort om å koble sammen hendelser. Når du bruker metodene som er oppgitt på en NodeList
For eksempel, det er for øyeblikket ingen enkel måte å koble fra hendelsene. Dette er fordi dojo.connect
returnerer et håndtak som brukes i frakobling av hendelser. For å koble fra en hendelse, send håndtaket til dojo.disconnect
:
var h = dojo.query ("h1") [0], håndtere = dojo.connect (h, "onclick", funksjon () alert ("learning Dojo"); dojo.disconnect (handle););
Hvis du setter det i konsollen, klikker du på , du får et varsel. Deretter vil håndtereren bli frakoblet, slik at etterfølgende klikk ikke vil gjøre noe.
Hvis du vil lage dine egne hendelser (eller ved å bruke Dojos terminologi, dine egne emner), kan du bruke Dojos publisere
og abonnere
metoder. Hvis du er kjent med hvordan andre pub / sub-systemer fungerer, har du ingen problemer med dette.
For å abonnere på et emne, bare pass navn på emnet og funksjonen som skal vises når emnet blir publisert:
dojo.subscribe ("myTopic", funksjon (data, moreData) alert (data); console.log (moreData););
Deretter kan du publisere emnet nesten like enkelt:
dojo.publish ("myTopic", ["noen data", "noen flere data"]);
Legg merke til at alle data du vil overføre til funksjoner som abonnerer på emnet ditt, blir satt inn i en matrise og bestått som en andre parameter.
I denne opplæringen har vi dekket sannsynligvis 90% av DOM-funksjonaliteten som er bygd inn i Dojo-basen filen vi kommer fra Googles CDN. Det er imidlertid mer funksjonalitet å diskutere. Før vi kommer dit, må vi imidlertid lære om å trekke i Dojos ekstra funksjonalitet. Vi diskuterer det og mye mer i neste episode av denne serien.
Har du noen forespørsler om ting du vil lære å gjøre i Dojo? Jeg leser alltid kommentarene, så du vet hva du skal gjøre!