Arhiva

Posts Tagged ‘functie’

Crearea plugin-urilor jQuery (partea 1)

noiembrie 19, 2009 1 comentariu

Scurtă introducere

Dacă te întrebi la ce or fi bune plugin-urile astea jQuery, îți voi spune eu: îți permite extinderea întregii librării jQuery prin adăugarea de noi metode și funcții la aceasta. De exemplu, ai putea crea un plugin care, printr-un singur apel, va parcurge toate link-urile unei pagini, și la fiecare link către un fișier PDF va adăuga o iconiță descriptivă. Apelul va arăta ceva în genul:

$("a").adaugaIconitaPDF();

Idei pentru plugin-uri sunt multe, prea multe chiar, și ca să te convingi poți intra pe pagina de plugin-uri jQuery unde le vei găsi ordonate după categorie. La momentul actual, acolo sunt 3684 de plugin-uri! Deci idei sunt cu tonele, și tot apar plugin-uri zi de zi. Așa că, ori poți sta să cauți plugin-ul care-ți trebuie, ori poți învăța să creezi propriile plugin-uri, lucru despre care voi discuta în următoarele câteva articole.

Să intrăm în pâine!

Pentru început, e nevoie de puțină teorie interesantă. În caz că nu știai deja, jQuery e renumit pentru faptul că poate fi folosit cu ajutorul unui singur caracter: simbolul dolar ($). De puține ori, însă, vei da peste probleme folosind simbolul $, fiindcă nu este singurul framework care face uz de acest simbol. Așa că, pentru a evita conflicte, când este cazul, se poate folosi cuvântul “jQuery“. De exemplu:

jQuery("a").fadeIn();
jQuery.variabila = 2;

Acum să îți spun și care sunt acele puține cazuri când pot apărea conflicte cu simbolul $: când creezi plugin-uri, și când folosești încă un framework împreună cu jQuery, de exemplu ExtJS + jQuery. Știind acum aceste lucruri, să începem cu plugin-urile! Pentru a putea crea plugin-uri, e nevoie să știi jQuery, evident, și care sunt obiectele extensibile din jQuery:

  1. jQuery
    • se ocupă cu procesarea internă
    • extinde metode (în alte limbaje de programare sunt cunoscute ca metode statice, sau metode de clasă)
  2. jQuery.fn
    • se ocupă de elemente HTML și interacțiunile dintre ele
    • extinde funcții (în alte limbaje de programare sunt cunoscute ca metode de instanță)

Ca să fiu sigur că nu mă vei pierde, îți voi explica ce reprezintă metodele și funcțiile. Dacă ai deja experiență în programarea orientată pe obiecte, poți sări peste paragraful acesta. Deci, metodele pot fi apelate direct, fără a instanția o clasă. Funcțiile, pe de altă parte, pot fi apelate doar asupra unui obiect ce reprezintă o instanță a unei clase. Dacă nu știi nici ce reprezintă instanțierea, e cazul să te oprești aici și să iei un tutorial de POO în C++ sau orice alt limbaj vrei.

Știind acum ce obiecte jQuery pot fi extinse, voi crea un simplu plugin care afișează un mesaj la încărcarea unor elemente HTML. Apelul va fi simplu:

$.mesaj("mesaj la comanda");     //metodă
$("div").mesaj("m-am incarcat"); //funcție

Și acum iată codul, trivial de altfel:

//codul pentru metodă
jQuery.mesaj = function(msg) {
   alert(msg);
};

//codul pentru funcție
jQuery.fn.mesaj = function(msg) {
   alert(msg);
}

Ți se pare complicat ? Dacă da, e grav, fiindcă în următoarele articole se mai complică, fiindcă voi discuta despre:

  • variabile locale și globale
  • ascunderea variabilelor
  • orientarea pe obiecte
  • setările plugin-urilor
  • funcții cu opțiuni și parametri
  • template-urile cele mai utilizate pentru plugin-uri
  • și în final, o listă de guidelines, adică un mic ghid

jQuery – Best Practices #6

octombrie 29, 2009 Scrie un comentariu

Folosirea contextului la selectori

În articolul precedent arătasem care sunt cei mai rapizi selectori jQuery, iar acum îți voi mai da un sfat care să facă orice selector mai rapid cu 25% decăt era (dar ordinea performanței va rămâne aceeași, adică primează selectorul de ID, apoi cel de tag + clasă, apoi cel de tag, apoi cel de clasă.


<p>$("div.clasa_mea", "#element_parinte");</p>

Să explic acum de ce codul de mai sus e super super rapid. În primul rând, să explic sintaxa. jQuery acceptă și un al doilea parametru când se folosește un selector, reprezentând contextul în care se face căutarea propriu-zisă. Ce înseamnă asta ? În cazul de mai sus i-am spus lui jQuery să-mi caute elementul DIV cu clasa clasa_mea, dar să caute doar în cadrul elementului cu ID-ul element_parinte, în loc să caute tot DOM-ul cum ar fi făcut dacă nu s-ar fi precizat contextul căutării. De ce e super rapid ? În primul rând, jQuery procesează mai întâi contextul, și apelează funcția JavaScript getDocumentById( ), apoi începe căutarea în cadrul elementului găsit, căutând un element DIV ce are clasa clasa_mea. Deci e foarte rapid!

Evident că tot nu e mai rapid decât selectorul de ID. Acum precis te întrebi: dar dacă folosesc context la selectorul de ID, va fi mai rapid ? În ciuda faptului că ar părea logic, din păcate nu va fi mai rapid. Iată codul, și imediat explic și de ce:


<p>$("#myID", "#element_parinte");</p>

Dacă ai urmărit până acum ce am explicat, apelul de mai sus face două lucruri: caută elementul element_parinte cu viteza maximă a selectorului de ID, dar apoi mai face încă o căutare, cea a elementului myID. Chiar dacă va fi restrânsă căutarea doar în cadrul contextului, faptul că se mai face o căutare extra va adăuga câteva fracțiuni de secundă în plus la căutare, comparativ cu folosirea selectorului ID fără context care face doar o singură căutare.

jQuery – Best Practices #5

octombrie 29, 2009 Scrie un comentariu

Traversarea eficientă a DOM-ului

Dacă folosești des selectorii jQuery, este bine să iei în considerare viteza cu care se execută diferitele tipuri de selectori. În continuare găsești cele 3 tipuri mari de selectori în ordinea performanței, primul fiind cel mai rapid:

 $("#un_id"); // cautare dupa ID $("div"); //cautare dupa tag $(".clasa") //cautare dupa clasa 

Acum, evident, urmează explicațiile. Selectorul de ID folosește funcția JavaScript getElementById( ) care e cea mai rapidă. Punct. Al doilea selector, cel de tag, este următorul cel mai rapid fiindcă folosește funcția JavaScript getElementByTagName( ) care e mai înceată decât prima. Ultimul selector, cel de clasă, este cel mai încet fiindcă nu folosește o funcție anume, ci traversează tot DOM-ul pentru a găsi ce trebuie. Dar, ca un sfat, poți folosi ultimii doi selectori într-unul singur, obținând astfel un selector mai rapid decat cel de tag:

 $("div.clasa"); 

jQuery – Best Practices #4

octombrie 28, 2009 Scrie un comentariu

Manipularea eficientă a DOM-ului

În articolul precendet arătasem cum să mărești viteza codului de până la 5 ori, însă cu modificările făcute tot mai a rămas loc de îmbunătățire, lucru pe care-l voi face acum. Iată bucata de cod performantă (dar nu de-ajuns) din articolul precedent:

var obj = $("#lista_ul");
for (i=0; i<10000; i++)
   obj.append( $("<li>Item " + i + "</li>") );

Ce nu e în regulă cu codul ? Absolut totul e în regulă, dar dacă lucrezi cu gândul la performanță, nu e deloc în regulă. Hai să explic: funcțiile append, prepend, appendTo, prependTo, after, before, wrap, și cam toate care au de-a face cu manipularea DOM-ului au multe de făcut în spatele scenei, așadar codul de mai sus e foarte greu tocmai din 2 motive: apelez funcția append de 10000 de ori, și creez un obiect nou de tip

  • la fiecare iterație, lucru care înseamnă că la final am creat 10000 de obiecte și am apelat de 10000 de ori funcția append. E crimă curată! Cum se poate remedia ? Iată soluția:
  • var obj = $("#lista_ul");
    var elemente = "";
    for (i=0; i<10000; i++)
       s += "<li>Item " + i + "</li>";
    obj.append( s );
    

    Și ce dacă a crescut numărul de linii de cod ? De data asta avem o bucată de cod foarte performantă. Iată de ce:

    1. folosim o singură dată selectorul de ID pentru a accesa lista;
    2. folosim o singură dată funcția append;
    3. în loc să creăm 10000 de obiecte, folosim un singur șir de text la care adăugăm mereu text simplu care mai apoi va fi folosit de funcția append ca o bucată mare de cod HTML ce va fi adăugat în listă, obținând astfel foarte repede o listă foarte mare.

    Dacă ai vreo idee să îmbunătățim și mai mult performanța acestui cod, aștept cu nerăbdare sugestii! Până la următorul articol îți spun: folosește jQuery cu cap, nu doar cu ochii!

    Follow

    Get every new post delivered to your Inbox.