Quick Tip - jQuery Newbs Stopp Hopp i bassenget

Som redaktør av Nettuts +, får jeg se mye kode fra opplæringen. Til tross for at jQuery har vært tilgjengelig i mange år, er det fortsatt en hyppig feil at jeg ser mer enn noe annet.


Eksempel # 1

Vurder følgende bit kode:

$ ('. nav a'). klikk (funksjon () $ (dette) .hide (); $ (dette) .css ('farge', 'rødt'); $ (dette) .show ('noe annet'); $ (dette) .hide (); return false;);

Koden ovenfor er altfor komplisert av en rekke årsaker. Ikke bekymre deg for hva koden egentlig gjør (det er gibberish). I stedet vil jeg at du skal se på alle disse referansene til $ (Denne).

Tenk på DOM som et basseng.

Tenk på DOM som et basseng. Husk når du var barn, og ville dykke inn i bassenget for mynter, mens foreldrene dine oppførte seg som de så på? Det vil bli vår ekte verdenskompisisjon.

Hver gang du bruker $ ('. SomeClass'), jQuery hopper inn i bassenget (DOM), og søker etter den mynten (eller noder). Så, når du refererer det flere ganger i en funksjon, det er mye dykking. Eller for å kutte sammenligningen i sanntid, er det sløsing og unødvendig. Hvorfor ringe på jQuery hvis du ikke trenger det? Du bør utføre det vi kaller? Caching.?

$ ('.nav a'). klikk (funksjon (e) varanker = $ (dette); anker .hide () .css ('farge', 'rødt') .show (); '); anchor.hide (); e.preventDefault (););

Dette er mye renere. Mens moderne nettlesermotorer er utrolig raske i disse dager, og vil gjøre opp for dårlig koding så best som mulig, bør du likevel streve etter å skrive effektiv kode, og ikke kast bort all den energien som hopper i bassenget. Nå, teknisk, hvis du sender jQuery en DOM node, liker dette, det spør ikke om DOM. Den returnerer bare et jQuery-objekt.

Bare fordi ytelsesforskjellen mellom de to vil være ubetydelig, skriver vi ren kode for oss selv.

Eksempel 2

La oss vurdere et litt mer komplisert eksempel: faner.

$ ('. tabs li'). css ('posisjon', 'relativ'); $ ('. tabs li'). Klikk (funksjon () $ ('.labs li'). removeClass ('aktiv'); $ (dette) .addClass ('aktiv'); $ (dette). 'someHref', funksjon () ); // eksempel $ (dette) .css ('topp', '1px'););

Denne koden er over alt. Det er styggt og ineffektivt. Fix nummer én er å kvitte seg med alt det CSS. Du vil bare plassere styling i JavaScript hvis verdiene ble opprettet dynamisk. Hvis du for eksempel trenger å beregne nøyaktig plassering, bør et element være på skjermen, du kan bruke .css ('left', calculatedValue). I dette tilfellet kan alt eksporteres til et eksternt stilark. Det etterlater oss med:

$ ('tabs li'). klikk (funksjon () $ ('.labs li'). removeClass ('aktiv'); $ (dette) .load ('someHref', funksjon () ); / eksempel $ (dette) .addClass ('aktivt'););

Deretter igjen, hvorfor fortsetter vi å spørre DOM for .faner li og $ (Denne)? Stopp hopping i bassenget. La oss? Cache? plasseringen av .faner li.

var-faner = $ ('. tabs li'); tabs.click (function () tabs.removeClass ('active'); $ (dette) .load ('someHref', funksjon () ); // eksempel $ (dette) .addClass ('aktiv'); );

Bedre, men vi ringer fortsatt $ (Denne) to ganger, som ikke er en stor avtale. Men fra mine erfaringer, hvis du ikke nipper det i knoppen tidlig, øker dette nummeret raskt.

var-faner = $ ('. tabs li'); tabs.click (function () var tab = $ (dette); tabs.removeClass ('active'); tab.addClass ('aktiv') .load ('someHref', funksjon () ); // eksempel );

filtrering

Et annet (litt mindre optimalisert) alternativ ville være å bruke filtrering.

 var-faner = $ ('. tabs li'); tabs.click (function () tabs.removeClass ('active') .filter (dette) .addClass ('aktiv') .load ('someHref', funksjon () ); // eksempel);

Forskjellen i dette tilfellet er det, heller enn å referere $ (Denne), vi bruker filter() metode for å redusere samlingen av listeposter ned til bare den som ble klikket.


Hva du bør ta bort

Ja, verden vil ikke ende hvis du refererer $ ('. Tabs) flere ganger i en funksjon. JavaScript-motorer er super raske i disse dager. Hvis du skulle teste ytelsen til å gjøre det tusenvis av ganger, kan forskjellen i utførelse være et par hundre millisekunder. Men fortsatt er spørsmålet fortsatt: hvorfor ville du?

Noen ganger, når vi bruker massive abstraksjoner som jQuery, er det lett å glemme det $ ('. Fanene) er en faktisk funksjon som kjører en god del kode. Det bør også bemerkes at disse begrepene gjelder for JavaScript generelt - ikke bare jQuery.

Bruke caching teknikker beskrevet ovenfor for å skrive renere kode? for deg selv.