רשמים ראשונים מ-jQuery

אתמול התחלתי ללמוד ולעבוד עם ספריית jQuery בעקבות דרישה של מנהל הפיתוח בחברה שאני אעבוד בה החל מספטמבר. jQuery למי שלא מכיר היא ספריית JavaScript שנועדה להקל על העבודה ב-DOM ומן המתבקש היא גם תומכת ב-Ajax:

“jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. jQuery is designed to change the way that you write JavaScript.”

המשפט האחרון הוא באמת נכון, זה משנה את הדרך שבה עובדים עם JS, אני פשוט אישית לא מתחבר לזה – היא דרך ארוכה יותר בהשוואה ל-Frameworkים אחרים. מההיכרות שלכם איתי אתם יודעים שאני משתמש בעיקר ב-MooTools בשביל לכתוב את קוד ה-JS שלי.

הדבר שאני הכי לא מתחבר אליו בספרייה, זה שבשביל להשתמש ביכולות שלה בהקשר של DOM Traversing זה שכל פעם צריך לקרוא לפונקציה jQuery (או ל-alias בצורת $).
הפונקציה בעצם עוטפת את כל האלמנטים שנמצאים לפי ביטוי הסלקציה או את האובייקט שמועבר בתור פרמטר לפונקציה, בתוך מערך. וכל הפונקציונליות של הפריימוורק בנוי על איטרציה על המערך הזה, כל פעולה תתבצע על כל איברי המערך.

זה דבר חכם מאוד לעשות, אבל מה קורה כאשר עושים פעולות על אלמנט בודד? באמת צריך להפעיל לולאה בשביל אלמנט בודד אחד?

בנוסף, עבודה עם אירועים, יש שתי דרכים לעשות להשתמש בפונקציית bind או להשתמש בפונקציה שמתארת את האירוע (אך ורק אם זה אירוע ברירת מחדל כמו mouseover).
ולכל אחת הפונקציות מעבירים פונקציה שתשמש בתור event listener והיא מקבלת בתור הפרמטר את אובייקט האירוע המתוקן שלהם (תיקונים עבור IE כמובן) וה-this שלה הוא בעצם האלמנט עצמו שעליו עובדים.
ה-context של this הוא הבעיה שמטרידה אותי פה, כי בעצם מה שעושים באירועים הוא בד”כ עבודה נוספת על ה-DOM, שינוי של תכונות, חיפוש, הוספה וגם עבודה על אובייקטים אחרים שלא קשורים ב-DOM (כמו Ajax, ומופעי מחלקות פרטיים). אבל למה לספק לנו את האלמנט המקורי ולא את הגרסה העטופה שלו? ברור שנצטרך לעטוף אותו שוב, ואז מדובר בעוד קריאה לפונקציה, ליצור עוד אובייקט.

זה גורם לי גם להיות סקפטי לגבי מבחני המהירות בין הספריות השונות, jQuery היא במקום השני בד”כ אחרי dojo toolkit בחיפוש ב-DOM והיא יותר מהירה מ-MooTools, אבל האם המהירות הזאת לא נופלת ממעמדה כאשר כל פעם צריך לקרוא לפונקציה $ בשביל לעטוף את האלמנט או לבצע לולאה בשביל להגיע לאלמנט בודד? בעוד ש-MooTools למשל בגלל הדרך שהיא עובדת מאפשרת להמשיך לעבוד עם האלמנט המשופר גם בתוך האירוע.

יצירה של אלמנטים היא נושא קליל ב-jquery, מעבירים את ה-markup שאנחנו רוצים לתוך הפונקציה jQuery או $, והיא בעצם הופכת אותו למבנה DOMי שעטוף בתוך אובייקט jQuery.
אין לי התנגדות לזה, אבל אנחנו עובדים עם JS וה-DOM, אז שתהיה אפשרות לפחות להגדיר אלמנטים בצורה OOPית.

דבר אחרון שקצת מפריע לי זה שאין שיפור בנוחות בעבודה עם OOP כמו שיש ב-MooTools או ב-Prototype. בשביל ליצור מחלקות חייבים לעבוד בצורה הרגילה והמסורתית, יצירה של פונקציה להרחיב אותה עם this , ירושה לבצע בדרך המכאיבה של העתקת prototype, קריאה למתודה במחלקת האב בעזרת call/apply לפונקציה מה-prototype של האב וכו’. פחות נעים, אבל אפשר להסתדר עם זה.

מעבר לזה אני אוהב את הצורה שהקוד של jQuery בנוי, איך שפונקציה אחת עושה המון דברים.
jQuery מנחה את המתכנת לעבוד גם בצורה נורא יציבה של שמירה על ה-global namespace (למרות שראיתי כבר כמה פלאגינים שלא עוקבים אחרי זה), היא לא “מזהמת” את האובייקטים והאלמנטים במסמך בעוד תכונות ובכך היא יכולה להיטמע בקלות באתרים אחרים שעובדים עם פריימוורקים אחרים.

יכול להיות שהרשמים הראשוניים שלי הם שגויים כי איני מכיר את הספרייה לעומק ולא עבדתי איתה כמו שעבדתי עם MooTools, החל מספטמבר יהיו לי חודשיים (עד הגיוס הקרב והבא) אינטנסיביים של שימוש ב-jQuery ודעתי עוד תשתנה סביר להניח (אחרת הפופולריות שלה לא מובנת).

16 תגובות עבור “רשמים ראשונים מ-jQuery”

  1. מאת אלעד:

    מסכים עם כל מה שנאמר.
    אני לא מבין איך אנשים מעדיפים (ע”פ סטטיסטיקות, סקרים ומספר תוצאות בגוגל) jQuery ולא MooTools, שכל כך הרבה יותר אינטואטיבית לכתיבה. בכל פונקציה אתה יודע מה אתה שולח ומקבל, וצורת החשיבה של המפתחים שם מאוד פילוסופית-תכנותית-נכונה.
    ה-OOP, ה-Native, האירועים וכו’ מאוד קלים לתפעול וכתיבה, שאפשר לנחש ממש איך לכתוב.
    ב-jQuery הכל אמנם קצר, אבל לא אינטואטיבי.

  2. מאת ניר טייב:

    אגב, הרצתי עכשיו את הבדיקת מהירות סלקטורים אצלי על המחשב (Ubuntu 8.04, Firefox3, Core2 Duo, 2GB RAM)
    ויצא ש-MooTools יותר מהירה מ-jQuery בממש קצת אבל dojo עדיין עוקפת ב-100ms יותר מהר.

  3. מאת Macpire:

    בוגד!
    תזור מהר למוטולס ותגיד למעביד שלך שיעבור לזה :P

  4. מאת Macpire:

    תחזור*

  5. מאת ישראל:

    “אחרת הפופולריות שלה לא מובנת”.
    פופלאריות בהחלט מצביעה עתים על טיב של מוצר, אך במקרים כאלו לא ממש. כדוגמה גסה תוכל לקחת את השימוש במערכות ההפעלה, דפדפן ושאר מרעין בישין. אני מסופק אם תגרום לפופולאריות של מערכת גרועה לבלבל אותך עם האיכות של עמיתיה הפחות מוכרות…

  6. מאת אוריאל כץ:

    לאיפה אתה מתגייס? שלא ידפקו אותך כמוני!

  7. מאת ניר טייב:

    כנראה למודיעין, לאיזה מסלול בפרוייקט גאמא. אם לא אז אני אהיה בצנחנים :).

  8. מאת אוריאל כץ:

    חחח,בדיוק כמוני,בסוף חודשיים לפני הגיוס שלי העיפו אותי בסוף סיימתי בבקו”ם.
    אבל עכשיו אני יוצא משם למשהו טוב

  9. מאת זיו (fat fish):

    jQuery לא סתם פופולרית, עדיין מדובר ב-framework מהטובים ביותר שיש, ואני דוקא מאוד אוהב את התחביר שלהם. למרות שלא יצא לי לעבוד הרבה עם jQuery, מההכרות הקצרה שלי עם ה-core שלה אני לא מבין את התלונה הראשונה שלך. על איזו לולאה אתה מדבר?

  10. מאת ניר טייב:

    בכל פונקציה ב-jQuery.prototype יש שימוש בפונקציה each.
    לאחר שימוש אינטסיבי ב-MooTools קשה מאוד לאהוב את התחביר של jQuery, כמו שאלעד אמר, הוא לא אינטואיטיבי.

  11. מאת זיו (fat fish):

    עברתי על הקוד של ה-core, ובכל מקום שיש each יכלה להיות אופציה אחת מבין השתיים:
    1. לספק פונקצה עבור אלמנט בודד.
    2. לבדוק ב-if אם מדובר באלמנט בודד.

    עכשיו, מה נראה לך יותר יעיל? לבצע איטרציה בודדת על אלמנט או אחת משתי האופציות לעיל?????

    בכל מקרה, ממש לא קשור - אם אתה רוצה לעשות הכרות עם ספריית js שונה לחלוטין, הגיע הזמן לנסות את dojo.
    מנגנון ה-templating שלה (שכמה ספריות אחרות הבטיחו שיהיה להן גם, כמו jQuery לדוגמה) הוא אחד הכלים החזקים ביותר שקיימים.
    נכון שהיא קצת מתועדת רע - אבל מאחר ואני כבר התמקצעתי בה במסגרת העבודה, ויש לי הכרות טובה עם mootools/prototype, אני חושב שהיא עולה על שניהם.

  12. מאת אוריאל כץ:

    מה שנחמד בjQuery שאפשר לבצע פעולות על הרבה אלמנטים כמו שהייתי עושה אותם עם SQL (או LINQ) רק עם CSS SELECTORS במקום SQL,דבר שמקצר את הקוד בהרבה.
    למרות זאת,אני גם מעדיף את MOOTOOLS,שזה אחד הספריות שכתובות הכי טוב מבחינת קוד.

  13. מאת ניר טייב:

    גם ב-mootools זה אפשרי אם הבנתי למה אתה מתכוון

  14. מאת אוריאל כץ:

    אני מתכוון לזה שבjQuery יש מעיין STACK שאפשר ללכת אחורה,דבר ממש יפה

  15. מאת ניר טייב:

    אתה יכול להסביר יותר לעומק בבקשה?

  16. מאת אוריאל כץ:

    יש הרצאה של ילד בן 14 בגוגל שמדבר על jQuery משהו מדהים:
    http://www.youtube.com/watch?v=8mwKq7_JlS8
    שם הוא מדגים את הכוח האמיתי של הframework הזה.

השארת תגובה


:mrgreen::|:twisted::arrow:8O:):?8):evil::D:idea::oops::P:roll:;):cry::o:lol::x:(:!::?: