You are on page 1of 240

‫ﻋﺒﺪ اﻟﻠﻄﻴﻒ اﻳﻤﺶ‬

‫تعلم ‪jQuery‬‬

‫ترجمة‬

‫عبد اللطيف ايمش‬


‫تقديم‬

‫ت‬
‫تعلم ‪jQuery‬‬ ‫تقديم‬

‫أصببببح ظببباهرًا للعيبببان كيبببف أصببببحت مكتببببة ‪ jQuery‬من أشبببهر مكتببببات ‪ JavaScript‬وأكثرهبببا‬

‫استخدامً ا‪ ،‬إذ تستعملها كبرى الشركات كشركة ‪ Google‬والبرمجيات الشهيرة كبرمجية ‪،WordPress‬‬

‫وأظهرت الحصائيات أنها مستعملة في أكثر من نصف مواقع الويب‪.‬‬

‫أساسبا للمعلومببات الببتي‬


‫ً‬ ‫ستشب ِ‬
‫بكل‬ ‫جاء هذا الكتاب لشرح المفبباهيم الساسببية في ‪ jQuery‬والببتي ُ‬

‫ُ‬
‫وحاولت أن أتوخى فيه الدقة مع الحفاظ على بساطة الشرح ووضوحه‪.‬‬ ‫ستتعلمها في المستقبل‪،‬‬

‫ٌ‬
‫مبببترجم عن كتببباب »‪ «jQuery Enlightenment‬لصببباحبه ‪ ،Cody Lindley‬والبببذي‬ ‫هبببذا الكتببباب‬

‫لحقا باسم »‪ُ .«jQuery Succinctly‬ن ِش ب َ‬


‫رت هببذه النسببخة المترجمببة من الكتبباب‬ ‫ً‬ ‫َن َش ُ‬
‫رته ‪Syncfusion‬‬

‫بعد أخذ إذن المؤلف‪.‬‬

‫مرخص بمببوجب رخصببة المشبباع البببداعي ‪َ » Creative Commons‬نسببب المُ صبنّف ‪-‬‬
‫ٌ‬ ‫هذا الكتاب‬

‫لمعلومبات‬
‫ٍ‬ ‫غير تجاري ‪ -‬الببترخيص بالمثببل ‪، (Attribution-NonCommercial-ShareAlike 4.0) «4.0‬‬

‫أكثر عن هذا الترخيص راجع هذه الصفحة‪.‬‬

‫وفي النهاي ببة‪ ،‬أحم ببد ا على توفيق ببه لي بإتم ببام العم ببل على الكت بباب‪ ،‬وأرج ببو أن يك ببون إض ب ً‬
‫بافة‬

‫ً‬
‫مفيدة للمكتبة العربية‪ ،‬وا ولي التوفيق‪.‬‬

‫عبد اللطيف محمد أديب ايمش‬

‫حلب‪ ،‬سورية ‪2017/5/3‬‬

‫‪4‬‬
‫هذا الكتاب برعاية‬

‫عربي يُ عنى بتتبع أخبار البرمجيات الحببرة والمببواد التعليميببة المتعلقببة‬


‫ٌ‬ ‫تقني‬
‫ٌ‬ ‫وادي التقنية موقعٌ‬

‫بهببا‪ ،‬يكتب فيببه عببدد من المتطببوعين المهتمين بالبرمجيببات الحببرة والتقنيببة بشببكل عببام؛ يهتم وادي‬

‫التقنية بمواضيع مثل أنظمة التشغيل الحاسببوبية والهاتفيببة‪ ،‬ولغببات البرمجببة‪ ،‬والمكتبببات البرمجيببة‪،‬‬

‫وتقنيات الويب‪ ،‬وأخبار شركات البرمجة الكبرى‪ ،‬والمصادر المفتوحة‪ ،‬والعتاد وأجهزة الحاسوب ‪.‬‬

‫دعم وادي التقنيبببة كتاببببة العديبببد من الكتب التقنيبببة في مجبببال البرمجيبببات الحبببرة ومفتوحبببة‬

‫ً‬
‫مجان ا للمستخدم التقني العربي‪ ،‬ومن أهم الكتب التي دعمها وادي التقنية‪:‬‬ ‫المصدر‪ ،‬وتوفيرها‬
‫جدول المحتويات‬

‫تقديم‪3...............................................................‬‬

‫تمهيد‪13............................................................‬‬
‫‪ .1‬اصطلحات ‪14..................................................................................... jQuery‬‬

‫‪ .2‬طريقة تنظيم هذا الكتاب ‪15..............................................................................‬‬

‫ٌ‬
‫وشرح أقل ‪15...............................................................................‬‬ ‫ٌ‬
‫شيفرات أكثر‬ ‫‪.3‬‬

‫‪ .4‬لماذا أستخدم )(‪ alert‬في المثلة؟! ‪15..................................................................‬‬

‫‪ .5‬التنسيق واللوان ‪16........................................................................................‬‬

‫‪ .6‬افهم الدالة )(‪ text‬في ‪ jQuery‬فهمً ا تامً ا قبل قراءة هذا الكتاب ‪17.................................‬‬

‫‪ .7‬ما هو ‪ JS Bin‬ولماذا أستخدمه؟ ‪18......................................................................‬‬

‫الفصل الول‪ :‬المفاهيم الساسية في ‪19.............jQuery‬‬


‫‪ .1‬المفاهيم الساسية وراء ‪20...................................................................... jQuery‬‬

‫‪ .2‬المفهوم وراء المفهوم الذي يقف وراء ‪21..................................................... jQuery‬‬

‫‪ .3‬كيفية التحقق من إصدار ‪22..................................................................... jQuery‬‬

‫‪ .4‬تتطلب ‪ jQuery‬أن يكون مستند ‪ HTML‬بنمط المعايير أو نمط المعايير التقريبي‪23............‬‬

‫ِ‬
‫ضمن جميع ملفات ‪ CSS‬قبل تضمين ‪24....................................................... jQuery‬‬ ‫‪.5‬‬

‫‪ .6‬استخدام نسخة ُمستضافة من ‪24............................................................. jQuery‬‬

‫‪ .7‬تنفيذ الشيفرة عندما تجهز شجرة ‪ DOM‬لكن قبل الحدث ‪25..................window.onload‬‬

‫‪ .8‬تنفيذ شيفرات ‪ jQuery‬عندما ينتهي المتصفح من تحميل كامل المستند‪28.....................‬‬


‫‪ .9‬تنفيذ شيفرة ‪ jQuery‬عندما ُت ّ‬
‫فسر شجرة ‪ ،DOM‬لكن دون استخدام )(‪30.................ready‬‬

‫‪ .10‬استخدام ‪ $‬دون القلق من حدوث تضاربات ‪31......................................................‬‬

‫‪ .11‬فهم كيفية عمل السلسل في ‪33............................................................. jQuery‬‬

‫‪ .12‬كسر السلسلة باستخدام دوال »هادمة« ‪34..........................................................‬‬

‫‪ .13‬استخدام الدوال الهادمة في ‪ jQuery‬والعودة منها باستخدام )(‪36........................end‬‬

‫ُ‬
‫متعددة الستخدامات ‪38...............................................................‬‬ ‫ُ‬
‫الدالة ‪jQuery‬‬ ‫‪.14‬‬

‫‪ .15‬معرفة متى ُتشير الكلمة المحجوزة ‪ this‬إلى كائنات ‪41.....................................DOM‬‬

‫ً‬
‫مباشرة دون ‪45.................jQuery‬‬ ‫‪ .16‬استخراج العناصر من مجموعة التغليف لستخدامها‬

‫‪ .17‬التحقق إن كانت مجموعة التغليف فارغة ‪48........................................................‬‬

‫‪ .18‬إنشاء اسم بديل للوصول إلى الدالة ‪50..................................................... jQuery‬‬

‫كافيا ‪51.......................‬‬
‫ً‬ ‫‪ .19‬استخدام )(‪ .each‬عندما ل يكون الدوران الضمني على العناصر‬

‫‪ُ .20‬‬
‫ستعاد العناصر في مجموعة تغليف ‪ jQuery‬بنفس ترتيب ورودها في المستند‪56 ...........‬‬

‫‪ .21‬تحديد ما هو السياق المُ ستخ َدم من دالة ‪57............................................... jQuery‬‬

‫‪ .22‬إنشاء بُنية ‪ DOM‬كاملة مع أحداثها في سلسلةٍ وحيدة ‪58.........................................‬‬

‫الفصل الثاني‪ :‬تحديد العناصر في ‪61...................jQuery‬‬


‫حدد العناصر إن ُاستعمِ َلت بمفردها‪62....................‬‬ ‫‪ .1‬يمكن لمُ ِ‬
‫رشحات ‪ jQuery‬الخاصة أن ُت ِ‬

‫ِ‬
‫المرش َحين ‪ :hidden‬و ‪62................................................... :visible‬‬ ‫‪ .2‬تمييز الفرق بين‬

‫‪ .3‬استخدام الدالة )(‪ is‬لعادة قيمة منطقية ‪64...........................................................‬‬

‫‪ .4‬يمكنك أن ُت ِ‬
‫مرر أكثر من مُ ِ‬
‫حدد إلى ‪66......................................................... jQuery‬‬

‫أن عنصرًا ما قد ُح ِد َد‪67...........................................................................‬‬


‫‪ .5‬معرفة ّ‬

‫خصصة لتحديد العناصر ‪68.........................................................‬‬


‫ّ‬ ‫‪ .6‬إنشاء ُم ِ‬
‫رشحات مُ‬
‫‪ .7‬الفروقات بين الترشيح عبر الترتيب الرقمي والترشيح عبر العلقات في شجرة ‪71.....DOM‬‬

‫‪ .8‬تحديد العناصر عبر خاصية ‪ id‬عندما تحتوي قيمتها على محارف خاصة ‪77....................‬‬

‫‪ .9‬إنشاء سلسلة من المُ ِ‬


‫رشحات ‪78..........................................................................‬‬

‫‪ .10‬إنشاء مُ ِ‬
‫رشحات متشعبة ‪80.............................................................................‬‬

‫‪ .11‬التعرف على استعمالت المُ رشح )(‪82.................................................... :nth-child‬‬

‫‪ .12‬تحديد العناصر عبر البحث في قيم الخاصيات باستخدام التعابير النمطية‪84................‬‬

‫‪ .13‬الفرق بين تحديد الولد المباشرين وبين تحديد البناء والحفاد‪86............................‬‬

‫‪ .14‬تحديد الولد المباشرين عندما يُ ح ّدد السياق ‪88...................................................‬‬

‫الفصل الثالث‪ :‬التنقل في شجرة ‪90.......................DOM‬‬


‫‪ .1‬الفرق بين الدالتين )(‪ find‬و )(‪91.................................................................. filter‬‬

‫‪ .2‬تمرير دالة إلى )(‪ً filter‬‬


‫بدل من تعبير ‪94.................................................................‬‬

‫‪ .3‬التنقل في شجرة ‪97................................................................................. DOM‬‬

‫‪ .4‬دوال التنقل تقبل تمرير تعبيرات ‪ CSS‬كوسائط اختيارية ‪99........................................‬‬

‫الفصل الرابع‪ :‬تعديل شيفرات ‪101........................HTML‬‬


‫‪ .1‬إنشاء وإضافة وتعديل ‪ HTML‬أثناء التنفيذ ‪102......................................................‬‬

‫‪ .2‬فهم آلية عمل الدالة )(‪105......................................................................... index‬‬

‫‪ .3‬فهم طريقة عمل الدالة )(‪108....................................................................... text‬‬

‫‪ .4‬تبديل أو إزالة المحارف باستخدام التعابير النمطية ‪109............................................‬‬

‫‪ .5‬شرح كيفية عمل الدالة )(‪110................................................................ contents‬‬

‫‪ .6‬استخدم )(‪ remove‬لن يُ زيل العناصر من مجموعة التغليف ‪115....................................‬‬


‫الفصل الخامس‪ :‬نماذج ‪117................................HTML‬‬
‫‪ .1‬تفعيل وتعطيل عناصر النموذج ‪118.....................................................................‬‬

‫معط ًل‪120....................................‬‬
‫ّ‬ ‫‪ .2‬كيفية تحديد إذا كان أحد عناصر النموذج ُمفعّ ًل أم‬

‫‪ .3‬اختيار أو عدم اختيار مربع اختيار أو مربع انتقاء ‪121...............................................‬‬

‫‪ .4‬اختيار وإلغاء اختيار ِ‬


‫عدة مربعات اختيار وانتقاء ‪123..............................................‬‬

‫‪ .5‬معرفة فيما إذا كان مربع اختيار أو مربع انتقاء مختارًا أم ل ‪124..................................‬‬

‫مخفيا ‪126...........................................................‬‬
‫ً‬ ‫ٌ‬
‫حقل في النموذج‬ ‫‪ .6‬معرفة إذا كان‬

‫‪ .7‬ضبط أو الحصول على قيمة الخاصية ‪ value‬لحقل إدخال ‪127....................................‬‬

‫‪ .8‬ضبط والحصول على القيمة المُ ح ّددة لعنصر اختيار من متعدد ‪129...............................‬‬

‫‪ .9‬ضبط والحصول على النص الموجود ضمن عنصر ‪130...................................textarea‬‬

‫‪ .10‬ضبط والحصول على قيمة الخاصية ‪ value‬للعنصر ‪131.................................button‬‬

‫‪ .11‬تعديل مكونات العنصر ‪132.................................................................... select‬‬

‫‪ .12‬تحديد حقول النموذج عبر نوعها ‪135.................................................................‬‬

‫‪ .13‬تحديد جميع عناصر النماذج ‪136......................................................................‬‬

‫الفصل السادس‪ :‬الحداث في ‪138......................jQuery‬‬


‫مقيدين بحدث )(‪ ready‬واحد فقط ‪139..........................................................‬‬
‫‪ .1‬لسنا ّ‬

‫‪ .2‬إضافة أو إزالة الحداث باستخدام )(‪ on‬و )(‪139................................................. of‬‬

‫برمجيا عبر دوال الحداث المختصرة ‪143..........................‬‬


‫ً‬ ‫‪ .3‬استدعاء معالجات الحداث‬

‫وح َدت ‪ jQuery‬طريقة التعامل مع الكائن ‪144................................................. event‬‬


‫‪ّ .4‬‬

‫‪ .5‬فهم مجالت أسماء الحداث في ‪146......................................................... jQuery‬‬

‫‪ .6‬ما هو تفويض الحداث ‪150..............................................................................‬‬


‫‪ .7‬تطبيق دوال معالجة الحداث على عناصر ‪ DOM‬بغض النظر عن تحديث شجرة ‪152 . .DOM‬‬

‫‪ .8‬إضافة دالة لمعالجة أكثر من حدث ‪154.................................................................‬‬

‫‪ .9‬تعطيل السلوك الفتراضي للمتصفح باستخدام )(‪155..........................preventDefault‬‬

‫‪ .10‬إيقاف نشر الحداث عبر )(‪156.................................................. stopPropagation‬‬

‫‪ .11‬إلغاء سلوك المتصفح الفتراضي ونشر الحداث عبر ‪158........................return false‬‬

‫‪ .12‬إنشاء أحداث خاصة وإطلقها باستخدام )(‪159........................................... trigger‬‬

‫‪ .13‬نسخ الحداث مع عناصر ‪161................................................................... DOM‬‬

‫‪ .14‬استخدام ‪ console‬لظهار الحداث المرتبطة بعناصر ‪162.................................DOM‬‬

‫‪ .15‬الحصول على إحداثيات ‪ X‬و ‪ Y‬لمؤشر الفأرة في إطار العرض ‪163...............................‬‬

‫عنصر آخر ‪164..................................‬‬ ‫ً‬


‫نسبة إلى‬ ‫‪ .16‬الحصول على إحداثيات ‪ X‬و ‪ Y‬للفأرة‬
‫ٍ‬

‫الفصل السابع‪ jQuery :‬ومتصفح الويب‪167.....................‬‬


‫‪ .1‬تعطيل القائمة المنسدلة الظاهرة بالضغط على الزر اليمن للفأرة ‪168.............................‬‬

‫‪ .2‬تمرير نافذة المتصفح ‪169.................................................................................‬‬

‫الفصل الثامن‪ :‬الضافات في ‪171.......................jQuery‬‬


‫‪ .1‬استخدام ‪ $‬عند إنشاء إضافة ‪172.......................................................................‬‬

‫جزءا من دوال ‪173...........jQuery‬‬


‫ً‬ ‫لح َقة بالكائن ‪ jQuery.fn‬ستصبح‬
‫‪ .2‬الضافات الجديدة المُ َ‬

‫‪ُ .3‬‬
‫ستشير ‪ this‬داخل إضافة إلى كائن ‪ jQuery‬الحالي ‪175.............................................‬‬

‫‪ُ .4‬تس ببتخ َدم )(‪ each‬للم ببرور على كببائن ‪ jQuery‬وتوف ببير مرجعي ببة إلى كببل عنص ببر في ذاك الكببائن‬

‫باستخدام ‪176............................................................................................. this‬‬

‫‪ُ .5‬تعيد الضافات عمومً ا كائن ‪ jQuery‬لكي نتمكن من متابعة السلسببلة باسببتخدام دوال ‪jQuery‬‬
‫الخرى ‪178......................................................................................................‬‬
‫‪ .6‬خيارات الضافة الفتراضية ‪180........................................................................‬‬

‫‪ .7‬خيارات مخصصة للضافة ‪182..........................................................................‬‬

‫‪ .8‬تجاوز القيم الفتراضية دون تغيير شيفرة الضافة ‪184............................................‬‬

‫برمجيا ‪186......................................‬‬
‫ً‬ ‫‪ .9‬إنشاء العناصر أثناء التنفيذ واستدعاء الضافات‬

‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪189..............jQuery‬‬


‫‪ .1‬استخدم آخر إصدار من ‪190.................................................................... jQuery‬‬

‫حسن من الداء ‪190............................................‬‬


‫سي ّ‬
‫‪ .2‬تمرير »سياق« إلى دالة ‪ُ jQuery‬‬

‫‪ .3‬فهم كيفية تحسين أداء المُ ِ‬


‫حددات ‪193................................................................‬‬

‫‪ .4‬تخزين مجموعة العناصر المُ ح ّددة التي ُتستخ َدم أكثر من مرة مؤق ًتا‪194.......................‬‬

‫أبق التغييرات المُ ح َدثة على ‪ DOM‬أقل ما يمكن ‪196.................................................‬‬


‫‪ِ .5‬‬

‫‪ .6‬تحسين الداء عبر تمرير كائن يحتوي على مفاتيح وقيم إلى دوال ‪197...............jQuery‬‬

‫عدة ُم ِ‬
‫حددات إلى دالة ‪198.......................................... jQuery‬‬ ‫‪ .7‬تحسين الداء بتمرير ِ‬

‫‪ .8‬تحسين الداء باستخدام الدوال كسلسلة ‪198.........................................................‬‬

‫‪ .9‬استخدم حلقة التكرار ‪ for‬عند التعامل مع حلقات التكرار الكبيرة ‪199............................‬‬

‫ً‬
‫مباشرة‪200..............‬‬ ‫‪ .10‬تغيير المظهر باستخدام ‪ ID‬و ‪ً Class‬‬
‫بدل من تعديل خاصيات ‪style‬‬

‫الفصل العاشر‪ :‬المؤثرات في ‪203.......................jQuery‬‬


‫‪ .1‬تعطيل جميع دوال المؤثرات في ‪204......................................................... jQuery‬‬

‫‪ .2‬فهم آلية عمل دالة الحركات )(‪206................................................................ stop‬‬

‫‪ .3‬معرفة إن كان العنصر يخضع إلى حركة عبر ‪208....................................... :animated‬‬

‫‪ .4‬استخدام الدوال )(‪ show‬و )(‪ hide‬و )(‪ toggle‬دون حركة ‪209.....................................‬‬

‫‪ .5‬فهم الحركات المتزامنة وغير المتزامنة ‪211...........................................................‬‬


‫‪ .6‬الدالة )(‪ animate‬هي الدالة الساسية ‪214.............................................................‬‬

‫‪ .7‬فهم آلية عمل دوال الختفاء في ‪215......................................................... jQuery‬‬

‫الفصل الحادي عشر‪ :‬تقنية ‪217.............................Ajax‬‬


‫‪ .1‬الدالة )(‪ ajax‬هي الدالة الساسية ‪218...................................................................‬‬

‫‪ .2‬تدعم ‪ jQuery‬تقنية ‪ JSONP‬العابرة للنطاقات ‪220....................................................‬‬

‫‪ .3‬منع المتصفح من تخزين طلبيات ‪ XHR‬مؤق ًتا ‪222....................................................‬‬

‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‪224.......................‬‬


‫‪ .1‬تخزين البيانات في عناصر ‪225................................................................... DOM‬‬

‫‪ .2‬إضافة دوال جديدة إلى مجال أسماء ‪227................................................... jQuery‬‬

‫‪ .3‬حساب قيمة خاصية من خاصيات أحد العناصر ‪229.................................................‬‬

‫‪ .4‬استخدام خاصيات ‪ CSS‬أو مكافآتها في ‪230........................................... JavaScript‬‬

‫‪ .5‬الوصول إلى محتوى ‪235........................................................................ iframe‬‬

‫‪ .6‬التحميل المسبق للصور ‪235...............................................................................‬‬

‫‪ .7‬التحميل المسبق للوسائط عبر ‪237................................................................ XHR‬‬

‫عط َلت‬
‫‪ .8‬إض ببافة فئ ببة ‪ CSS‬إلى عناص ببر ‪ HTML‬لكي تظه ببر تل ببك العناص ببر في المتص ببفحات ال ببتي ّ‬

‫‪239................................................................................................. JavaScript‬‬
‫تمهيد‬

‫ت‬
‫تعلم ‪jQuery‬‬ ‫تمهيد‬

‫برحا بسب ً‬
‫بيطا مختصببرًا لكي تصبببح‬ ‫ُ‬
‫كتبت هذا الكتاب لشرح المفاهيم الساسية لمكتبببة ‪ jQuery‬شب ً‬

‫ُ‬
‫والغبببرض منبببه هبببو تعريفبببك على الممارسبببات الشبببائعة بين‬ ‫ُمبرمِ ًج ا ذا مسبببتوى متوسبببط أو متقبببدم‪،‬‬

‫بل فيب ببه على المعلومب ببات اللزمب ببة لكي تصب بببح مطب ب ِبور‬ ‫ُ‬
‫صب ببفوف مطب ببوري ‪jQuery‬؛ ويحتب ببوي كب ببل فصب ب ٍ‬

‫‪ jQuery‬محترف‪.‬‬

‫كتبب ب ا تعريفي ب ً‬
‫بة بمكتب ببة‬ ‫بوع مَ ن ق ببرؤوا ً‬ ‫ٌ‬
‫بم أول ن ب ٍ‬
‫بواع من الق ببراء‪ .‬يض ب ُ‬
‫ٍ‬ ‫ملئم لثلث ببة أن ب‬ ‫ه ببذا الكت بباب‬

‫‪ jQuery‬ويتطلعون إلى الخطوة التالية‪ .‬والنوع الثاني من القراء هم مطورو ‪ JavaScript‬ممن لديهم‬

‫أن‬ ‫ُ‬
‫أخبرتببك ّ‬ ‫خبببرة وتجربببة مببع إحببدى المكتبببات ويريببدون الن تعلم ‪ jQuery‬بسببرعة‪ .‬ول ُتفاجببأ إذا‬

‫النببوع الثببالث هببو »أنببا«! أنشب ُ‬


‫بأت هببذا الكتبباب ليصبببح مرجعً ب ا شخصب ًبيا لمفبباهيم ‪ ،jQuery‬وأرجببو أن‬

‫يتوافر هذا النوع من الكتب لكل مكتبةٍ من مكتبات ‪.JavaScript‬‬

‫من المهم أن تتعببرّ ف – قبببل أن نبببدأ– على بعض المببور التنظيميببة المسببتعملة في الكتبباب‪ ،‬أرجببو‬

‫معلومات مفيدةٍ ستساعدك في الستفادة من الكتاب‪.‬‬


‫ٍ‬ ‫ّ‬
‫أل تتخطى هذا القسم لنه يحتوي على‬

‫‪ .1‬اصطلحاات ‪jQuery‬‬
‫‪ (jQuery‬أقصبببببببد ببببببببه »الدالبببببببة البانيبببببببة ‪«jQuery‬‬ ‫المصبببببببطلح »دالبببببببة ‪function) « jQuery‬‬

‫)أي )(‪ jQuery‬أو الشكل البديل )(‪ ،($‬وهي ُتستخ َدم لنشاء نسخة من كائن ‪.jQuery‬‬

‫ّ‬
‫المغلف ببة )‪(wrapped‬‬ ‫المص ببطلح »مجموع ببة التغلي ببف« )‪ (wrapper set‬يُ ش ببير إلى عناص ببر ‪DOM‬‬

‫ح ب ِد َدت‬
‫وسيس ب ببتعمَ ل ه ب ببذا المص ب ببطلح تحديب ب ب ًدا للش ب ببارة إلى العناص ب ببر ال ب ببتي ُب ب‬
‫ُ‬ ‫ض ب ببمن دوال ‪.jQuery‬‬

‫باسبببببببتخدام دالبببببببة ‪ .jQuery‬ربمبببببببا تسبببببببمع البعض يبببببببدعو هبببببببذا الصبببببببطلح »بمجموعبببببببة ‪«jQuery‬‬

‫)‪ ،(jQuery collection‬لكنني سأستخدم في هذا الكتاب المصطلح »مجموعة التغليف«‪.‬‬

‫‪14‬‬
‫تعلم ‪jQuery‬‬ ‫تمهيد‬

‫‪ .2‬طريقة تنظيم هذا الكتاب‬


‫تقريبب ا‪ .‬يحتببوي كببل‬
‫ً‬ ‫فصول مرتبببةٍ بببترتيب أقسببام توثيببق ‪ jQuery‬نفسببه‬
‫ٍ‬ ‫قس ٌم إلى‬
‫هذا الكتاب مُ ّ‬

‫تقض وق ًتببا‬
‫ِ‬ ‫مفبباهيم عن ‪ jQuery‬معزولببةٍ عن بعضببها وهي ترتبببط بعنببوان الفصببل‪ .‬إذا لم‬
‫ٍ‬ ‫فصببل على‬
‫ٍ‬
‫ً‬
‫طويل في صفحات التوثيق في موقع ‪ jquery.com‬فأنصحك بفعل ذلك قبل قراءة هذا الكتاب‪.‬‬

‫وشرح أقل‬
‫ٌ‬ ‫شيفرات أكثر‬
‫ٌ‬ ‫‪.3‬‬
‫بودة فيببه جيب ًدا‪ .‬يجب أن تنظببر إلى‬ ‫متعم ًدا أن يتفحص القببارئُ المثلب َ‬
‫بة الموجب َ‬ ‫ِ‬ ‫ُ‬
‫كتبت هببذا الكتبباب‬

‫أن الش ببيفرة تس بباوي أل ببف كلم ببة‪ .‬ل تقل ببق إن زاد‬
‫بق بالش ببيفرة‪ .‬أرى شخص ب ًبيا ّ‬
‫بانوي ملح ب ٍ‬‫بأمر ث ب‬
‫الش ببرح ك ب ٍ‬
‫ٍ‬
‫ِ‬
‫وتكببرر هببذه‬ ‫ً‬
‫مببرة أخببرى‪،‬‬ ‫ِ‬
‫تفحص الشببيفرة وقببراءة التعليقببات‬ ‫الشببرح حيرتببك في البدايببة؛ إذ عليببك‬

‫ً‬
‫واضحا‪ .‬أرجو أن تصببل إلى مرحلببةٍ من الخبببرة كيل‬ ‫العملية حتى يصبح المفهوم الذي أحاول شرحه‬

‫ً‬
‫توثيقا جي ًدا لكي تستوعب أحد المفاهيم البرمجية‪.‬‬ ‫تحتاج إل إلى شيفرةٍ موثقةٍ‬

‫‪ .4‬لماذا أستخدم )(‪ alert‬في المثلة؟!‬


‫ِ‬
‫صدق أو ل تصببدق‪ :‬هببذه الدالببة عمليببة‬ ‫أرجو أن تقتنع أنني أكره الدالة )(‪ alert‬أكثر منك‪ ،‬لكن‬

‫بحيح ّ‬
‫أنه ليس من الضببروري اسببتخدامها‪ ،‬إل‬ ‫ٌ‬ ‫بكل ممتبباز في جميببع المتصببفحات؛ صب‬
‫وتعمببل عملهببا بشب ٍ‬

‫أنبببني لم أشبببأ إضبببافة بعض التعقيبببدات الناجمبببة عن اسبببتخدام ‪ console‬لكي أحافبببظ على وضبببوح‬

‫الشبببيفرات‪ .‬فهبببدفي هبببو تقليبببل أيّببب ة شبببيفرات إضبببافية ل تخبببدم غبببرض شبببرح المفهبببوم البببذي أريد‬

‫إيصاله إليك‪.‬‬

‫‪15‬‬
‫تعلم ‪jQuery‬‬ ‫تمهيد‬

‫‪ .5‬التنسيق واللوان‬
‫سأسبببببتخدمُ الخ ب ببط الع ب ببريض في شبببببيفرات ‪) JavaScript‬كم ب ببا في المثبببببال التي( للش ب ببارة إلى‬

‫ً‬
‫مباشرة بببالمفهوم الببذي أشببرحه‪ ،‬وسأسببتعمل اللببون الفضببي‬ ‫الشيفرات والسطر البرمجية التي تتعلق‬

‫الفاتح للشارة إلى التعليقات‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪ --‬تعليق ‪<!-- HTML‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫تعليق ‪// JavaScript‬‬
‫;‪var focusOnThisCode = true‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫بالضبببافة إلى تنسبببيق الشبببيفرات‪ ،‬سأضبببيف في متن النص بعض شبببيفرات ‪ ،JavaScript‬وتلبببك‬

‫تميز بينها وبين النص العادي‪ ،‬مثال‪:‬‬


‫فضي غامق لكي ّ‬ ‫بلون‬
‫ٍ‬ ‫عرض ثابت‬
‫ٍ‬ ‫بخط ذي‬
‫ٍ‬ ‫نسق‬ ‫الشيفرات ُ‬
‫ست ّ‬
‫ٍ‬

‫َ‬
‫حدوث الحدث ‪ .window.onload‬وهذا هو الغرض من اسببتخدام حببدث خبباص‬ ‫ً‬
‫عادة‬ ‫»ل ننتظر‬

‫مثل )(‪ ready‬والذي سيؤدي إلى تنفيذ الشيفرات قبل انتهاء تحميل الصفحة ]‪«[...‬‬

‫‪16‬‬
‫تعلم ‪jQuery‬‬ ‫تمهيد‬

‫تاما قبل قراءة هذا‬


‫فهما ً‬
‫ً‬ ‫‪ .6‬افهم الدالة )(‪ text‬في ‪jQuery‬‬

‫الكتاب‬
‫سنستخدم الدالة )(‪ text‬التابعة لمكتبة ‪ jQuery‬كثيرًا في المثلببة في هببذا الكتبباب‪ .‬وعليببك أن‬

‫أن الدالببة )(‪– text‬عنببدما ُتسببتخ َدم على مجموعببةِ تغليب ٍبف )‪ (wrapper set‬تحتببوي على‬
‫تنتبببه إلى ّ‬

‫عنصر– ستؤدي إلى دمج عناصر مجموعببة التغليببف وإعببادة سلسببلة نصببية لجميببع النصببوص‬
‫ٍ‬ ‫أكثر من‬

‫النص‬
‫َ‬ ‫كنت تتوقببع أن ُتعي ب َد الدالب ُ‬
‫بة‬ ‫َ‬ ‫ربمببا يشوشببك هببذا إذا‬ ‫الموجببودة في كببل العناصببر المشب ِ‬
‫بكلة لهببا‪.‬‬

‫عنصر من مجموعببة التغليببف‪ .‬هببذا مثب ٌ‬


‫بال عن كيفيببة دمج الدالببة )(‪ text‬للسلسببل‬ ‫ٍ‬ ‫الموجو َد في أوّ ل‬

‫النصية الموجودة في عناصر مجموعة التغليف )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<span>I </span><span>love</span‬‬
‫>‪<span>jQuery</span><span>!</span‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫"!‪: "I love jQuery‬الناتج ‪//‬‬
‫;))(‪alert(jQuery('span').text‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪17‬‬
‫تعلم ‪jQuery‬‬ ‫تمهيد‬

‫‪ .7‬ما هو ‪ JS Bin‬ولماذا أستخدمه؟‬


‫صببببببب ِممَ خصي ً‬
‫صبببببببا لتسبببببببهيل تجرببببببببة الشبببببببيفرات على مطبببببببوري‬ ‫‪ JS‬هبببببببو تطببببببببيق ويب ُ‬ ‫‪Bin‬‬

‫‪ JavaScript‬و ‪.CSS‬‬

‫ولمّبب ا كببان هببذا الكتبباب معتمبب ًدا اعتمببا ًدا أساس ب ًبيا على المثلببة لشببرح مفبباهيم ‪ ،jQuery‬فارت ب ُ‬
‫بأيت‬

‫ضببرورة توفببير أمثلببة هببذا الكتبباب للتجربببة المباشببرة على متصببفحات الببويب؛ ويمكنببك الوصببول إلى‬

‫التجربة الحية للمثلة بالضغط على الرابط الموجود قبلها »)مثال حي(«‪.‬‬

‫إتاحببة المثلببة لبك مباشب ً‬


‫برة تسبباعدك في تعببديل والتجربببة على الشببيفرات من أي متصبفح ويب‪،‬‬

‫ُ‬
‫اعتمدت على ذلك أثناء عملي على هذا الكتاب‪.‬‬ ‫أنا ل أشجعك على تعديل الشيفرات فحسب‪ ،‬وإنما‬

‫‪18‬‬
‫الفصل الول‪:‬‬

‫المفاهيم الساسية في ‪jQuery‬‬

‫‪1‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪ .1‬المفاهيم الساسية وراء ‪jQuery‬‬


‫أن هنالببك بعض الختلفببات في الواجهببة البرمجيببة )‪ (API‬لمكتبببة ‪ً ) jQuery‬‬
‫مثل بعض‬ ‫صببحيح ّ‬
‫ٌ‬

‫شيء ما‪ ،‬وافعل شي ًئا مببا‬


‫ٍ‬ ‫الدوال كالدالة ‪ ،($.ajax‬لكن المفهوم الرئيسي في ‪ jQuery‬هو »اعثر على‬

‫بق عنصب ببرًا أو عناصب ببرَ من شب ببجرة ‪ DOM‬من مسب ببتند ‪ HTML‬وافعب ببل بهب ببا شب ببي ًئا مب ببا‬
‫بب ببه«‪ .‬تحدي ب ب ًدا‪ :‬انتب ب ِ‬

‫باستخدام الدوال التي توفرها ‪.jQuery‬‬

‫مليا إلى الشيفرة التية لتبسيط هذا المفهوم )مثال حي(‪:‬‬


‫انظر ً‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫ُغي‬
‫ّر ‪ jQuery‬هذا العنصر ‪<!--‬‬ ‫>‪ --‬ست‬
‫>‪<a href=""></a‬‬
‫إلى هذا العنصر ‪<!--‬‬
‫>‪<a href="http://www.jquery.com">jQuery</a‬‬
‫>‪--‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫‪jQuery('a').text('jQuery').attr('href',‬‬
‫;)'‪'http://www.jquery.com‬‬
‫>‪</script‬‬

‫‪20‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫لحببظ أننببا اسببتخدمنا ‪ jQuery‬في مسببتند ‪ HTML‬لتحديببد العنصببر >‪ <a‬في شببجرة ‪ .DOM‬وبعببد‬

‫شببيء مببا سنس ببتطيع العمببل على العناصببر المُ حبب ّددة باس ببتخدام دوال ‪ jQuery‬مثببل )(‪text‬‬
‫ٍ‬ ‫تحديببد‬

‫بيء مببا‪ ،‬وافعببل شببي ًئا مببا بببه« أساسب ٌ‬


‫بي في تقببدمك‬ ‫و )(‪ .attr‬الستيعاب التام لمفهوم »اعببثر على شب ٍ‬

‫كمبرمج ‪. jQuery‬‬

‫‪ .2‬المفهوم وراء المفهوم الذي يقف وراء ‪jQuery‬‬


‫شيء به هو المفهوم الساسي في ‪ ،jQuery‬إل أنني أريببد‬
‫ٍ‬ ‫شيء ما وفعل‬
‫ٍ‬ ‫أن العثور على‬
‫صحيح ّ‬
‫ٌ‬

‫ً‬
‫أيض با‪ .‬وبالتببالي يمكن توسببعة المفهببوم وراء‬ ‫بيء مببا«‬
‫توسببعة هببذا المفهببوم لضببيف عليببه »إنشبباء شب ٍ‬

‫شيء ما به‪ .‬أسمي هببذا »المفهببوم وراء‬


‫ٍ‬ ‫شيء جديد ثم تحديده ثم فعل‬
‫ٍ‬ ‫‪ jQuery‬لكي يتضمّ ن إنشاء‬

‫المفهوم الذي يقف وراء ‪.«jQuery‬‬

‫بت مقيب ًدا بتحديببد شب ٍ‬


‫بيء مببا موجببودٍ في شببجرة ‪ ،DOM‬فمن‬ ‫ما أحبباول فعلببه هببو توضببيح ّ‬
‫أنك لسب َ‬

‫شبببببيء مبببببا بها‬


‫ٍ‬ ‫أن ‪ jQuery‬يمكن أن ُتسبببببتعمَ ل لنشببببباء عناصبببببر ‪ DOM‬جديبببببدة وفعبببببل‬
‫المهم أن تفهم ّ‬

‫بعد ذلك‪.‬‬

‫ننش بئ في المثببال التي عنصببرًا جدي ب ًدا هببو >‪ <a‬والببذي لم يكن موجببو ًدا في ‪ .DOM‬وسب ُبيح ّدد‬
‫ُس ِ‬

‫ُ‬
‫وستجرى عليه عملية )مثال حي(‪:‬‬ ‫بعد إنشائه‬

‫‪21‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫‪jQuery('<a>jQuery</a>').attr('href',‬‬
‫;)'‪'http://www.jquery.com').appendTo('body‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫الفكرة الساسية التي عليك فهمهببا هنببا هي أننببا أنشببأنا العنصببر >‪ <a‬أثنبباء التنفيببذ وتعاملنببا معببه‬

‫ً‬
‫مسبقا في شجرة ‪.DOM‬‬ ‫كما لو ّ‬
‫أنه موجو ٌد‬

‫‪ .3‬كيفية التحقق من إصدار ‪jQuery‬‬


‫هنال ببك ح ببالت ق ببد ل تتمكن فيه ببا من اس ببتخدام آخ ببر إص ببدار من ‪jQuery‬؛ ومن المفي ببد في تل ببك‬

‫أن ذلببك موثب ٌ‬


‫بق في الملببف‬ ‫الحالت معرفة ما هببو إصببدار ‪ jQuery‬الببذي تتعامببل معببه‪ .‬من حسببن الحببظ ّ‬

‫نفسببه وفي رابببط ‪ URL‬الببذي تسببتخدمه لتضببمين مصببدر ‪ ،jQuery‬لكن إن لم تسببتطع معرفببة الصببدار‬

‫حلين‬
‫ّ‬ ‫مما سبق فيمكنببك اسببتخراج تلببك المعلومببات من مكتبببة ‪ jQuery‬نفسببها‪ .‬سببأعرض عليببك أدنبباه‬

‫للتحقق من الصدار الذي تستعمله )مثال حي(‪:‬‬

‫‪22‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫;)‪alert(jQuery.fn.jquery‬‬
‫;)‪alert(jQuery().jquery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .4‬تتطلب ‪ jQuery‬أن يكون مستند ‪ HTML‬بنمط المعايير أو نمط‬

‫المعايير التقريبي‬
‫بفح‬ ‫بحيحا عنببدما يُ ِ‬
‫حمل المتصب ُ‬ ‫ً‬ ‫ً‬
‫عمل صب‬ ‫هنالك مشاكل معروفة مبع دوال ‪ jQuery‬في ّ‬
‫أنهببا ل تعمببل‬

‫بفح يُ ِ‬
‫فسب بر‬ ‫ّ ّ‬ ‫َ‬
‫ص ببفحة ‪ HTML‬بنم ببط التج بباوزات )‪ .(quirks mode‬تأكد أنك تس ببتخدم ‪ jQuery‬في متص ب ٍ‬

‫‪ HTML‬بنمببط المعببايير )‪ (standards mode‬أو نمببط المعببايير التقريبببي )‪(almost standards mode‬‬

‫باستخدام نوع ‪ doctype‬الصحيح‪.‬‬

‫أداء سليمً ا‪ ،‬فسنسببتعمل نببوع المسببتند ‪ doctype‬الخبباص‬


‫ً‬ ‫للتأكد من أداء دوال ‪ jQuery‬لوظيفتها‬

‫بإصدار ‪:HTML5‬‬

‫‪23‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬

‫ضمن جميع ملفات ‪ CSS‬قبل تضمين ‪jQuery‬‬


‫ِ‬ ‫‪.5‬‬
‫ستحمّ ل قبل أن ُتطلِق الحببدث‬ ‫بدءا من ‪ ،jQuery 1.3‬لن َتضمَ ن لك المكتبة ّ‬
‫أن جميع ملفات ‪ُ CSS‬‬ ‫ً‬

‫الخاص )(‪ .ready‬وبسبب هذا التغيير في ‪ jQuery 1.3‬فعليك دومًب ا إضببافة جميببع ملفببات ‪ CSS‬قبببل‬

‫سيضببببمَ ن تفسببببير المتصببببفح لشببببيفرات ‪ CSS‬قبببببل النتقببببال إلى شببببيفرات‬


‫شببببيفرات ‪ .jQuery‬وهببببذا َ‬

‫ً‬
‫لحقب ا في مسببتند ‪ .HTML‬لكن ربمببا تكببون الصببور المُ شببار إليهببا عبببر ‪ CSS‬قببد‬ ‫‪ JavaScript‬الموجببودة‬

‫نزل بعد عندما يُ ِ‬


‫فسر المتصفح شيفرة ‪.JavaScript‬‬ ‫ُن ِز َ‬
‫لت أو لم ُت ّ‬

‫‪ .6‬استخدام نسخة ُمستضافة من ‪jQuery‬‬


‫يَ عمَ د أغلبية الشخاص عند تضمين ‪ jQuery‬في صفحات الويب إلى تنزيببل الشببيفرة المصببدرية‬

‫وربطها إلى مستند ‪ HTML‬عبببر وضببع الملببف المصببدري للمكتبببة في مببوقعهم )أو نطبباقهم( الشخصببي‪.‬‬

‫مصدر آخر‪.‬‬
‫ٍ‬ ‫لكن هنالك خيارات أخرى التي تسمح لك باستخدام ‪ jQuery‬من‬

‫تستضيف ‪ِ Google‬‬
‫عدة نسخ من الشببيفرة المصببدرية لمكتبببة ‪ jQuery‬بغببرض إتاحتهببا لمن يشبباء‬

‫اسببتخدامها‪ ،‬وهببذا رائببع! سأسببتخدمُ في المثببال التي العنصببر >‪ <script‬لتضببمين نسببخة مُ صب ّبغرة‬

‫)‪ (minified‬من ‪ jQuery‬والمستضافة في ‪) Google‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬

‫‪24‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫‪alert('It is ' + ('jQuery' in window) + ' jQuery is‬‬
‫;)'‪loaded‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫تستضيف ‪ِ Google‬‬
‫عدة إصدارات من الشيفرة المصدرية لمكتبة ‪ ،jQuery‬وهنالك نسببختان لكببل‬

‫إص ببدار‪ :‬واح ببدة مُ ص ب ّبغرة وأخ ببرى غ ببير مص ب ّبغرة‪ .‬أنص ببحك باس ببتخدام النس ببخة غ ببير المص ب ّبغرة أثن بباء‬

‫ّ‬
‫مصغرةٍ من الشيفرة‪.‬‬ ‫َ‬
‫كنت تتعامل مع نسخةٍ‬ ‫التطوير‪ ،‬لن تنقيح الخطاء فيها أسهل فيما إذا‬

‫ميزات استخدام النسخة المُ ستضببافة من ‪ Google‬هي السببرعة والوثوقيببة والحتمببال الكبببير أن‬

‫ً‬
‫مسبقا على جهاز العميل‪.‬‬ ‫خز ً‬
‫نة‬ ‫تكون المكتبة ُم ّ‬

‫‪ .7‬تنفيذ الشيفرة عندما تجهز شجرة ‪ DOM‬لكن قبل الحدث‬

‫‪window.onload‬‬
‫الح َدث )‪ (event‬المضمّ ن في ‪ JavaScript‬المسببمى ‪ window.onload‬لتنفيببذ‬
‫يمكن أن يُ ستخ َدم َ‬

‫بيء قببد‬ ‫أن ّ‬


‫كل شب ٍ‬ ‫لكن هذا الحدث يعني ّ‬
‫ّ‬ ‫شيفرات برمجية أثناء اكتمال تحميل صفحة في المتصفح‪.‬‬

‫تم تحميل ب ببه في الص ب ببفحة‪ ،‬ولن يُ َ‬


‫طل ب ببق ه ب ببذا الح ب ببدث إلى أن ت ب ب ّ‬
‫بنزل جمي ب ببع الوس ب ببائط )مث ب ببل الص ب ببور‬

‫وملفبببببات الفيبببببديو ‪...‬إلخ‪ (.‬وسبببببيعني انتظبببببار حبببببدوث هبببببذا الحبببببدث تضبببببييعَ الكثبببببير من البببببوقت‪.‬‬

‫‪25‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫فالح ب ببل الفضببببل ه ب ببو ب ب ببدء تنفي ب ببذ الش ب ببيفرات عن ب ببدما تنتهي عملي ب ببة تهيئ ب ببة ش ب ببجرة ‪ DOM‬مباش ب ب ً‬
‫برة‬

‫وتتاح إمكانية تعديلها‪.‬‬

‫ً‬
‫صالحة لجراء العمليات عليها لكن‬ ‫سي ّ‬
‫نفذ بعد أن تصبح شجرة ‪DOM‬‬ ‫ً‬ ‫ِ‬
‫خاصا ُ‬
‫ً‬ ‫حدثا‬ ‫توفر ‪jQuery‬‬

‫قببببببل إطلق الحبببببدث ‪ .window.onload‬يُ سبببببمى هبببببذا الحبببببدث الخببببباص بمكتببببببة ‪ jQuery‬بالسبببببم‬

‫ٌ‬
‫مرجعية إلى دالةِ ‪.jQuery‬‬ ‫ٌ‬
‫وسيط وحي ٌد يمُ ِرر إلى هذه الدالة أل وهو‬ ‫)(‪ .ready‬وهنالك‬

‫سأعطيك في الشيفرة التية ثلثة أمثلة عن استخدام هذا الحدث الخاص )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<head‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬

‫الشكل القياسي ‪//‬‬


‫)(‪jQuery(document).ready(function‬‬
‫{‬
‫;)'!‪alert('DOM is ready‬‬
‫;)}‬

‫الشكل المختصر‪ ،‬لكنه يؤدي نفس الغرض ‪//‬‬


‫)(‪jQuery(function‬‬

‫‪26‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫{‬
‫;)'!‪alert('No really, the DOM is ready‬‬
‫;)}‬

‫الشكل المختصر مع الستخدام المن للرمز ‪// $‬‬

‫َه مرجعية إلى ‪//‬‬


‫ّ‬
‫ِ في بالك أن‬‫أبق‬
‫ِرة إلى الدالة المجهولة ‪//‬‬
‫ُمر‬
‫ّ‬ ‫دالة ‪ jQuery‬الم‬
‫)‪jQuery(function($‬‬
‫{‬
‫;)'!‪alert('Seriously its ready‬‬
‫*‪/‬‬
‫استخدم )(‪ $‬دون أن تخاف من التضاربات مع مكتباٍ‬
‫ت أخرى‬
‫‪*/‬‬
‫;)}‬
‫>‪</script‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪27‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫أي عددٍ تشاء من الحداث )(‪ ready‬إلى‬ ‫‪ -‬أبق ببالك ّ‬


‫أنك تستطيع إضافة ُ‬ ‫ِ‬
‫وست ّ‬
‫نفذ بترتيب إضافتها نفسه‪.‬‬ ‫ُ‬ ‫لست مقي ًدا بوضع حدث واحد فقط‪،‬‬
‫َ‬ ‫المستند‪.‬‬
‫ملحاظات‬
‫‪ -‬احرص على تضمين جميع صفحات النماط )‪ (CSS‬قبل شيفرة ‪ ،jQuery‬وبهذا‬

‫س َتضمَ ن صحة عرض جميع العناصر في ‪ DOM‬قبل بدء تنفيذ شيفرات ‪.jQuery‬‬

‫‪ .8‬تنفيذ شيفرات ‪ jQuery‬عندما ينتهي المتصفح من تحميل كامل‬

‫المستند‬
‫َ‬
‫بدوث الحببدث ‪ .window.onload‬وهببذا هببو الغببرض من اسببتخدام حببدث خبباص‬ ‫ً‬
‫عادة حب‬ ‫ل ننتظر‬

‫مثل )(‪ ready‬والذي سببيؤدي إلى تنفيببذ الشببيفرات قبببل انتهبباء تحميببل الصببفحة‪ ،‬لكن بعببد أن تجهببز‬

‫شجرة ‪ DOM‬لجراء التعديلت عليها‪.‬‬

‫أن الحب ببدث الخب بباص )(‪ ready‬رائب ببعٌ‬


‫بحيح ّ‬
‫ٌ‬ ‫لكن سب ببنحتاج إلى النتظب ببار في بعض الحيب ببان‪ .‬وصب ب‬

‫ويفيببدنا بتنفيببذ الشببيفرات بمجببرد أن تجهببز شببجرة ‪ ،DOM‬لكننببا نسببتطيع اسببتخدام ‪ jQuery‬لتنفيببذ‬

‫شيفرة بعد أن ُتحمّ ل كامل الصفحة )بما في ذلك جميع الوسائط المُ ضمنة فيها( تمامً ا‪.‬‬

‫ِ‬
‫تببوفر ‪ jQuery‬الدالببة )(‪ on‬الببتي‬ ‫يمكن فعببل ذلببك عبببر الحببدث ‪ load‬الخبباص بالكببائن ‪.window‬‬

‫معين‪ .‬سأريك ً‬
‫مثل عن استخدام الدالة )(‪:on‬‬ ‫ّ‬ ‫ِ‬
‫لستدعاء دالةٍ عند وقوع حدث‬ ‫يُ مكن أن ُتستعمَ ل‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<head‬‬
‫‪<script‬‬

‫‪28‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫تمرير الكائن ‪ window‬إلى الدالة ‪ jQuery‬وربط تنفيذ ‪//‬‬
‫الدالة باكتمال تحميل المستند عند وقوع الحدث ‪// load‬‬
‫)(‪jQuery(window).on('load', function‬‬
‫{‬
‫;)'!‪alert('The page and all its assets are loaded‬‬
‫;)}‬
‫>‪</script‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ -‬يمكن أن يُ ستخ َدم الحدث ‪ load‬على عناصر الصور أو إطارات ‪.iframe‬‬

‫)(‪jQuery('img, iframe').on('load', function‬‬


‫;)};)'‪{alert('loaded‬‬
‫ملحاظات‬
‫تنس وجود الحدث ‪) unload‬أو ‪ ،(beforeunload‬والذي يمكن أن‬
‫‪-‬ل َ‬
‫يُ ستعمَ ل لتنفيذ دوال عندما يُ َ‬
‫طلق عند مغادرة المستخدم للصفحة‪.‬‬

‫يجببدر بالببذكر أننببا ك ّنببا نسببتعمل الببدالتين )(‪ load‬و )(‪ unload‬من قبببل‪ ،‬لكنهمببا أمسببتا مهملببتين‬

‫ص ب َح باسببتخدام الدالببة )(‪on‬‬ ‫بدءا من الصببدار ‪ُ ،3.0‬‬


‫ون ِ‬ ‫بدءا من الصببدار ‪ 1.8‬من ‪ ُ ،jQuery‬ب‬
‫وح ذفتا بب ً‬ ‫بب ً‬

‫ً‬
‫بدل منهما‪ ،‬وسنشرح ذلك باستفاضة في الفصل السادس »الحداث في ‪.«jQuery‬‬

‫‪29‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫فسر شجرة ‪ ،DOM‬لكن دون‬


‫‪ .9‬تنفيذ شيفرة ‪ jQuery‬عندما ُت ّ‬
‫استخدام )(‪ready‬‬
‫ل تحتبباج دومً ب ا إلى اسببتخدام الحببدث الخبباص )(‪ready‬؛ فببإذا كببانت شببيفرة ‪ JavaScript‬الببتي‬

‫أي مكببان في مسببتند ‪ .HTML‬وهببذا يعببني ّ‬


‫أنك‬ ‫كتبتها ل تؤثر على شجرة ‪ DOM‬فيمكنك تضببمينها في ّ‬
‫ٍ‬

‫ً‬
‫معتمبببببدة على جهازية‬ ‫تسبببببتطيع تفبببببادي الحبببببدث )(‪ ready‬تمامًببببب ا إذا لم تكن شبببببيفرة ‪JavaScript‬‬

‫شجرة ‪.DOM‬‬

‫بديلت‬
‫ٍ‬ ‫وخصوص با شببيفرات ‪ –jQuery‬تتضببمن تعب‬
‫ً‬ ‫أغلبيببة شببيفرات ‪ JavaScript‬في هببذه الونببة –‬

‫رة من المتصفح تفسببيرًا كب ً‬


‫بامل لكي نتمكن من‬ ‫مفس ً‬
‫ّ‬ ‫على ‪ .DOM‬وبالتالي يجب أن تكون شجرة ‪DOM‬‬

‫التعامببببببل معهببببببا‪ .‬وهببببببذا هببببببو السبببببببب وراء اسببببببتعمال المطببببببورين للحببببببدث ‪ window.onload‬في‬

‫السنوات الماضية‪.‬‬

‫لتفادي استخدام الحدث )(‪ ready‬مع الشيفرات التي تتعامل مببع ‪ ،DOM‬يمكنببك ببسبباطة وضببع‬

‫الش ببيفرة في مس ببتند ‪ HTML‬قب ببل وس ببم الغلق للعنص ببر >‪ .</body‬وبفعل ببك ل ببذلك ستض ببمن انته بباء‬

‫بعت ش ببيفرة‬ ‫سي ِ‬


‫فسببر المس ببتند من بدايت ببه إلى نهايت ببه؛ ف ببإذا وض ب َ‬ ‫لن المتص ببفح ُ‬
‫تحمي ببل ش ببجرة ‪ّ DOM‬‬

‫إذا للحدث )(‪.ready‬‬ ‫َ‬


‫حاجة ً‬ ‫‪ JavaScript‬بعد تعريف العناصر التي تريد التعامل معها‪ ،‬فل‬

‫ُ‬
‫وضببببعت الشببببيفرة قبببببل نهايببببة جسببببم‬ ‫لن أسببببتعمل في المثببببال التي الحببببدث )(‪ ready‬لنببببني‬

‫المس ببتند‪ .‬وه ببذه هي التقني ببة ال ببتي سأس ببتعملها في ه ببذا الكت بباب وفي أغلبي ببة المواق ببع ال ببتي ُأ ِ‬
‫نشب بئها‬

‫)مثال حي(‪:‬‬

‫‪30‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<p>Hi, I'm the DOM! Script away!</p‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫;))(‪alert(jQuery('p').text‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫فسبببت ّ‬
‫نفذ الشبببيفرة قببببل تحميبببل المتصبببفح‬ ‫ُ‬ ‫ُ‬
‫وضبببعت العنصبببر >‪ <script‬قببببل العنصبببر >‪<p‬‬ ‫إذا‬

‫للعنصببر >‪ ،<p‬وهببذا سببيجعل ‪ jQuery‬تفببترض عببدم احتببواء المسببتند على أيّ ب ة عناصببر >‪<p‬؛ لكن إذا‬

‫َ‬
‫الشبببيفرة حبببتى تجهبببز شبببجرة ‪DOM‬‬ ‫اسبببتعملت الحبببدث الخببباص )(‪ ready‬فعندئبببذٍ لن ُت ِ‬
‫نفذ ‪jQuery‬‬ ‫ُ‬

‫تمامً ب ب ا‪ .‬لكن لمب بباذا نسب ببتعمل الحب ببدث )(‪ ready‬إن أمكننب ببا التحكم في مكب ببان عنصب ببر >‪ <script‬في‬

‫المسب ببتند؟ فوضبببعنا لشبببيفرات ‪ jQuery‬في أسبببفل الصبببفحة سب ببيؤدي إلى تجنب اسب ببتخدمنا للحبببدث‬

‫فإن وضع جميع شببيفرات ‪ JavaScript‬في أسببفل الصببفحة سببيؤدي إلى‬


‫ّ‬ ‫)(‪ready‬؛ وإذا ابتغينا الدقة‬

‫تحسين أدائها‪.‬‬

‫‪ .10‬استخدام ‪ $‬دون القلق من حادوث تضاربات‬


‫تسببتخدم ‪ jQuery‬المحببرف ‪ $‬للوصببول إلى مجبال أسببماء ‪ ،(jQuery namespace) jQuery‬لكننببا‬

‫‪31‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫ً‬
‫أيضبا! لكن ليس عليببك‬ ‫لن بقيببة المكتبببات تسببتخدم المحببرف ‪$‬‬
‫لسنا وحدنا الذين نحب المحرف ‪ّ ،$‬‬

‫التخلي تمامً ا عن استخدامه…‬

‫نفذ مباش ب ً‬
‫برة وتمري ببر الك ببائن‬ ‫يمكن ببك الس ببتمرار في اس ببتخدام ‪ $‬ع بببر اس ببتعمال دال ببة مجهول ببة ُت ّ‬

‫‪ jQuery‬إليهببا‪ .‬وبعدئببذٍ سببتتمكن من اسببتخدام المحببرف ‪ $‬داخببل تلببك الدالببة للشببارة إلى ‪،jQuery‬‬

‫ً‬
‫أيضبببببا ببببببالتعبير المغلبببببق أي ‪.(closure‬‬ ‫ٌ‬
‫مجبببببال فريببببب ٌد ) ‪ ،unique scope‬ويُ عبببببرَ ف‬ ‫سي َ‬
‫نشبببببأ‬ ‫وبالتبببببالي ُ‬

‫خاص يمكنك فيه اسببتخدام ‪ $‬بحريببة دون‬


‫ٍ‬ ‫مجال‬
‫ٍ‬ ‫أترجم ما سبق إلى العربية‪ :‬يمكنك الحصول على‬

‫القلبببق من التضبببارب مبببع مكتببببات ‪ JavaScript‬الخبببرى البببتي قبببد تتواجبببد في نفس مسبببتند ‪.HTML‬‬

‫تطبيق للمفهوم السابق )مثال حي(‪:‬‬


‫ٍ‬ ‫يحتوي المثال التي على‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫استخدام )(‪ $‬دون الخوف من التضارب مع مكتباٍ‬
‫ت أخرى ‪//‬‬
‫;)‪alert('You are using jQuery ' + $().jquery‬‬
‫)‪})(jQuery‬‬
‫>‪</script‬‬

‫‪32‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫ل ُتغفِ ل وجود الدالة )(‪ jQuery.noConflict‬التي تعيد ربط الكائن الصلي‬


‫ً‬
‫مرة أخرى )إذا‬ ‫)التابع لمكتبةٍ أخرى( الذي كان مُ شارًا إليه بالمحرف ‪ $‬إلى ‪$‬‬
‫َ‬
‫كنت تستعمل أكثر من مكتبة تستخدم المحرف ‪ .($‬وهذا يسمح لك باستخدام‬ ‫ملحاظة‬
‫‪ $‬الخاص بالمكتبة الخرى بالضافة إلى إمكانية استخدامك لمكتبة ‪jQuery‬‬
‫والتي ستتمكن من الوصول إليها عبر الكائن )(‪ jQuery‬فقط ً‬
‫بدل من )(‪.$‬‬

‫‪ .11‬فهم كيفية عمل السلسل في ‪jQuery‬‬


‫حببدد شببي ًئا باسببتخدام الدالببة ‪ُ jQuery‬‬
‫وت ِ‬
‫نشببئ مجموعببة تغليببف‪ ،‬فسببتتمكن من إنشبباء‬ ‫بعببد أن ُت ِ‬

‫سلسلةٍ من دوال ‪ jQuery‬للتعامل مع عناصر ‪ DOM‬الموجودة داخل المجموعة‪ .‬مببا تفعلببه ‪ jQuery‬هببو‬

‫جعل الدوال الموجودة في السلسلة ُت عيد مجموعة التغليببف في كبل مببرة ينتهي فيهببا تنفيببذ إحببداها‪،‬‬

‫وتلك المجموعة ُ‬
‫ستستخ َدم من قِ بل الدالة التالية في السلسلة‪ .‬لحظ ّ‬
‫أن أغلبية الببدوال في ‪jQuery‬‬

‫أن هنالببك بعض الببدوال الببتي »ستكسببر« السلسببلة ولن تسببتطيع إكمببال‬
‫يمكن وضببعها في سلسببلة‪ ،‬إل ّ‬

‫السلسلة بعد استخدامها‪.‬‬

‫يجب أن تحاول دومً ا إعادة استخدام مجموعة التغليف باستخدام سلسلة من الببدوال‪ .‬سببأريك‬

‫في المثبببببببببببال التي كيفيبببببببببببة إنشببببببببببباء سلسبببببببببببلة من البببببببببببدوال )(‪ text‬و )(‪ attr‬و )(‪addClass‬‬

‫)مثال حي(‪:‬‬

‫‪33‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<a></a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)'‪$('a‬‬
‫)'‪: $('a‬ستعيد ‪//‬‬
‫)'‪.text('jQuery‬‬
‫)'‪: $('a‬ستعيد ‪//‬‬
‫)'‪.attr('href', 'http://www.jquery.com/‬‬
‫)'‪: $('a‬ستعيد ‪//‬‬
‫;)'‪.addClass('jQuery‬‬
‫)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .12‬كسر السلسلة باستخدام دوال »هادمة«‬


‫ً‬
‫سابقا‪ ،‬ل يمكن لكل دوال ‪ jQuery‬الحفبباظ على السلسببلة‪ .‬فهنالببك دوال مثببل )(‪text‬‬ ‫ُ‬
‫ذكرت‬ ‫كما‬

‫ال ببتي يمكن أن ُتس ببتخ َدم في وس ببط السلس ببلة عن ببدما » َتضب ب ِبط« القيم ببة النص ببية للعنص ببر‪ ،‬لكن الدال ببة‬

‫‪34‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫)(‪ text‬سببببتؤدي إلى »كسببببر« السلسببببلة عنببببدما » َتسببببتخ ِرج« أو »تحصببببل على« القيمببببة النصببببية‬

‫الموجودة داخل عنصر‪.‬‬

‫سأسبببببتخدمُ في المثبببببال التي الدالبببببة )(‪ text‬لضببببببط القيمبببببة النصبببببية للعنصبببببر >‪ <a‬ومن ثم‬

‫للحصول عليها )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<p></p‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)'‪var theText = $('p‬‬
‫)'‪.text('jQuery‬‬

‫ُعيد السلسلة النصية "‪// "jQuery‬‬


‫ست‬
‫;)(‪.text‬‬

‫;)‪alert(theText‬‬
‫ل يمكن إكمال السلسلة بعد )(‪ text‬لن السلسلة قد ‪//‬‬
‫ة نصيٌ‬
‫َت سلسلٌ‬ ‫ُ‬
‫ة‪ ،‬وليس كائن ‪// jQuery‬‬ ‫انقطعت حيث أعيد‬
‫)‪})(jQuery‬‬

‫‪35‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫مثبببال عن كيفيبببة‬
‫ٍ‬ ‫الحصبببول على النص الموجبببود ضبببمن عنصبببر باسبببتخدام )(‪ text‬هبببو أبسبببط‬

‫ً‬
‫نصببية تحتببوي‬ ‫ً‬
‫سلسببلة‬ ‫لن إحببدى الببدوال )الببتي هي )(‪ text‬في مثالنببا( أعببادت‬
‫»كسببر« السلسببلة ّ‬

‫القيمة النصية للعقدة )‪ ،(node‬ولم ُتعِ د مجموعة التغليف الخاصة بكائن ‪.jQuery‬‬

‫ُ‬
‫فستكس ببر السلس ببلة‪،‬‬ ‫أنه إذا لم ُتعِب ب د إح ببدى دوال ‪ jQuery‬مجموع ب َ‬
‫بة التغلي ببف‪،‬‬ ‫يجب ّ‬
‫أل يُ دهش ببك ّ‬

‫ٌ‬
‫هادمة« )‪.(destructive‬‬ ‫ٌ‬
‫دوال »‬ ‫و َنع َت ِبر هذه الدوال ّ‬
‫أنها‬

‫‪ .13‬استخدام الدوال الهادمة في ‪ jQuery‬والعودة منها باستخدام‬

‫)(‪end‬‬
‫عتبب ر الببدوال الموجببودة في ‪ jQuery‬والببتي ُتعب ِ‬
‫بدل مجموعببة التغليببف الصببلية في ‪ّ jQuery‬‬
‫أنهببا‬ ‫ُت َ‬

‫دوال هادم ب ٌ‬
‫بة )‪ .(destructive‬الس بببب وراء ذل ببك ه ببو ع ببدم حفاظه ببا على الحال ببة الص ببلية لمجموع ببة‬ ‫ٌ‬

‫بيء أو يُ حب ب َ‬
‫بذف‪ .‬وإنمب ببا سب ب ُبتربَط مجموعب ببة التغليب ببف السب ببابقة‬ ‫التغليب ببف؛ لكن ل تقلب ببق لن »يُ ه ب ب َدم« شب ب ٌ‬

‫بمجموعةٍ جديدة )‪.(new set‬‬

‫على أيّبببب ة حببببال‪ ،‬ل يتوقببببف تعاملنببببا مببببع السلسببببل عنببببدما ُت ّ‬


‫غيبببب ر مجموعببببة التغليببببف الصببببلية‪.‬‬

‫ُ‬
‫فباس ب ببتخدامنا للدال ب ببة )(‪ end‬س ب ببنتمكن من »الع ب ببودة« من أيّب ب ب ة تع ب ببديلت »هادم ب ببة« أج ب ببريَ ت على‬

‫مليبب ا إلى اسببتخدام الدالببة )(‪ end‬في المثببال التي لتفهم كيفيببة‬
‫مجموعببة التغليببف الصببلية‪ .‬انظببر ً‬

‫التعامل معها )مثال حي(‪:‬‬

‫‪36‬‬
jQuery ‫تعلم‬ jQuery ‫ المفاهيم الساسية في‬:‫الفصل الول‬

<!DOCTYPE html>
<html lang="en">
<body>
<style>
.last {
background: #900
}
</style>
<ul id="list">
<li></li>
<li>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</li>
<li></li>
<li></li>
</ul>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

37
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫مجموعة التغليف الصألية ‪$('#list') //‬‬


‫دالة هادمة ‪.find('> li') //‬‬
‫دالة هادمة ‪.filter(':last') //‬‬
‫)'‪.addClass('last‬‬
‫)'‪ .filter(':last‬نهاية ‪.end() //‬‬
‫دالة هادمة ‪.find('ul') //‬‬
‫)'‪.css('background', '#ccc‬‬
‫دالة هادمة ‪.find('li:last') //‬‬
‫)'‪.addClass('last‬‬
‫)'‪ .find('li:last‬نهاية ‪.end() //‬‬
‫)'‪ .find('ul‬نهاية ‪.end() //‬‬
‫)'‪ .find('> li‬نهاية ‪.end() //‬‬
‫)'‪ $('#list‬العودة إلى ‪.find('li') //‬‬
‫;)';‪.append('I am an &lt;li&gt‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫متعددة الستخدامات‬
‫ُ‬ ‫ُ‬
‫الدالة ‪jQuery‬‬ ‫‪.14‬‬
‫الدال ب ببة ‪ jQuery‬هي دال ب ب ٌ‬
‫بة متعببببددة الس ب ببتخدامات‪ ،‬فيمكنن ب ببا تمري ب ببر مختل ب ببف القيم وتنس ب ببيقات‬

‫معينبببببة‪ .‬هبببببذه بعض‬


‫ّ‬ ‫السلسبببببل النصبببببية إليهبببببا ومن ثم سبببببنتمكن من اسبببببتخدامها لتنفيبببببذ وظبببببائف‬

‫استخدامات الدالة ‪:jQuery‬‬

‫‪38‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫ِ‬
‫بمحددات ‪ ،CSS‬بالضافة إلى‬ ‫تحديد العناصر من شجرة ‪ DOM‬باستخدام تعابير شبيهة‬ ‫•‬

‫إمكانية استخدام تعابير خاصة بمكتبة ‪jQuery‬؛ والقدرة على تحديد العناصر عبر مكانها‬

‫في شجرة ‪ jQuery('p > a') :DOM‬أو )'‪ jQuery(':first‬أو‬


‫)‪jQuery(document.body‬‬

‫إنشاء عناصر ‪ HTML‬أثناء التنفيذ‪ ،‬بتمرير سلسلة نصية تحتوي على شيفرة ‪ HTML‬التي‬ ‫•‬

‫البنى أو العناصر التي تريد إنشاءها‪ ،‬أو عبر دوال ‪ DOM‬التي ُت ِ‬


‫نشئ عناصر‬ ‫تحتوي على ُ‬

‫‪ jQuery('<div id="nav"></div>') :DOM‬أو‬


‫))'‪jQuery(document.createElement('div‬‬

‫اختصار للحدث )(‪ ready‬وذلك عند تمرير دالة إلى الدالة ‪:jQuery‬‬ ‫•‬
‫)} ‪jQuery(function($){ /* code */‬‬
‫موض ٌ‬
‫حة في المثال التي )مثال حي(‪:‬‬ ‫ّ‬ ‫ُ‬
‫كل نقطةٍ من النقاط السابقة‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫تمرير دالة إلى ‪// jQuery‬‬
‫)‪jQuery(function($‬‬
‫{‬

‫‪39‬‬
jQuery ‫تعلم‬ jQuery ‫ المفاهيم الساسية في‬:‫الفصل الول‬

// HTML ‫تمرير سلسلة نصية فيها‬


$('<p></p>').appendTo('body');
// jQuery ‫تمرير مرجعية إلى عنصر إلى الدالة‬
$(document.createElement('a'))
.text('jQuery').appendTo('p');
// jQuery ‫ إلى الدالة‬CSS ‫تمرير تعبير‬
$('a:first').attr('href', 'http://www.jquery.com');
// jQuery ‫ إلى الدالة‬DOM ‫تمرير مرجعية‬
$(document.anchors[0]).attr('jQuery');
});
</script>
</body>
</html>

ً
‫ وإن لم يكن ذل ب ببك ش ب ببائعً ا‬،jQuery ‫أيضب ب با تمري ب ببر مص ب ببفوفةٍ من العناصب ب ب ِر إلى الدال ب ببة‬ ‫من الممكن‬

:(‫)مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<ul>
<li>dog</li>
<li>cat</li>
</ul>
<script type="text/JavaScript"

40
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪src="http://code.jquery.com/jquery-latest.js"></script‬‬
‫>‪<script‬‬
‫ُنهى السلسلة ‪//‬‬
‫الحصول على مصفوفة من كائنات ‪ ،li‬وست‬
‫;)(‪var liElements = jQuery('ul li').get‬‬

‫"‪: "dog‬الناتج ‪//‬‬


‫;))(‪alert(jQuery(liElements).eq(0).text‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .15‬معرفة متى ُتشير الكلمة المحجوزة ‪ this‬إلى كائنات ‪DOM‬‬


‫بمن مجموع ببةِ تغلي ب ٍبف‪ ،‬فيمكن اس ببتخدام‬ ‫عن ببدما ُتر َب ببط الح ب ُ‬
‫بداث إلى عناص ببرَ ‪ DOM‬موج ببودةٍ ض ب َ‬

‫الكلمةِ المحجوزةِ ‪ this‬للشارة إلى كائن ‪ DOM‬الذي استدعى الحدث‪ .‬المثببال التي يحتببوي شببيفرة‬

‫‪ jQuery‬والتي ستَر ِبط الحدث الخاص )والموجود في مكتبة ‪ mouseenter (jQuery‬إلى كل عناصر‬

‫سبببي َ‬
‫طلق‬ ‫ُ‬ ‫ٌ‬
‫حبببدث مُ ضبببمّ ٌن في لغبببة ‪ JavaScript‬باسبببم ‪ mouseover‬والبببذي‬ ‫>‪ <a‬في الصبببفحة‪ .‬هنالبببك‬

‫عنببدما يببدخل مؤشببر الفببأرة أو يخببرج من عنصب ٍبر ابن )‪ ،(child element‬بينمببا ل يفعببل ذلببك الحببدث‬

‫الخاص ‪ mouseenter‬وهذا هو الفرق بينهما )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<a id="link1">jQuery.com</a‬‬

‫‪41‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪<a id="link2">jQuery.com</a‬‬
‫>‪<a id="link3">jQuery.com</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)(‪$('a').mouseenter(function‬‬
‫{‬
‫;)‪alert(this.id‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫استخدمنا الكلمة المحجوزة ‪ this‬داخل الدالة المجهولة )‪ (anonymous function‬التي مُب ِررَ ت‬

‫إلى الدالة )(‪ mouseenter‬للشارة إلى عنصر >‪ <a‬الحالي‪ .‬وفي كل مرة ستلمس فيها الفأرة النص‬

‫أي العناصببر مببرّ ت الفببأرة‬


‫يبببين ُ‬
‫ظهر المتصببفح تحببذيرًا )عبببر الدالببة )(‪ّ (alert‬‬
‫فسببي ِ‬
‫ُ‬ ‫»‪«jQuery.com‬‬

‫فوقها عبر عرض قيمة الخاصية ‪.id‬‬

‫كببان من الممكن في المثببال السببابق تمريببر ‪ this‬إلى دالببة ‪ jQuery‬لكي يُ ّ‬


‫غلف عنصببر ‪ DOM‬داخببل‬

‫ً‬
‫فبدل من‪:‬‬ ‫‪،jQuery‬‬

‫‪42‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫الوصأول إلى خاصأية ‪ ID‬لعنصر ‪// DOM‬‬


‫;)‪alert(this.id‬‬

‫كنا نستطيع فعل هذا‪:‬‬

‫تغليف عنصر ‪ DOM‬داخل كائن ‪// jQuery‬‬


‫ومن ثم سنتمكن من استخدام )(‪ attr‬للوصأول إلى قيمة ‪// ID‬‬
‫;))'‪alert($(this).attr('id‬‬

‫لن الدالببة ‪ jQuery‬ل تقبببل تمريببر تعببابير لتحديببد العناصببر فحسببب‪ ،‬وإنمببا تقبببل‬
‫ممكن ّ‬
‫ٌ‬ ‫مببا سبببق‬

‫ضب ب با تمري ب ببر مرجعي ب ببة )‪ (reference‬إلى كائن ب ببات ‪ .DOM‬حيث ُتش ب ببير الكلم ب ببة المحج ب ببوزة ‪ this‬في‬
‫أي ً‬

‫عنصر في شجرة ‪.DOM‬‬


‫ٍ‬ ‫الشيفرة السابقة إلى‬

‫بدهيا؛ ففعببل‬ ‫السبب وراء رغبتك باستخدام ‪ jQuery‬مع كائنببات ‪ DOM‬يجب أن يكببون واضب ً‬
‫بحا وبب ً‬

‫ذلببك سببيعطيك إمكانيببة اسببتخدام دوال ‪ jQuery‬وتطبيقهببا على شببكل سلسببلة على تلببك الكائنببات إن‬

‫َ‬
‫احتجت إلى ذلك‪.‬‬

‫المرور على مجموعة من العناصببر الموجببودة ضببمن مجموعببة تغليببف في ‪ jQuery‬هببو أمببرٌ يشببابه‬

‫ً‬
‫سابقا‪ .‬فيمكننا المببرور على كببل عنصب ٍبر من عناصببر شببجرة ‪ DOM‬والموجببود في‬ ‫المفهوم الذي ناقشناه‬

‫ً‬
‫وصول إلى كببل عنصببر ‪DOM‬‬ ‫مجموعة تغليف باستخدام الدالة )(‪ each‬في ‪ .jQuery‬وهذا ما يمنحنا‬

‫على حدة عبر استخدام الكلمة المحجوزة ‪.this‬‬

‫بنببباء على شبببيفرة المثبببال السبببابق‪ ،‬سببب ُن ِ‬


‫حدد في هبببذا المثبببال جميبببع عناصبببر >‪ <a‬في الصبببفحة‬ ‫ً‬

‫وسنسببتخدم الدالببة )(‪ each‬للمببرور على كببل عنصببر >‪ <a‬في مجموعببة التغليببف‪ ،‬ومن ثم سببنحاول‬

‫‪43‬‬
jQuery ‫تعلم‬ jQuery ‫ المفاهيم الساسية في‬:‫الفصل الول‬

:(‫ هذا هو المثال النهائي )مثال حي‬.‫ التابعة لتلك العناصر‬id ‫الوصول إلى خاصية‬

<!DOCTYPE html>
<html lang="en">
<body>
<a id="link1">jQuery.com</a>
<a id="link2">jQuery.com</a>
<a id="link3">jQuery.com</a>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
‫ُظه‬
// id ‫ِر قيمة‬ ‫حلقة تكرار التي ست‬
// ‫< في الصفحة‬a> ‫لكل عنصر‬
$('a').each(function()
{
‫ ت‬this
// ‫ُشير إلى العنصر الحالي في حلقة التكرار‬
alert($(this).attr('id'));
});
})(jQuery);
</script>
</body>
</html>

44
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫ظهر تحببذيرًا )‪ (alert‬فيببه قيمببة الخاصببية ‪ id‬لكببل‬


‫بفح‪ ،‬فسب ُبي ِ‬ ‫إذا جببرّ َ‬
‫بت المثببال السببابق في متصب ٍ‬

‫عنصر >‪ <a‬في الصفحة؛ ولوجود ثلثة عناصر >‪ <a‬في الصببفحة فسببتمرّ حلقببة التكببرار ثلث مببرات‬

‫عبر الدالة )(‪ each‬وستظهر ثلث نوافذ تحذير‪.‬‬

‫مباشرة‬
‫ً‬ ‫‪ .16‬استخراج العناصر من مجموعة التغليف لستخدامها‬

‫دون ‪jQuery‬‬
‫إذا ح ّد َ‬
‫دت عناصر ‪ HTML‬باستخدام ‪ jQuery‬فهذا ل يعني أب ًدا أنببك سببتفقد الوصببول إلى عناصببر‬

‫دومب ب ا اس ب ببتخراج عنص ب ببر من مجموع ب ببة التغلي ب ببف والتعام ب ببل مع ب ببه ع ب بببر لغ ب ببة‬
‫ًب‬ ‫‪ DOM‬نفس ب ببها‪ .‬يمكن ب ببك‬

‫‪ .JavaScript‬على سببببببيل المثبببببال‪ ،‬سأضببببببط –في المثبببببال التي– خاصبببببية ‪ title‬لعنصبببببر >‪ <a‬في‬

‫صفحة ‪ HTML‬بتعديل قيمة الخاصية ‪ title‬الصلية لعنصر ‪) DOM‬مثال حي(‪.‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<a>jQuery.com</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫استخدام خاصأيات ‪ DOM‬لضبط خاصأية ‪// title‬‬
‫;'‪$('a').get(0).title = 'jQuery.com‬‬

‫‪45‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫تعديل عنصر ‪ DOM‬باستخدام دوال ‪// jQuery‬‬


‫;)'‪$('a').attr('href', 'http://www.jquery.com‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫برس‬ ‫ِ‬ ‫وكم ببا ش ببرحنا س ب ً‬


‫بابقا‪ ،‬ت ببوفر ‪ jQuery‬الدال ببة )(‪ get‬للوص ببول إلى عناص ببر ‪ DOM‬ال ببتي له ببا فه ب ٌ‬

‫معي ٌن في مجموعة التغليف‪.‬‬


‫ّ‬ ‫)‪(index‬‬

‫لكن هنالببك خيببارٌ آخببرٌ هنببا‪ .‬إذ يمكنببك تفببادي اسببتخدام الدالببة )(‪ get‬عبببر اسببتخدام القببواس‬

‫المربع ببة على كببائن ‪ jQuery‬نفس ببه )والببتي ُتس ببتعمَ ل للوص ببول إلى عناصببر المصببفوفات(‪ .‬ففي س ببياق‬

‫مثالنا السابق‪ ،‬يمكن تعديل الشيفرة‪:‬‬

‫;'‪$('a').get(0).title = 'jQuery.com‬‬

‫لتصبح كالتي‪:‬‬

‫;'‪$('a')[0].title = 'jQuery.com‬‬

‫ِ‬
‫أفضبل اسببتخدام القببواس‬ ‫ستتمكن في كل الطريقببتين من الوصببول إلى عنصببر ‪ .DOM‬شخصب ًبيا‬

‫المربعببة‪ّ ،‬‬
‫لنهببا أسببرع إذ سنسببتخدم حينئببذٍ ‪ JavaScript‬للحصببول على عنصب ٍبر من عناصببر المصببفوفة‪،‬‬

‫ً‬
‫بدل من الحاجة إلى استخدام إحدى دوال ‪.jQuery‬‬

‫‪46‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫لكن الدالة )(‪ get‬سببتفيدك إن شب َ‬


‫بئت أن تضببع جميببع عناصببر ‪ DOM‬في مصببفوفة‪ .‬حيث سببيؤدي‬

‫برس إليهب ببا إلى إعب ببادة جميب ببع عناصب ببر ‪ DOM‬الموجب ببودة في‬
‫اسب ببتدعاء الدالب ببة )(‪ get‬دون تمري ب ب ِر فهب ب ٍ‬

‫مجموعة التغليف على شكل مصفوفة عادية‪.‬‬

‫لنختبر الدالة )(‪ get‬ليضاح مبا سبببق‪ ،‬حيث سأضببع جميببع عناصببر >‪ <a‬في المثببال التي ضببمن‬

‫مصببفوفة‪ ،‬ثم سأسببتخدم المصببفوفة للوصببول إلى خاصببية ‪ title‬لعنصببر >‪ <a‬الثببالث في الصببفحة‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫"‪<a href="http://www.jquery.com‬‬
‫>‪title="anchor1">jQuery.com</a‬‬
‫"‪<a href="http://www.jquery.com‬‬
‫>‪title="anchor2">jQuery.com</a‬‬
‫"‪<a href="http://www.jquery.com‬‬
‫>‪title="anchor3">jQuery.com</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫إنشاء مصفوفة من مجموعة التغليف ‪//‬‬
‫;)(‪var arrayOfAnchors = $('a').get‬‬

‫‪47‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫إظهار خاصأية ‪ title‬للرابط الثالث ‪//‬‬


‫;)‪alert(arrayOfAnchors[2].title‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫استخدام )(‪ get‬سيؤدي إلى »كسر« سلسلة دوال ‪ .jQuery‬حيث ستأخذ هذه‬
‫َ‬
‫مجموعة التغليف وستحولها إلى مصفوفةٍ من عناصر ‪ DOM‬التي لم تعد‬ ‫ُ‬
‫الدالة‬
‫ملحاظة‬
‫ُمضمّ ن ًَة في كائن ‪ .jQuery‬وبالتالي استخدام الدالة )(‪ .end‬لن يستعيد‬

‫السلسلة بعد استخدام )(‪. .get‬‬

‫‪ .17‬التحقق إن كانت مجموعة التغليف فارغة‬


‫قبل أن تبدأ بالتعامل مع مجموعببة التغليببف‪ ،‬من المنطقي ً‬
‫أول التحقببق من ّ‬
‫أنك قببد حب ّد َدت شببي ًئا‬

‫مببا! أبسببط حببل هببو اسببتخدام العبببارة الشببرطية ‪ if‬للتأكببد إن كببانت مجموعببة التغليببف تحتببوي أيّ ب ة‬

‫عناصر ‪) DOM‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<a>jQuery</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬

‫‪48‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫هل هنالك عناصأر في المجموعة؟ ‪//‬‬
‫))‪if (jQuery('a').get(0‬‬
‫{‬
‫;)'‪jQuery('a').attr('href', 'http://www.jquery.com‬‬
‫}‬
‫التحقق من طول المجموعة؛ يمكن استخدام )(‪ .size‬أيضًا ‪//‬‬
‫)‪if (jQuery('a').length‬‬
‫{‬
‫;)'‪jQuery('a').attr('title', 'jQuery‬‬
‫}‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫لن ‪ jQuery‬ستفشببل بصببمت إن لم يُ ع َثببر‬ ‫ً‬


‫برورية‪ّ ،‬‬‫إن عبببارات ‪ if‬السببابقة ليسببت ضب‬
‫في الحقيقببة ّ‬

‫بحيح أنن ببا‬


‫ٌ‬ ‫على أيّب ب ة عناص ببر‪ ،‬ولكن ُ‬
‫ستس ببتدعى ك ببل دال ببةٍ مرتبط ببةٍ بمجموع ببةِ التغلي ب ِبف الفارغ ببة‪ .‬وص ب‬

‫نستطيع تجنب استعمال العبارة الشرطية ‪ ،if‬لكن ذلك مستحسن؛ فاستدعاء الدوال على مجموعببة‬

‫تغلي ببف فارغ ببة ق ببد يس ببتهلك وقت معالج ببة إض ببافي‪ ،‬وق ببد تحص ببل على نت ببائج غ ببير مرغ ببوب فيه ببا إن‬

‫عمليات على تلك القيم‪.‬‬


‫ٍ‬ ‫َ‬
‫أجريت‬ ‫أعادت تلك الدوال قيمً ا غير متوقعة ومن ثم‬

‫‪49‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪ .18‬إنشاء اسم بديل للوصول إلى الدالة ‪jQuery‬‬


‫ِ‬
‫توفر مكتبة ‪ jQuery‬الدالة )(‪ noConflict‬التي لها عب ِ‬
‫بدة اسببتخدامات‪ .‬أحببد أبببرز اسببتخداماتها‬

‫هببو القببدرة على اسببتخدام اسببم بببديل آخببر بب ً‬


‫بدل من ‪ .$‬وقببد تسببتفيد من هببذا بثلث طرائببق‪ :‬يمكنببك‬

‫ً‬
‫دونبببببا عن ‪ ،jQuery‬ويسببببباعدك ذلبببببك في تجنب‬ ‫إع ب ببادة رببببببط المح ب ببرف ‪ $‬بمكتب ب ببة أخبببببرى تس ب ببتعمله‬

‫بديل )‪ (alias‬لكائن ‪.jQuery‬‬ ‫اسم‬


‫ٍ‬ ‫ِ‬
‫ويوفر لك إمكانية تخصيص‬ ‫التضاربات‪،‬‬
‫ٍ‬

‫أنك تطب ِبور تطبببيق ويب لشببركة باسببم ‪ ،XYZ‬فربمببا تجببد من المناسببب أن ُت ِ‬
‫خص بص ‪jQuery‬‬ ‫لنقببل ّ‬

‫لببببكبببببببببببببببي تسببببببببببببببتبببببببببببببببببدل )(‪ XYZ('div').show‬بالتعبببببببببيببببببببببببببببببر )(‪ jQuery('div').show‬أو‬

‫)(‪) $('div').show‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>XYZ company</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫;)(‪var XYZ = jQuery.noConflict‬‬
‫تجربة إحدى دوال ‪// jQuery‬‬
‫;))(‪alert(XYZ("div").text‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪50‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫بتمرير قيمة منطقية )‪ (boolean‬تساوي ‪ true‬إلى الدالة )(‪noConflict‬‬


‫فستتمكن من ّ‬
‫فك ارتباط المتغير ‪ jQuery‬بالمكتبة‪ ،‬ول يجدر بك فعل ذلك إل‬
‫ملحاظة‬
‫في بعض الحالت النادرة مثل استخدام أكثر من إصدار ‪ jQuery‬في نفس‬

‫لن ذلك قد يُ سبِ ب مشاكل مع إضافات ‪.jQuery‬‬


‫الصفحة‪ّ ،‬‬

‫‪ .19‬استخدام )(‪ .each‬عندما ل يكون الدوران الضمني على العناصر‬

‫كافيا‬
‫ً‬
‫بحا بالنسبببة إليببك ّ‬
‫أنه إذا كببانت لببديك صببفحة ‪) HTML‬كالظبباهرة في المثببال‬ ‫أن يكببون واضب ً‬
‫آمببل ّ‬

‫سببت ِ‬
‫حدد العناصببر الثلثببة في‬ ‫ُ‬ ‫أن تعليمببة ‪ jQuery‬التاليببة‬
‫أدنبباه( وفيهببا ثلثببة عناصببر >‪ <div‬فارغببة ّ‬

‫ُ‬
‫وستضيف السلسلة النصية »‪«I am a div‬‬ ‫ضمنيا ] ‪([implicit iteration‬‬
‫ً‬ ‫الصفحة‪ ،‬وتمر عليها )دوارًا‬

‫لكل العناصر الثلثة )أي عناصر >‪) (<div‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div></div‬‬
‫>‪<div></div‬‬
‫>‪<div></div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬

‫‪51‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫)‪(function($‬‬
‫{‬
‫;)'‪$('div').text('I am a div‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫لن شيفرة ‪ jQuery‬تفترض ّ‬


‫أنك تريببد معالجببة العناصببر الثلثببة‪ ،‬وهببذا‬ ‫ضمني ّ‬ ‫أن الدوران‬
‫اعتبرنا ّ‬
‫ٌ‬

‫يتطلب المرور على كل عنصر وضبط القيمة النصية لكل >‪ <div‬إلى النص »‪ .«I am a div‬وهذا ما‬

‫يُ سمى بالدوران الضمني‪.‬‬

‫ما سبق مفي ٌد ج ًدا‪ ،‬وأغلبية دوال ‪ jQuery‬تستعمل الدوران الضببمني‪ .‬لكن سب ُبت ّ‬
‫طبق بعض الببدوال‬

‫على أوّ ل عنصبببر في مجموعبببة التغليبببف فقبببط‪ .‬على سببببيل المثبببال‪ ،‬الدالبببة )(‪ attr‬التابعبببة لمكتببببة‬

‫‪ jQuery‬ستصببببببل إلى أول عنصببببببر في مجموعببببببة التغليببببببف عنببببببدما ُتسببببببتخ َدم للحصببببببول على قيمة‬

‫إحدى الخاصيات‪.‬‬

‫ضمنيا‬
‫ً‬ ‫ً‬
‫دورانا‬ ‫ُ‬
‫فستطبِق ‪jQuery‬‬ ‫عند استخدام الدالة )(‪ attr‬لضبط خاصية‪،‬‬
‫ملحاظة‬
‫لضبط الخاصية لجميع العناصر الموجودة في مجموعة التغليف‪.‬‬

‫تحتببببوي مجموعببببة التغليببببف في الشببببيفرة التيببببة على جميببببع عناصببببر >‪ <div‬الموجببببودة في‬

‫الصفحة‪ ،‬لكن الدالة )(‪ُ attr‬‬


‫ستعيد قيمة ‪ id‬لول عنصر موجود في المجموعة )مثال حي(‪:‬‬

‫‪52‬‬
jQuery ‫تعلم‬ jQuery ‫ المفاهيم الساسية في‬:‫الفصل الول‬

<!DOCTYPE html>
<html lang="en">
<body>
<div id="div1">I am a div</div>
<div id="div2">I am a div</div>
<div id="div3">I am a div</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫ول عنصر في مجموعة التغليف‬
ّ‫ستظهر قيمة الخاصأية ل‬
alert($('div').attr('id')); // ‫الناتج‬: "div1"
})(jQuery);
</script>
</body>
</html>

.‫ لكببل عنصببر في الصببفحة‬id ‫أن ما ُتري ُده هو الحصول على قيمة الخاصببية‬ ُ
ّ ‫افترض‬ ،‫وللتوضيح‬

‫ سببتبدو‬.<div> ‫ لكببل عنصببر‬id ‫ للوصببول إلى قيمببة خاصببية‬jQuery ‫يمكنك أن تكتب ثلث تعليمببات‬

:‫الشيفرة عندئذٍ كالتالية‬

$('#div1').attr('id');
$('#div2').attr('id');

53
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫;)'‪$('#div3').attr('id‬‬

‫ُخزِّن الطلبية ‪//‬‬


‫أو ن‬
‫;)'‪var $divs = $('div‬‬
‫البدء من العدد ‪ 0‬وليس ‪$divs.eq(0).attr('id'); // 1‬‬
‫;)'‪$divs.eq(1).attr('id‬‬
‫;)'‪$divs.eq(2).attr('id‬‬

‫أن الشببيفرة السببابقة طويلببة ج ب ًد ا؟ أليس من الفضببل أن نمببر بحلقببة تكببرار على عناصببر‬
‫أل تببرى ّ‬

‫مجموع ببة التغلي ببف ومن ثم نس ببتخرج قيم ببة الخاص ببية ‪ id‬ببس بباطة من ك ببل عنص ببر >‪<div‬؟ يمكنن ببا‬

‫باسببتخدام الدالببة )(‪ $().each‬أن نجببري تكببرارًا على عناصببر مجموعببة التغليببف عنببدما نحتبباج إلى‬

‫ضمنيا( للتعامل مع ع ّدة عناصر‪.‬‬


‫ً‬ ‫إنشاء حلقة تكرار يدويً ا )وليس‬

‫سأسببتخدمُ في المثببال التي الدالببة )(‪ $().each‬للمببرور على عناصببر مجموعببة التغليببف‪ ،‬ومن‬

‫ثم الوصول إلى كل عنصر في المجموعة واستخراج قيمة خاصية ‪ id‬التابعة له )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="div1">div1</div‬‬
‫>‪<div id="div2">div2</div‬‬
‫>‪<div id="div3">div3</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬

‫‪54‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫إظهار ‪ 3‬تحذيرات ‪//‬‬
‫)(‪$('div').each(function‬‬
‫{‬
‫ّل كل عنصر في مجموعة التغليف ‪//‬‬
‫‪ this‬تمث‬
‫ِ‬
‫;))'‪alert($(this).attr('id‬‬
‫يمكن أن نكتب أيضًا‪// alert(this.id) :‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫تخي ب ل م ببا هي المكاني ببات ال ببتي تت بباح ل ببك عن ببدما تتمكن من إج ببراء عملي ببة التك ببرار ي ببدويً ا في‬
‫ّب‬

‫وقت تريد!‬
‫ٍ‬ ‫أي‬
‫ّ‬

‫ِ‬
‫توفر ‪ jQuery‬الدالة ‪ $.each‬ول تخلط بينها وبين الدالة ‪ $().each‬التي‬

‫ُت ستخدم للدوران على عناصر مجموعة تغليف تابعة للكائن ‪ .jQuery‬إذ يمكن‬
‫ملحاظة‬
‫أن ُتستخ َدم الدالة ‪ $.each‬للدوران على مصفوفة أو كائن عادي في‬
‫ٌ‬
‫بديل عن حلقات التكرار الموجودة في لغة ‪.JavaScript‬‬ ‫‪JavaScript‬؛ أي أنها‬

‫‪55‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪ .20‬ستُ عاد العناصر في مجموعة تغليف ‪ jQuery‬بنفس ترتيب‬

‫ورودها في المستند‬
‫بائج كمببا هي مرتبب ٌ‬
‫بة في المسببتند‬ ‫سيعيد مُ حب ِبركُ التحديببد النتب َ‬
‫في إصدار ‪ jQuery 1.3.2‬وما بعده‪ُ ،‬‬

‫وليس كما هو ترتيبها في المُ ِ‬


‫حدد )‪ (selector‬الذي مُ ِرر إلى دالة ‪ .jQuery‬أي ّ‬
‫أن محتويببات مجموعببة‬

‫التغليف ستكون بنفس ترتيب ورود العناصر في المستند من العلى إلى السفل‪ .‬لكن الحال لم يكن‬

‫كما هو عليه قبل إصدار ‪) 1.3.2‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<h1>h1</h1‬‬
‫>‪<h2>h2</h2‬‬
‫>‪<h3>h3</h3‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫ٌ في بداية ‪//‬‬ ‫ً‬
‫أول‪ ،‬لكن العنصر ‪ h1‬موجود‬ ‫مرّرنا ‪h3‬‬
‫ً‬
‫أول في مجموعة التغليف ‪//‬‬ ‫َر‬
‫ُذك‬
‫المستند لذلك سي‬
‫الناتج‪// "H1" :‬‬
‫;)‪alert($('h3, h2, h1').get(0).nodeName‬‬
‫;)‪})(jQuery‬‬

‫‪56‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ستخدم من دالة ‪jQuery‬‬


‫َ‬ ‫الم‬
‫‪ .21‬تحديد ما هو السياق ُ‬
‫السياق )‪ (context‬الفتراضي المُ ستخدم من دالة ‪ jQuery‬عند تحديد عناصببر ‪ DOM‬هببو العنصببر‬

‫ثاني ا‬
‫ًب‬ ‫أنك إن لم تب ِ‬
‫بوفر معببامِ ًل )‪(parameter‬‬ ‫‪ً ) document‬‬
‫مثل‪ ($('a', document) :‬وهببذا يعببني ّ‬

‫لدالببة ‪ً ) jQuery‬‬
‫مثل‪ (jQuery() :‬لتحديببد مببا هببو السببياق الببذي سب ُبت ّ‬
‫نفذ فيببه طلبيببة ‪ ،DOM‬فسببيكون‬

‫السياق الفتراضي هو العنصر ‪ ،document‬والمعروف عمومً ا بالعنصر >‪.<body‬‬

‫من الممكن معرفبببة السبببياق البببذي ُتجبببري فيبببه دالبببة ‪ jQuery‬طلبيبببة ‪ DOM‬باسبببتخدام الخاصبببية‬

‫‪ .context‬سأريك فيما يلي مثالين عن الحصول على قيمة الخاصية ‪) context‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div‬‬
‫>‪<div‬‬
‫>"‪<div id="context‬‬
‫>‪<a href="#">jQuery</a‬‬
‫>‪</div‬‬
‫>‪</div‬‬
‫>‪</div‬‬

‫‪57‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery‬‬
‫>‪.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الناتج‪// "object HTMLDocument" :‬‬
‫يمكنك أيضًا استخدام ;‪// $('a', document).context‬‬
‫;)‪alert($('a').context‬‬
‫الناتج‪// "object HTMLDivElement" :‬‬
‫;)‪alert($('a', $('#context')[0]).context‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ً‬
‫مهملة‬ ‫بدءا من الصدار ‪ 1.10‬من ‪ ،jQuery‬أصبحت الخاصية ‪.context‬‬
‫ً‬

‫وحذِ َفت في الصدار ‪ ،3.0‬لذا تجنب استخدامها في التطبيقات التي تستعمل‬


‫ُ‬ ‫ملحاظة‬
‫ً‬
‫حديثة من ‪.jQuery‬‬ ‫ً‬
‫نسخا‬

‫ٍ‬
‫سلسلة وحايدة‬ ‫‪ .22‬إنشاء ُبنية ‪ DOM‬كاملة مع أحاداثها في‬
‫نشئ بُنى ‪ DOM‬كاملة ً‬
‫بدل من إنشبباء عنصببر‬ ‫يمكنك عبر استخدام دوال ‪ jQuery‬في سلسلة أن ُت ِ‬

‫نش بئ في المثببال التي قائمب ً‬ ‫ُ‬


‫بة غببيرَ مرتبببةٍ من الروابببط )لصببفحات ‪ (jQuery‬ثم‬ ‫سأ ِ‬ ‫‪ DOM‬وحيببد فقببط‪.‬‬

‫سأضيفها إلى شجرة ‪) DOM‬مثال حي(‪:‬‬

‫‪58‬‬
jQuery ‫تعلم‬ jQuery ‫ المفاهيم الساسية في‬:‫الفصل الول‬

<!DOCTYPE html>
<html lang="en">
<body>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

jQuery('<ul></ul>')
.append('<li><a>jQuery.com</a></li><li>
<a>jQueryDocumentation</a></li>')
.find('a:first')
.attr('href', 'http://www.jquery.com')
.end()
.find('a:eq(1)')
.attr('href', 'http://docs.jquery.com')
.end()
.find('a')
.click(function()
{
return confirm('Leave this page?');
})
.end()
.appendTo('body');

59
‫تعلم ‪jQuery‬‬ ‫الفصل الول‪ :‬المفاهيم الساسية في ‪jQuery‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أن ‪ jQuery‬يمكن أن ُتسبببتعمَ ل لنشببباء‬


‫المفهبببوم البببذي عليبببك اسبببتيعابه من المثبببال السبببابق هبببو ّ‬

‫والتعامببل مببع ُبببنى ‪ DOM‬معقببدة‪ .‬ويمكنببك باسببتخدام دوال ‪ jQuery‬فقببط أن ُت ِ‬


‫نش بئ بببنى ‪ DOM‬الببتي‬

‫تحتاج لها مهما بلغت من التعقيد‪.‬‬

‫‪60‬‬
‫الفصل الثاني‪:‬‬

‫تحديد العناصر في ‪jQuery‬‬

‫‪2‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫ستعم َلت‬
‫ِ‬ ‫حدد العناصر إن اُ‬ ‫لم ِ‬
‫رشحات ‪ jQuery‬الخاصة أن ُت ِ‬ ‫‪ .1‬يمكن ُ‬
‫بمفردها‬
‫ليس من الضببببببببببببببروري توفببببببببببببببير عنصببببببببببببببر عنببببببببببببببد اسبببببببببببببببتخدام المرشبببببببببببببببحات )‪ (filters‬مثل‬

‫ِ‬
‫)'‪ ،$('div:hidden‬فمن الممكن ببساطة تمريببر المُ رشبح بمفببرده في أي مكببان يمكنببك وضببع تعبب ٍ‬
‫بير‬

‫للتحديدِ فيه‪.‬‬

‫بعض المثلة‪:‬‬

‫تحديد جميع العناصأر المخفية ‪//‬‬


‫;)'‪$(':hidden‬‬
‫تحديد جميع عناصأر ‪ ،div‬ثم اختيار ذوات الترتيب الفردي ‪//‬‬
‫;)'‪$('div').filter(':even‬‬

‫ِ‬
‫المرش َحين ‪ :hidden‬و ‪:visible‬‬ ‫‪ .2‬تمييز الفرق بين‬
‫َ‬
‫خاصية ‪ visibility‬في‬ ‫ل يأخذ المُ ِ‬
‫رشحان ‪ :hidden‬و ‪ :visible‬الخاصان بمكتبة ‪jQuery‬‬

‫مخفيا‬
‫ً‬ ‫‪ CSS‬بالحس بببان كم ببا ق ببد تتوق ببع‪ .‬فالطريق ببة ال ببتي تس ببتعملها ‪ jQuery‬لتحدي ببد إن ك ببان العنص ببر‬

‫)‪ (hidden‬أو ظاهرًا )‪ (visible‬هي معرفببة إن كببان يَ شب ُ‬


‫بغل العنصببرُ أيّب ة مسبباحةٍ في المسببتند‪ .‬ولتببوخي‬

‫ً‬
‫قيمبببببة أكببببببر من الصبببببفر لحبببببدى الخاصبببببيتين‬ ‫الدقبببببة‪ ،‬يكبببببون العنصبببببر ظببببباهرًا إذا أعببببباد المتصبببببفح‬

‫‪ offsetWidth‬أو ‪ .offsetHeight‬وبهببببببذه الطريقببببببة يمكن أن يملببببببك أحببببببد العناصببببببر الخاصببببببية‬

‫‪ display‬في ‪ CSS‬ذات القيمب ببة ‪ block‬لكنب ببه محتب ببوى في عنصب ب ٍبر لب ببه الخاصب ببية ‪ display‬وقيمتهب ببا‬

‫‪ ،none‬وبهذا لن يكون العنصر ظاهرًا‪.‬‬

‫‪62‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

ّ
ّ ‫وتأكببد‬
‫ على الببرغم من‬true ‫أنك تفهم لمبباذا القيمببة المُ عببادة هي‬ ّ ‫ُت‬
‫فحص الشببيفرة التيببة بعنايببة‬

:(‫< )مثال حي‬div> ‫ للعنصر‬display: block ‫أننا ضبطنا الخاصية‬

<!DOCTYPE html>
<html lang="en">
<body>
<div id="parentDiv" style="display:none;">
<div id="childDiv" style="display:block;"></div>
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ٌ‫< الب مخفي‬div> ‫ لن عنصر‬،true ‫الناتج‬
// offsetWidth ‫لذا فستكون قيمة الخاصأيتان‬
// ‫ً للصفر‬
‫< الداخلي مساوية‬div> ‫ لعنصر‬offsetHeight ‫و‬
alert($('#childDiv').is(':hidden'));
})(jQuery);
</script>
</body>
</html>

63
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫‪ .3‬استخدام الدالة )(‪ is‬لعادة قيمة منطقية‬


‫عين‪ .‬يمكننببا‬ ‫ً‬
‫أحيانببا معرفببة إن كببانت تحتببوي مجموعببة من العناصببر على عنصب ٍبر مُ ّ‬ ‫من الضببروري‬

‫استخدام تعبير أو مُ ِ‬
‫رشح )‪ (filter‬للتحقق من احتواء المجموعة الحالية عليه وذلك بوسبباطة الدالببة‬

‫عنصببر واحببدٍ على القببل يُ طببا ِبق التعبببير أو‬


‫ٍ‬ ‫ُ‬
‫سببتعاد القيمببة ‪ true‬إذا احتببوت المجموعببة على‬ ‫)(‪.is‬‬

‫المُ ِ‬
‫رش ح الذي استخدمناه‪ .‬وإن لم تحتوي المجموعة على ذلك العنصر فسب ُبتعاد القيمببة ‪ .false‬أمعن‬

‫النظر في المثال التي )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="i0">jQuery</div‬‬
‫>‪<div id="i1">jQuery</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الناتج ‪// true‬‬
‫;))'‪alert($('div').is('#i1‬‬

‫الناتج ‪// false‬‬


‫لن مجموعة التغليف ل تحتوي على >‪ <div‬فيه "‪// id="i2‬‬
‫;))'‪alert($('div').is('#i2‬‬

‫‪64‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫الناتج ‪// false‬‬


‫لن مجموعة التغليف ل تحتوي على >‪ <div‬مخفي ‪//‬‬
‫;))'‪alert($('div').is(':hidden‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أن الدال ببة )(‪ alert‬الثاني ببة س ببتعيد ‪ false‬لع ببدم احت ببواء مجموع ببة‬
‫جليب ا ل ببك ّ‬
‫ًب‬ ‫يجب أن يك ببون‬

‫التغليببف في مثالنببا على عنصببر >‪ <div‬لببه خاصببية ‪ id‬ذات القيمببة ‪ .i2‬الدالببة )(‪ is‬مفيب ٌ‬
‫بدة ج ب ًدا إذا‬

‫عنصر معين‪.‬‬
‫ٍ‬ ‫َ‬
‫أردت معرفة إن احتوت مجموعة التغليف على‬

‫‪ -‬اعتبارًا من ‪ ،jQuery 1.3‬أصبحت الدالة )(‪ is‬تدعم جميع التعبيرات‪ .‬ففيما‬


‫سبق كانت التعبيرات المعقدة –كتلك التي تحتوي على مُ ِ‬
‫حددات للتسلسل‬

‫الهرمي )مثل ‪ +‬و ~ و >(– ُتعيد القيمة ‪ true‬دائمً ا‪.‬‬

‫‪ُ -‬تستعمَ ل الدالة )(‪ filter‬من قِ َبل دوال ‪ jQuery‬الداخلية الخرى‪ ،‬لذا أيّ ة‬
‫ً‬
‫أيضا‪.‬‬ ‫قواعد تنطبق عليها هناك ستنطبق هنا‬
‫ملحاظات‬
‫َ‬
‫الدالة )'‪ is('.class‬لتحديد إن كان يملك عنصرٌ‬ ‫‪ -‬يستعمل بعض المطورون‬
‫ً‬
‫دالة لفعل ذلك اسمها‬ ‫أن ‪ jQuery‬تملك‬
‫تنس ّ‬
‫عينة‪ ،‬لكن ل َ‬ ‫ما َ‬
‫فئة ‪ُ CSS‬م ّ‬
‫)'‪ hasClass('class‬التي يمكن أن ُتستعمَ ل على العناصر التي تحتوي على‬

‫أكثر من فئة‪ .‬لكن في الحقيقة‪ ،‬الدالة )(‪ hasClass‬تستعمل الدالة‬

‫داخليا‪.‬‬
‫ً‬ ‫)(‪is‬‬

‫‪65‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫حدد إلى ‪jQuery‬‬


‫مرر أكثر من ُم ِ‬
‫‪ .4‬يمكنك أن ُت ِ‬
‫ٌ‬
‫بببببول بينهبببببا بفاصبببببلة‪:‬‬ ‫يمكنبببببك توفبببببير ع ِ‬
‫بببببدة تعببببببيرات كبببببأول معامبببببل إلى الدالبببببة ‪ jQuery‬مفص‬

‫لست مقيب ًدا بتحديببد العناصببر‬


‫َ‬ ‫)'‪ ،$('expression, expression, expression‬بعبارةٍ أخرى‪،‬‬

‫بير وحيببد‪ .‬سب ِ‬


‫بأمر ر على سبببيل المثببال في الشببيفرة التيببة ثلثببة تعبببيرات إلى الدالببة ‪jQuery‬‬ ‫عبببر تعبب ٍ‬

‫ٌ‬
‫مفصول بينها بفاصلة )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>jQuery </div‬‬
‫>‪<p>is the </p‬‬
‫>‪<ul‬‬
‫>‪<li>best!</li‬‬
‫>‪</ul‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الناتج !‪// jQuery is the best‬‬
‫;))(‪alert($('div, p, ul li').text‬‬

‫‪66‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫طريقة غير فعالة‪ ،‬الناتج !‪// jQuery is the best‬‬


‫‪alert($('div').text() + $('p').text() +‬‬
‫;))(‪$('ul li').text‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫معينة والتي ُ‬
‫ستضبباف جميعًب ا إلى مجموعببة‬ ‫ّ‬ ‫سي ِ‬
‫حدد عناصرَ ‪DOM‬‬ ‫تعبير من التعابير السابقة ُ‬
‫ٍ‬ ‫ُ‬
‫كل‬

‫أن جميببع‬
‫بق ببالببك ّ‬
‫التغليببف‪ .‬يمكنببك بعببد ذلببك التعامببل مببع تلببك العناصببر باسببتخدام دوال ‪ .jQurey‬أبب ِ‬

‫العناصر المُ ح ّد دة ستتواجد في نفس مجموعة التغليببف‪ .‬يمكن إظهببار نفس النبباتج لكن بطريقببة غببير‬

‫فعالة وليس ذات كفاءة عبر استدعاء الدالة ‪ jQuery‬ثلث مرات‪ :‬مرّ ًة لكل تعبير‪.‬‬

‫عنصرا ما قد ُحا ِد َد‬


‫ً‬ ‫أن‬
‫‪ .5‬معرفة ّ‬
‫حب ّدد التعبب ببيرُ أح ب ب َد العناصب ببر بب ببالتحقق من »طب ببول« )‪ (length‬مجموعب ببة‬
‫من الممكن معرفب ببة إن َ ب‬

‫التغليف‪ .‬يمكنك فعل ذلببك عبببر خاصببية ‪ length‬التابعببة للمصببفوفات‪ .‬إذا لم ُتعِب د الخاصببية ‪length‬‬

‫أن هنالك عنصرًا واح ًدا على القل قد طابق التعبير الذي مرّ َ‬
‫رته إلى دالببة ‪.jQuery‬‬ ‫القيمة ‪ ،0‬فستعلم ّ‬

‫سنتحقق في الشيفرة التية من وجود عنصر له خاصية ‪ id‬ذات القيمة ‪) notHere‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬

‫‪67‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫"‪: "0‬الناتج ‪//‬‬
‫;)‪alert($('#notHere').length‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ً‬
‫أيضا عدد العناصر الموجودة في‬ ‫أن خاصية ‪ُ length‬‬
‫ستعيد‬ ‫قد ل يخطر ببالك ّ‬
‫بتعبير آخر‪ :‬عدد العناصر التي ُح ِد َدت عبر التعبير الذي مُ ِررَ‬
‫ٍ‬ ‫مجموعة التغليف‪.‬‬ ‫ملحاظة‬
‫إلى دالة ‪.jQuery‬‬

‫خصصة لتحديد العناصر‬ ‫‪ .6‬إنشاء ُم ِ‬


‫رشحات ُم ّ‬
‫خصصببة‪ .‬نظريًب ا‪،‬‬
‫ّ‬ ‫من الممكن توسعة قدرات محب ِبرك التحديببد في ‪ jQuery‬عبببر إنشبباء ُم ِ‬
‫رشبحات مُ‬

‫بددات الموجببودة في ‪ .jQuery‬لنقببل ً‬


‫مثل أننببا نريببد تحديببد جميببع‬ ‫مببا نفعلببه هنببا هببو البنبباء على المُ حب ِ‬

‫العناصببر في صببفحة ويب الببتي مكانهببا »مطلببق« ) ‪ .(absolutely positioned‬ولعببدم امتلك ‪jQuery‬‬

‫ِ‬
‫على ُمرش ٍ‬
‫ح مخصص باسم ‪ :positionAbsolute‬فعلينا إنشاء واحد بأنفسنا )مثال حي(‪:‬‬

‫‪68‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

<!DOCTYPE html>
<html lang="en">
<body>
<div style="position:absolute">absolute</div>
<span style="position:absolute">absolute</span>
<div>static</div>
<div style="position:absolute">absolute</div>
<div>static</div>
<span style="position:absolute">absolute</span>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
ّ‫ُرش‬
// $.expr[':'] ‫ِح مخصص عبر توسعة‬ ‫تعريف م‬
$.expr[':'].positionAbsolute = function(element)
{
return $(element).css('position') === 'absolute';
};

// ‫ما هو عدد العناصأر ذات المكان المطلق في الصفحة؟‬


alert($(':positionAbsolute').length); // ‫الناتج‬: "4"

// ‫< ذات المكان المطلق؟‬div> ‫ما هو عدد عناصأر‬


// 2 :‫الناتج‬

69
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫;)‪alert($('div:positionAbsolute').length‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫بت مقيب ب ًدا بالمُ ح ب ِ‬


‫بددات الفتراضبببية البببتي توفرهبببا‬ ‫أهم ش ببيء عليبببك أن تفهمبببه هن ببا هبببو ّ‬
‫أنك لس ب َ‬

‫بددات خاص ببة ب ببك؛ لكن قب ببل أن تض ب ّبيع وقت ببك بإنش بباء مُ ح ب ِ‬
‫بدد ُم ّ‬
‫خصب بص‬ ‫‪ .jQuery‬يمكن ببك إنش بباء ُمح ب ِ‬

‫فج ببرب ً‬
‫أول اس ببتعمال الدالببة )(‪ filter‬م ببع تحدي ببد دالببة للترش ببيح‪ .‬على سبببيل المث ببال‪ ،‬يمكن ببك أن‬

‫تتفببادى كتابببة المُ ِ‬


‫رشبح ‪ :positionAbsolute‬السببابق بترشببيح العناصببر عبببر تمريببر دالببة إلى الدالببة‬

‫)(‪.filter‬‬

‫حذف جميع عناصأر >‪ <div‬من مجموعة التغليف ‪//‬‬


‫والتي ليس موقعها مطلً‬
‫قا ‪//‬‬
‫=== )'‪$('div').filter(function(){return $(this).css('position‬‬
‫;)};'‪'absolute‬‬

‫أو ‪//‬‬

‫حذف جميع العناصأر من مجموعة التغليف ‪//‬‬


‫والتي ليس موقعها مطلً‬
‫قا ‪//‬‬
‫=== )'‪$('*').filter(function(){return $(this).css('position‬‬
‫;)};'‪'absolute‬‬

‫‪70‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫خصصة‪ ،‬أقترح أن تقرأ‬


‫ّ‬ ‫لمزيدٍ من المعلومات حول إنشاء مُ ِ‬
‫حددات مُ‬
‫ملحاظة‬
‫هذه المقالة‪.‬‬

‫‪ .7‬الفروقات بين الترشيح عبر الترتيب الرقمي والترشيح عبر‬

‫العلقات في شجرة ‪DOM‬‬


‫حات لترشببيح مجموعببة التغليببف عبببر الببترتيب الببرقمي لببورود العناصببر ضببمن‬
‫ٍ‬ ‫رشب‬ ‫ِ‬
‫توفر ‪ُ jQuery‬م ِ‬

‫المجموعة‪ ،‬هذه المرشحات هي‪:‬‬

‫‪:first‬‬ ‫•‬

‫‪:last‬‬ ‫•‬

‫‪:even‬‬ ‫•‬

‫‪:odd‬‬ ‫•‬

‫)‪:eq(index‬‬ ‫•‬

‫)‪:gt(index‬‬ ‫•‬

‫)‪:lt(index‬‬ ‫•‬

‫رشحات التي ُت ِ‬
‫رشح مجموعة التغليف نفسها تبدأ بترشيح المجموعة من‬ ‫المُ ِ‬

‫الرقم ‪) 0‬أو الفهرس ‪ .(0‬على سبيل المثال‪ ،‬باستخدام )‪ :eq(0‬و ‪:first‬‬


‫سنصل إلى العنصر الول في المجموعة الذي هو في الفهرس ‪) 0‬مثلً‪:‬‬
‫ِ‬
‫المرشح ‪ :nth-child‬الذي يبدأ‬ ‫)')‪ ،($('div:eq(0‬وهذا ما يناقض تمامً ا‬ ‫ملحاظة‬
‫من ‪ .1‬أي على سبيل المثال )‪ :nth-child(1‬سيعيد أول عنصر‪ ،‬ولن‬

‫تستطيع استخدام )‪ :nth-child(0‬حيث سيؤدي استخدام‬

‫)‪ :nth-child(0‬إلى عدم تحديد أيّ ة عناصر‪.‬‬

‫‪71‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫اسببببتخدام ‪ :first‬سببببيؤدي إلى تحديببببد أول عنصببببر في المجموعببببة بينمببببا اسببببتخدام ‪:last‬‬

‫باء على‬ ‫ست ِ‬


‫رش بح العناصببر بنب ً‬ ‫أن المُ ِ‬
‫رش بحات ُ‬ ‫حد د آخببر عنصببر في المجموعببة‪ .‬من المهم أن تتب ّ‬
‫بذكر ّ‬ ‫سب ُبي ِ‬

‫باء على علقتهببا مببع بقيببة‬ ‫ِ‬


‫ترشبحها بنب ً‬ ‫مكانها )تبدأ الهيكلة الرقمية من الرقم ‪ (0‬ضببمن المجموعببة‪ ،‬ول‬

‫العناصببببببر الموجببببببودة في شببببببجرة ‪ .DOM‬وبالتببببببالي يجب أن تسببببببتنتج لمبببببباذا سببببب ُبتعيد المرشببببببحات‬

‫‪ :first‬و ‪ :last‬و )‪ :eq(index‬عنصرًا وحي ًدا فقط‪.‬‬

‫إذا لم يكن ذلبببك واضب ب ً‬


‫بح ا بالنسب بببة لبببك‪ ،‬فاسب ببمح لي أن أشب ببرحها لب ببك أكب ببثر‪ .‬السب بببب وراء إعب ببادة‬

‫‪ :first‬لعنصب ٍبر وحيببدٍ فقببط هببو ّ‬


‫أنه يمكن أن يتواجببد عنصببرٌ وحيب ٌد فقببط في أوّ ل المجموعببة عنببدما‬

‫ّ‬
‫وتفحص الشببيفرة التيببة‬ ‫منطقي ا بالنسبببة لببك‪،‬‬
‫ًب‬ ‫تكببون هنالببك مجموعب ٌ‬
‫بة وحيببدة‪ .‬يجب أن يكببون المببر‬

‫عمليا على هذا المفهوم )مثال حي(‪:‬‬


‫ً‬ ‫ً‬
‫تطبيقا‬ ‫لتشاهد‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<ul‬‬
‫>‪<li>1</li‬‬
‫>‪<li>2</li‬‬
‫>‪<li>3</li‬‬
‫>‪<li>4</li‬‬
‫>‪<li>5</li‬‬
‫>‪</ul‬‬
‫>‪<ul‬‬
‫>‪<li>6</li‬‬
‫>‪<li>7</li‬‬

‫‪72‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

<li>8</li>
<li>9</li>
<li>10</li>
</ul>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫ِع محتوى جميع العناصأر‬
‫ُجم‬
ّ ‫ّر أن‬
‫ ت‬text() َ
ّ ‫تذك‬
// ‫ة وحيدة‬
ٍ‫ة نصي‬
ٍ‫الموجودة في مجموعة التغليف في سلسل‬
alert('there are ' + $('li').length +
' elements in the set');
// ‫الحصول على أول عنصر في المجموعة‬
alert($('li:first').text()); // ‫الناتج‬: "1"
// ‫الحصول على آخر عنصر في المجموعة‬
alert($('li:last').text()); // ‫الناتج‬: "10"
// 0 ‫َ العد يبدأ من‬
ّ
‫ تذكر أن‬،‫إظهار العنصر السادس‬
alert($('li:eq(5)').text()); // ‫الناتج‬: "6"
})(jQuery);
</script>
</body>
</html>

73
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫باء على مكانهببا‪ ،‬فيمكننببا الن النتقببال إلى ترشببيح العناصببر‬


‫بعد فهمك لكيفية ترشيح العناصر بنب ً‬

‫دات لفعببل ذلببك‪.‬‬


‫حد ٍ‬ ‫ِ‬
‫توفر ‪ jQuery‬ع ّدة ُم ِ‬ ‫ذات العلقة الفريدة بغيرها من العناصر ضمن شجرة ‪.DOM‬‬

‫ٌ‬
‫ببببببيهة بتعبببببابير ‪ CSS‬الشبببببهيرة لتحديد‬ ‫بببببددات خاص ٌ‬
‫بببببة بمكتببببببة ‪ jQuery‬والخبببببرى ش‬ ‫بعض تلبببببك المُ ح ِ‬

‫عناصر ‪.DOM‬‬

‫‪:last-child‬‬ ‫•‬ ‫‪ancestor descend‬‬ ‫•‬

‫‪:only-child‬‬ ‫•‬ ‫‪parent > child‬‬ ‫•‬

‫‪:empty‬‬ ‫•‬ ‫‪prev + next‬‬ ‫•‬

‫)‪:has(selector‬‬ ‫•‬ ‫‪prev ~ siblings‬‬ ‫•‬

‫‪:parent‬‬ ‫•‬ ‫)‪:nth-child(selector‬‬ ‫•‬

‫‪:first-child‬‬ ‫•‬

‫بناء على علقتها مع بقية العناصر في شجرة ‪.DOM‬‬


‫ً‬ ‫سي ِ‬
‫حد د العناصر‬ ‫استخدام هذه المُ ِ‬
‫حددات ُ‬

‫مليا إلى المثال التي لزالة الغموض عمّ ا سبق )مثال حي(‪:‬‬
‫انظر ً‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<ul‬‬
‫>‪<li>1</li‬‬
‫>‪<li>2</li‬‬
‫>‪<li>3</li‬‬
‫>‪<li>4</li‬‬
‫>‪<li>5</li‬‬
‫>‪</ul‬‬

‫‪74‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
‫ّر أن‬
// ‫ تجمع محتويات كل العناصأر‬text() ‫َ الدالة‬
ّ ‫تذك‬
// ‫ة وحيدة‬
ٍ‫ة نصي‬
ٍ‫الموجودة في مجموعة التغليف في سلسل‬

// "22" :‫الناتج‬
alert($('li:nth-child(2)').text());

// "135135" :‫الناتج‬
alert($('li:nth-child(odd)').text());

// "2424" :‫الناتج‬
alert($('li:nth-child(even)').text());

75
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫الناتج‪// "2424" :‬‬


‫;))(‪alert($('li:nth-child(2n)').text‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أن )(‪ $('li:nth-child(odd)').text‬قد أعاد القيمببة ‪ 135135‬فببأنت‬


‫ستعج ًبا ّ‬
‫ِ‬ ‫كنت ُم‬
‫َ‬ ‫إذا‬

‫لم تفهم كيفي ببة عم ببل المُ ِ‬


‫رشب بحات‪ .‬العب ببارة )')‪ $('li:nth-child(odd‬تع ببني العث ببور على جمي ببع‬

‫عناصببر >‪ <li‬في صببفحة الببويب والببتي هي »أبنبباء« ) ‪ (children‬لعناصببر أخببرى ومن ثم ترشببيحها‬

‫أن هنالك بنيتان في الصفحة تحتويان على‬


‫والبقاء على البناء التي ترتيبها فردي‪ .‬عليك أن تنتبه ّ‬

‫ِ‬ ‫ٌ‬
‫أن مجموعببة التغليببف هنببا مبنيببة على ُمرشب ٍ‬
‫ح الببذي يأخببذ بالحسبببان‬ ‫عناصببر >‪ <li‬أبنبباء‪ .‬الفكببرة هي ّ‬

‫علقببة العنصببر مببع غببيره من العناصببر في ‪ ،DOM‬وقببد تتواجببد مثببل هكببذا علقببة في أكببثر من مكببان‬

‫في المستند‪.‬‬

‫رشحات غير متسبباوية‪ .‬فهنالببك مُ ِ‬


‫رشبحات مبنيببة على‬ ‫أن المُ ِ‬
‫المفهوم الذي عليك أن تعيه هنا هو ّ‬

‫باء على مكانهببا‬ ‫مثل‪ (:only-child :‬وأخرى ُت ِ‬


‫رشبح العناصببر بنب ً‬ ‫علقة العنصر مع غيره من العناصر ) ً‬

‫في مجموعة التغليف ) ً‬


‫مثل‪.(:eq() :‬‬

‫‪76‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫‪ .8‬تحديد العناصر عبر خاصية ‪ id‬عندما تحتوي قيمتها على محارف‬

‫خاصة‬
‫بة من المحب ببارف الخاصب ببة ) ً‬
‫مثل‪ (> = [] ~ # :‬والب ببتي‬ ‫بددات ‪ jQuery‬مجموعب ب ً‬
‫َتسب ببتعمِ ل ُمحب ب ِ‬

‫بدد ) ً‬
‫مثل‪.(id="#foo[bar]" :‬‬ ‫يجب »تهريبه ببا« )‪ (escape‬عن ببدما ُتس ببتعمَ ل كج ببزء من قيم ببة المُ ح ب ِ‬

‫من الممكن تهببريب )‪ (escape‬المحببارف بوضببع شببرطتين مببائلتين خلفيببتين قبببل المحببرف‪ .‬انظببر إلى‬

‫الشببيفرة التيببة لببترى كيببف تمكنببا من تحديببدِ عنصب ٍبر لببه الخاصببية ‪ id‬قيمتهببا ]‪ $foo[bar‬باسببتعمالنا‬

‫لشرطتين مائلتين خلفيتين )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="#foo[bar]">jQuery</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫"‪alert($('#\\#foo\\[bar\\]').text()); // "jQuery‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪77‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫جزءا من المُ ِ‬
‫حدد‪:‬‬ ‫ً‬ ‫هذه قائمة بكامل المحارف التي يجب تهريبها عندما تريد جعلها‬

‫)‬ ‫•‬ ‫'‬ ‫•‬ ‫‪#‬‬ ‫•‬

‫(‬ ‫•‬ ‫‪:‬‬ ‫•‬ ‫;‬ ‫•‬

‫=‬ ‫•‬ ‫"‬ ‫•‬ ‫&‬ ‫•‬

‫<‬ ‫•‬ ‫!‬ ‫•‬ ‫‪,‬‬ ‫•‬

‫|‬ ‫•‬ ‫^‬ ‫•‬ ‫‪.‬‬ ‫•‬

‫‪/‬‬ ‫•‬ ‫‪$‬‬ ‫•‬ ‫‪+‬‬ ‫•‬

‫]‬ ‫•‬ ‫*‬ ‫•‬

‫[‬ ‫•‬ ‫~‬ ‫•‬

‫الم ِ‬
‫رشحات‬ ‫‪ .9‬إنشاء سلسلة من ُ‬
‫من الممكن تجميبببببببببببببببببببببببببببع المُ ر ِشبببببببببببببببببببببببببببحات وراء بعضبببببببببببببببببببببببببببها‪ً ،‬‬
‫مثل‪a[title="jQuery"] :‬‬

‫]""=!‪ .[href^="http://"][class‬يمكن توظيببف هببذه المببيزة لتحديببد عنصببر يملببك خاصببيات‬

‫معينة ذات قيم مُ ح ّددة‪ .‬على سبيل المثال‪ ،‬شببيفرة ‪ jQuery‬التيببة سب ُبت ِ‬
‫حدد عناصببر >‪ <a‬في صببفحة‬ ‫ّ‬

‫‪ HTML‬التي‪:‬‬

‫تحتوي خاصية ‪ href‬تبدأ بالقيمة »‪«http://‬‬ ‫•‬

‫وتملك الخاصية ‪ title‬ذات القيمة »‪«jQuery‬‬ ‫•‬

‫وتملك الخاصية ‪class‬‬ ‫•‬

‫سيح ّدد عنصر >‪ <a‬وحي ٌد فقط )مثال حي(‪:‬‬


‫ُ‬

‫‪78‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

<!DOCTYPE html>
<html lang="en">
<body>
<a title="jQuery">jQuery.com</a>
<a href="http://www.jquery.com" title="jQuery"
class="foo">jQuery.com</a>
<a href="">jQuery.com</a>
<a href="http://www.jquery.com"
title="jQuery">jQuery.com</a>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫الناتج‬: "1"
alert(
$('a[title="jQuery"][href^="http://"][class!=""]')
.length);
})(jQuery);
</script>
</body>
</html>

ِ
.‫مرشحات إلى جوار بعضها لكي نستطيع تحديد هذا العنصر‬ ‫لحظ كيف وضعنا ثلثة‬

ً
:‫ على سبيل المثال‬.‫أيض ا وضع أنواع أخرى من المرشحات مع مرشحات الخاصيات‬ ‫من الممكن‬

79
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫تحديد آخر عنصر >‪ <div‬موجود في مجموعة التغليف ‪//‬‬


‫والذي يحتوي على السلسلة النصية ‪// jQuery‬‬
‫)')"‪$('div:last:contains("jQuery‬‬

‫ُختارة ‪//‬‬
‫تحديد جميع مربعات الختيار الظاهرة والم‬
‫)'‪$(':checkbox:visible:checked‬‬

‫أنك تستطيع استخدام أكثر من ُم ِ‬


‫رشح معً ا‪.‬‬ ‫الفكرة التي عليك أن تفهمها هنا هي ّ‬

‫‪ .10‬إنشاء ُم ِ‬
‫رشحات متشعبة‬
‫أيضب با إنش بباء مُ ِ‬
‫رشب بحات متش ببعبة‪ ،‬وه ببذا يس ببمح لن ببا باس ببتعمال المرش ببحات بفعالي ببة‪.‬‬ ‫ً‬ ‫من الممكن‬

‫ً‬
‫مثال عن كيفية تشعّ ب المرشحات لجراء عمليات ترشيح معقدة )مثال حي(‪:‬‬ ‫سأعطيك‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>javascript</div‬‬
‫>‪<div><span class="jQuery">jQuery</span></div‬‬
‫>‪<div>javascript</div‬‬
‫>‪<div><span class="jQuery">jQuery</span></div‬‬
‫>‪<div>javascript</div‬‬
‫>‪<div><span class="jQuery">jQuery</span></div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬

‫‪80‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫تحديد جميع عناصأر >‪ <div‬وإزالة ‪//‬‬
‫جميع العناصأر التي لها "‪// class="jQuery‬‬

‫الناتج هو سلسلة نصية ناتجة عن دمج ‪//‬‬


‫ّ‬
‫َدة ‪//‬‬
‫ُحد‬
‫محتوى كل العناصأر الم‬
‫;))(‪alert($('div:not(:has(.jQuery))').text‬‬

‫تحديد جميع عناصأر >‪ <div‬وإزالة جميع ‪//‬‬


‫ًا )العد يبدأ من ‪// (0‬‬
‫العناصأر التي ليس ترتيبها فردي‬

‫الناتج هو سلسلة نصية ناتجة عن دمج ‪//‬‬


‫ّ‬
‫َدة ‪//‬‬
‫محد‬
‫محتوى كل العناصأر الُ‬
‫;))(‪alert($('div:not(:odd)').text‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أنك تستطيع إنشاء مُ ِ‬


‫رشحات متشعبة‪.‬‬ ‫الفكرة الساسية هنا هي ّ‬

‫مثل‪:‬‬ ‫أيضا إنشاء مُ ِ‬


‫رشحات متشعبة عبر الدالة ‪ً ،filter‬‬ ‫ً‬ ‫يمكنك‬
‫ملحاظة‬
‫)')‪.$('p').filter(':not(:first):not(:last‬‬

‫‪81‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫المرشح )(‪:nth-child‬‬
‫‪ .11‬التعرف على استعمالت ُ‬
‫مثل أن ُتحب ب ِ‬
‫بدد عب بببره العنصر‬ ‫ِ‬
‫المرش ب بح )(‪ :nth-child‬لب ببه العديب ببد من السب ببتعمالت‪ ،‬فيمكنب ببك ً‬

‫>‪ <li‬ال ببذي ترتيب ببه ه ببو الث ببالث والموج ببود ض ببمن عنص ببر >‪ .<ul‬تفحص الش ببيفرة التي ببة لكي تفهم‬

‫كيفية استخدام المُ رشح )(‪) :nth-child‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<ul‬‬
‫>‪<li>1</li‬‬
‫>‪<li>2</li‬‬
‫>‪<li>3</li‬‬
‫>‪<li>4</li‬‬
‫>‪<li>5</li‬‬
‫>‪<li>6</li‬‬
‫>‪<li>7</li‬‬
‫>‪<li>8</li‬‬
‫>‪<li>9</li‬‬
‫>‪<li>10</li‬‬
‫>‪</ul‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬

‫‪82‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫)‪(function($‬‬
‫{‬
‫َ الدالة )(‪ text‬تجمع محتويات جميع العناصأر ‪//‬‬
‫ّ‬
‫تذكر أن‬
‫الموجودة في مجموعة التغليف في سلسلة نصية واحدة ‪//‬‬

‫عبر الفهرس ‪//‬‬


‫"‪: "1‬الناتج ‪//‬‬
‫;))(‪alert($('li:nth-child(1)').text‬‬

‫التي ترتيبها زوجي ‪//‬‬


‫"‪: "246810‬الناتج ‪//‬‬
‫;))(‪alert($('li:nth-child(even)').text‬‬

‫التي ترتيبها فردي ‪//‬‬


‫"‪: "13579‬الناتج ‪//‬‬
‫;))(‪alert($('li:nth-child(odd)').text‬‬

‫عبر معادلة رياضية ‪//‬‬


‫"‪: "369‬الناتج ‪//‬‬
‫;))(‪alert($('li:nth-child(3n)').text‬‬

‫ُرشح يبدأ العد فيه من ‪// 1‬‬


‫َ هذا الم‬
‫ّ‬
‫تذكر أن‬
‫ل يوجد ناتج‪ ،‬لعدم وجود الفهرس ‪// 0‬‬
‫;))(‪alert($('li:nth-child(0)').text‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬

‫‪83‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .12‬تحديد العناصر عبر البحث في قيم الخاصيات باستخدام التعابير‬

‫النمطية‬
‫ِ‬
‫فجرب‬ ‫أن مُ ِ‬
‫رشحات الخاصيات في ‪ jQuery‬لتحديد العناصر غيرُ كافيةٍ بالنسبة لك‪،‬‬ ‫عندما تجد ّ‬

‫ً‬
‫إضبببافة إلى‬ ‫حينهبببا اسبببتخدام التعبببابير النمطيبببة ) ‪َ .(regular expressions‬كت َ‬
‫َب ‪James Padolsey‬‬

‫ً‬
‫مثال عنهببا‬ ‫ُ‬
‫وضعت‬ ‫ُم ِ‬
‫حددات المُ رشحات للسماح لنا بإنشاء تعابير نمطية مخصصة لترشيح العناصر‪.‬‬

‫ً‬
‫أيضا في ‪ james.padolsey.com‬للتفاصيل )مثال حي(‪:‬‬ ‫هنا‪ ،‬لكن انظر‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="123"></div‬‬
‫>‪<div id="oneTwoThree"></div‬‬
‫>‪<div id="0"></div‬‬
‫>"‪<div id="zero‬‬
‫>‪</body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬

‫‪84‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

(function($)
{
//James Padolsey filter extension
jQuery.expr[':'].regex = function(elem, index, match)
{
var matchParams = match[3].split(','),
validLabels = /^(data|css):/,
attr = {
method: matchParams[0].match(validLabels) ?
matchParams[0].split(':')[0] : 'attr',
property:
matchParams.shift().replace(validLabels, '')
},
regexFlags = 'ig',
regex = new
RegExp(matchParams.join('').replace(/^\s+|\s+$/g, ''),
regexFlags);
return regex.test(jQuery(elem)[attr.method]
(attr.property));
}

// ‫< التي‬div> ‫تحديد جميع عناصأر‬


// id ‫تتواجد فيها أرقام في خاصأية‬
alert($('div:regex(id,[0-9])').length); // ‫الناتج‬: "2"

// ‫< التي تتواجد فيها‬div> ‫تحديد جميع عناصأر‬

85
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫السلسلة النصية ‪ Two‬في خاصأية ‪// id‬‬


‫"‪: "1‬الناتج ‪alert($('div:regex(id, Two)').length); //‬‬
‫;)‪})(jQuery‬‬

‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .13‬الفرق بين تحديد الولد المباشرين وبين تحديد البناء‬

‫والحافاد‬
‫يمكن تحديببد البنبباء المباشببرين فقببط ) ‪ (direct children‬باسببتخدام الرمببز > أو عبببر اسببتخدام‬

‫الدال ببة )(‪ .children‬أم ببا جمي ببع الحف بباد )أو العناص ببر »الس ببليلة« ]‪ ([descendants‬يمكن أن ُتحبب ّدد‬

‫ِ‬
‫يوضب ب بح م ب ببا س ب بببق‬ ‫عببببببر اسبببببتخدام التعببببببير *‪ّ .‬‬
‫تأكد ّ‬
‫أن ك تفهم الف ب ببرق بينهم ب ببا تمامًب ب ب ا‪ .‬المثبببببال التي‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div‬‬
‫>‪<p><strong><span>text</span></strong></p‬‬
‫>‪<p><strong><span>text</span></strong></p‬‬
‫>‪</div‬‬
‫‪<script‬‬

‫‪86‬‬
jQuery ‫تعلم‬ jQuery ‫ تحديد العناصر في‬:‫الفصل الثاني‬

src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫َ هنالك ابنين اثنين‬
ّ
‫" لن‬2" ‫ِج‬
‫ُنت‬
‫كل تعبير برمجي سي‬
// <div> ‫< داخل‬p> ‫َين هما العنصرين‬
‫مباشر‬
alert($('div').children().length);

// ‫أو‬
// alert($('>*', 'div').length);
// alert($('div').find('>*').length);

// ‫َ هنالك ستة أحفاد‬


ّ
‫" لن‬6" ‫ِج‬
‫ُنت‬
‫كل تعبير برمجي سي‬
// (‫)أي أبناء مباشرين وغير مباشرين‬
// (text node) ‫دون احتساب العقد النصية‬
alert($('div').find('*').length);

// ‫أو‬
// alert($('*', 'div').length);
})(jQuery);
</script>
</body>
</html>

87
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫حدد السياق‬
‫‪ .14‬تحديد الولد المباشرين عندما ُي ّ‬
‫سببياق )‪ (context‬يسبببقه لتحديببد الولد المباشببرين عنببدما‬
‫ٍ‬ ‫من الممكن اسببتخدام الرمببز > دون‬

‫أن الكلم السببابق غببامض‪ ،‬لببذا أنصببحك بتفحص الشببيفرة التيببة لفهم مببا‬ ‫ُ‬ ‫نب ِ‬
‫بوفر السببياق مسب ً‬
‫أعلم ّ‬ ‫ببقا‪.‬‬

‫أقصد )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>"‪<ul id="firstUL‬‬
‫>‪<li>text</li‬‬
‫>‪<li‬‬
‫>"‪<ul id="secondUL‬‬
‫>‪<li>text</li‬‬
‫>‪<li>text</li‬‬
‫>‪</ul‬‬
‫>‪</li‬‬
‫>‪<li>text</li‬‬
‫>‪</ul‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬

‫‪88‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني‪ :‬تحديد العناصر في ‪jQuery‬‬

‫ّل ‪//‬‬ ‫تحديد عناصأر >‪ <li‬التي ت‬


‫ُمث‬
‫ِ‬
‫ً لسياق التحديد ‪//‬‬ ‫أبناً‬
‫ء مباشرة‬
‫الناتج "‪// "3‬‬
‫;)‪alert($('ul:first').find('> li').length‬‬

‫كان يمكن في السابق استخدام هذا التعبير ‪//‬‬


‫ً‬
‫مهمل ‪//‬‬ ‫لكنه أصأبح‬
‫;)‪// alert($('> li', 'ul:first').length‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أنه يمكن أن يُ ستخ َدم '‪ '> element‬كتعبير عندما ُن ِ‬


‫حدد سياق البحث‪.‬‬ ‫الفكرة الساسية هي ّ‬

‫‪89‬‬
‫الفصل الثالث‪:‬‬

‫التنقل في شجرة ‪DOM‬‬

‫‪3‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫‪ .1‬الفرق بين الدالتين )(‪ find‬و )(‪filter‬‬


‫ُتستخ َدم الدالة )(‪ filter‬لترشببيح المجموعببة الحاليببة من العناصببر الموجببودة ضببمن مجموعببة‬

‫التغليببف‪ .‬ويجب أن تسببتعملها عنببدما تريببد ترشببيح مجموعببة من العناصببر تم تحديببدها سب ً‬


‫بابقا‪ .‬على‬

‫ست ِ‬
‫رشب بح عناص ببر >‪ <p‬الثلث ببة الموج ببودة ض ببمن مجموع ببة التغليف‬ ‫س بببيل المث ببال‪ ،‬الش ببيفرة التي ببة ُ‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<p><strong>first</strong></p‬‬
‫>‪<p>middle</p‬‬
‫>‪<p><strong>last</strong></p‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الناتج ‪ ،middle‬وذلك بعد ترشيح أول وآخر عنصر ‪//‬‬
‫>‪ <p‬موجود ضمن مجموعة التغليف ‪//‬‬
‫(‪alert‬‬
‫)(‪$('p').filter(':not(:first):not(:last)').text‬‬
‫;)‬

‫‪91‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫عند استخدامك للدالة )(‪ filter‬فاسأل نفسك إن كان استخدامها ضروريً ا‬


‫ً‬
‫فعل‪ .‬على سبيل المثال يمكن إعادة كتابة العبارة البرمجية‬

‫)')‪ $('p').filter(':not(:first):not(:last‬دون استخدام الدالة‬ ‫ملحاظة‬


‫)(‪ filter‬بتمرير مُ ِ‬
‫حددات خاصة كتعبير تحديد للدالة ‪ jQuery‬كالتالي ‪$‬‬
‫)')‪.('p:not(:first):not(:last‬‬

‫حالي ا‪.‬‬
‫ًب‬ ‫ُ‬
‫فستستخ َدم للعثور على »أحفبباد« )‪ (descendants‬العناصببر المُ ح ب ّددة‬ ‫أما الدالة )(‪find‬‬

‫أن الدالة )(‪ find‬ستؤدي إلى تحديث أو تغيببير مجموعببة التغليببف الحاليببة لكي تحتببوي على‬
‫تخيل ّ‬

‫عناصببرَ جديببدةٍ كببانت متواجب ً‬


‫بدة ضببمن العناصببر المُ حب ّددة مسب ً‬
‫ببقا‪ .‬على سبببيل المثببال‪ ،‬الشببيفرة التيببة‬

‫ستؤدي إلى تغيير مجموعة التغليف من عناصر >‪ <p‬إلى عنصببرَ ي >‪ <strong‬عبببر اسببتخدام الدالببة‬

‫)(‪) find‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<p><strong>first</strong></p‬‬
‫>‪<p>middle</p‬‬
‫>‪<p><strong>last</strong></p‬‬

‫‪92‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫"‪: "strong‬الناتج ‪//‬‬
‫;)‪alert($('p').find('strong').get(0).nodeName‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ً‬
‫مسبقا في مجموعة التغليف مع‬ ‫يمكنك في الواقع أن تدمج العناصر الموجودة‬

‫العناصر الجديدة المُ ح ّددة عبر استخدام الدالة )(‪ find‬وذلك باستخدام الدالة‬ ‫ملحاظة‬
‫)(‪ ،addBack‬مثال‪. $('p').find('strong').addBack() :‬‬

‫حالي ا‬
‫ًب‬ ‫أن الدالة )(‪ filter‬تؤدي إلى تقليل عببدد )أو ترشببيح( العناصببر المُ حب ّددة‬
‫الفكرة هنا هي ّ‬

‫في مجموعة التغليف بينما الدالة )(‪ُ find‬‬


‫ست ِ‬
‫نشئ مجموعة تغليف جديدة‪.‬‬

‫الدالتان )(‪ find‬و )(‪ filter‬هما دالتان هادمتان )‪ (destructive‬واللتان‬

‫يمكن إبطال تأثيرهما باستخدام )(‪ end‬والتي ُ‬


‫ستعيد مجموعة التغليف إلى‬ ‫ملحاظة‬
‫حالتها السابقة قبل استخدام )(‪ find‬أو )(‪.filter‬‬

‫‪93‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫‪ .2‬تمرير دالة إلى )(‪ً filter‬‬


‫بدل من تعبير‬
‫مخصص با لتحديببد العناصببر‪ ،‬فمن المنطقي والسببهل أن‬
‫ً‬ ‫نش بئ مُ ِ‬
‫رش ب ًح ا‬ ‫قبببل أن تجببري مسببرعً ا ُ‬
‫وت ِ‬

‫معين على كل عنصر موجود في‬


‫ّ‬ ‫ً‬
‫دالة إلى )(‪ filter‬والتي ستسمح لك باختبار تحقيق شرط‬ ‫ُت ِ‬
‫مرر‬

‫مجموعة التغليف‪.‬‬

‫على سبببيل المثببال لنقببل أننببا نريببد وضببع جميببع عناصببر >‪ <img‬في صببفحة ‪ HTML‬ضببمن عنصر‬

‫>‪ <p‬في حال لم يكن عنصر >‪ <img‬موجو ًدا من البداية ضمن عنصر >‪.<p‬‬

‫يمكنك إنشاء ُم ِ‬
‫رشح مخصص لتمام هذه المهمة أو يمكنك استخدام الدالببة )(‪ filter‬بتمريببر‬

‫دالة إليها والتي سب ُبت ِ‬


‫حدد إن كببان العنصببر الب )‪ (parent‬هببو العنصببر >‪ ،<p‬فببإذا تحقببق ذلببك فسب ُبيزال‬

‫هببذا العنصببر من المجموعببة‪ ،‬ومن ثم ستوضببع جميببع عناصببر >‪ <img‬المتبقيببة في مجموعببة التغليببف‬

‫ضمن عناصر >‪.<p‬‬

‫ً‬
‫دالة‬ ‫ست ِ‬
‫حدد كل عناصر >‪ <img‬في صفحة ‪ ،HTML‬ومن ثم سأمرر‬ ‫كتبت الشيفرة التالية والتي ُ‬
‫ُ‬

‫ستسب ب َ‬
‫بتخ دم للمب ببرور على كبببل عنصبببر من العناصبببر الموجب ببودة في مجموعبببة‬ ‫إلى )(‪ filter‬والبببتي ُ‬

‫التغليببببببف )باسببببببتخدام ‪ (this‬وسببببببتختبر إذا كببببببان العنصببببببر الب لكببببببل عنصببببببر >‪ <img‬هببببببو >‪<p‬‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<img /‬‬
‫>‪<img /‬‬

‫‪94‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫>‪<p><img /></p‬‬
‫>‪<img /‬‬
‫>‪<p><img /></p‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫‪$('img').attr('src',‬‬
‫‪'http://static.jquery.com/files/rocker/images/logo_jquery_215‬‬
‫)'‪x53.gif‬‬
‫(‪.filter‬‬
‫}‪function(){return !$(this).parent('p').length == 1‬‬
‫;)'>‪).wrap('<p></p‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ُ‬
‫استعملت المعامل ! لتغيير القيمة المنطقية من ‪ true‬إلى ‪ .false‬وهذا لنني أريد‬ ‫لحظ كيف‬

‫حببذف عناصببر >‪ <img‬والببتي يكببون العنصببر >‪ <p‬هببو العنصببر الب لهببا من المجموعببة‪ .‬الدالببة الببتي‬

‫َ‬
‫القيمة ‪.false‬‬ ‫ُ‬
‫الدالة‬ ‫ُمرّ ُ‬
‫رتها إلى )(‪ filter‬ستحذف العناصر من المجموعة إن أعادت‬

‫ِ‬
‫بص‬ ‫كنت تتعام ببل م ببع حال ببةٍ وحي ببدةٍ فق ببط‪ ،‬فإنش بباء ُمرشبب ٍ‬
‫ح مخص ب ٍ‬ ‫َ‬ ‫الفك ببرة الساس ببية هن ببا هي إذا‬

‫ً‬
‫مضيعة للوقت‪ ،‬وتستطيع تحقيق‬ ‫) ً‬
‫مثل‪ (:findImgWithNoP :‬لتطبيقه على حالةٍ وحيدةٍ قد يكون‬

‫‪95‬‬
jQuery ‫تعلم‬ DOM ‫ التنقل في شجرة‬:‫الفصل الثالث‬

‫تخي ل‬
‫ّب‬ ٌ
،‫مفيدة جب ًدا‬ ٌ
‫طريقة‬ ‫ الطريقة التي شرحناها هنا هي‬.filter() ‫الهدف نفسه بتمرير دالة إلى‬

filter() ‫( في دال ببة‬regular expressions ) ‫م ببا نس ببتطيع فعل ببه عن ببدما نس ببتخدم التع ببابير النمطي ببة‬

:(‫)مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<ul>
<li>jQuery is great.</li>
<li>Its lightweight.</li>
<li>Its free!</li>
<li>jQuery makes everything simple</li>
</ul>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
ّ‫< حول أ‬strong> ‫وضع عنصر‬
// ‫ي نص موجود ضمن‬
// jQuery ‫< والذي يحتوي على الكلمة‬li> ‫عنصر‬
var pattern = /jQuery/i;
$('ul li').filter(function()
{
return pattern.test($(this).text());

96
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫;)'>‪}).wrap('<strong></strong‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .3‬التنقل في شجرة ‪DOM‬‬


‫يمكنببببببك ببسبببببباطة »النتقببببببال إلى العلى« في شببببببجرة ‪ DOM‬باسببببببتخدام الببببببدوال )(‪parent‬‬

‫و )(‪ parents‬و )(‪ .closest‬من المهم أن تفهم الفروقببببببات بين هببببببذه الببببببدوال‪ .‬تفحص الشببببببيفرة‬

‫التية لكي تفهم ما هو الفرق بين دوال التنقل في ‪) jQuery‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>"‪<div id="parent2‬‬
‫>"‪<div id="parent1‬‬
‫>"‪<div id="parent0‬‬
‫>‪<div id="start"></div‬‬
‫>‪</div‬‬
‫>‪</div‬‬
‫>‪<div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬

‫‪97‬‬
jQuery ‫تعلم‬ DOM ‫ التنقل في شجرة‬:‫الفصل الثالث‬

<script>
(function($)
{
// ‫الناتج‬: "parent0" x4
alert($('#start').parent().attr('id'));
alert(
$('#start').parents('#parent0').attr('id'));
alert($('#start').parents()[0].id);
alert(
$('#start').closest('#parent0').attr('id'));

// ‫الناتج‬: "parent1" x4
alert($('#start').parent().parent().attr('id'));
alert(
$('#start').parents('#parent1').attr('id'));
alert($('#start').parents()[1].id);
alert(
$('#start').closest('#parent1').attr('id'));

// ‫الناتج‬: "parent2" x4
alert(
$('#start').parent().parent().parent()
.attr('id')
);
alert(
$('#start').parents('#parent2').attr('id'));

98
‫تعلم ‪jQuery‬‬ ‫الفصل الثالث‪ :‬التنقل في شجرة ‪DOM‬‬

‫;)‪alert($('#start').parents()[2].id‬‬
‫(‪alert‬‬
‫;))'‪$('#start').closest('#parent2').attr('id‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أن الدالة‬
‫أن )(‪ closest‬و )(‪ parents‬لهما نفس الوظيفة‪ ،‬إل ّ‬
‫‪ -‬ربما يبدو لك ّ‬
‫ست ِ‬
‫ضمن العنصر الحالي المُ ح ّدد في عملية الترشيح )أي تستطيع‬ ‫)(‪ُ closest‬‬
‫تحديد العنصر الحالي فيها لو ّ‬
‫نف َ‬
‫ذت )'‪،$('#start').closest('#start‬‬

‫لكنك ل تستطيع فعل ذلك مع )(‪.parents‬‬


‫ملحاظات‬
‫ً‬
‫طابقة‪ ،‬بينما )(‪parents‬‬ ‫‪ -‬تتوقف )(‪ closest‬عن البحث عندما تجد مُ‬

‫بناء على التعبير الذي‬


‫ً‬ ‫فستحصل على جميع العناصر »الباء« ثم ُت ِ‬
‫رشحها‬

‫عنصر‬
‫ٍ‬ ‫مرّ َ‬
‫رته إليها‪ .‬وبالتالي لن تتمكن الدالة )(‪ closest‬من إعادة أكثر من‬

‫وحيدٍ فقط‪.‬‬

‫‪ .4‬دوال التنقل تقبل تمرير تعبيرات ‪ CSS‬كوسائط اختيارية‬


‫ً‬
‫أيض با تمريرهببا إلى‬ ‫ل ُتمببرّ ر تعببابير ‪ CSS‬إلى دالببة ‪ jQuery‬لتحديببد العناصببر فحسببب‪ ،‬وإنمببا يمكن‬

‫ِ‬
‫عدة دوال للتنقل في شجرة ‪ .DOM‬ربما يسهل علينببا نسببيان ذلببك لوجببود عببدد كبببير من دوال التنقببل‬

‫مطلقا ) ً‬
‫مثل‪.(next() :‬‬ ‫ً‬ ‫دون أن نحتاج إلى استخدام التعابير‬

‫‪99‬‬
jQuery ‫تعلم‬ DOM ‫ التنقل في شجرة‬:‫الفصل الثالث‬

.‫أنك تستطيع فعل ذلك‬ ّ


ّ ‫تذكر‬ ‫ لكن‬،‫اختياري‬
ٌ ٌ‫تمرير التعبيرات إلى دوال التنقل هو أمر‬

prev('expression') • children('expression') •

prevAll('expression') • next('expression') •

siblings('expression') • nextAll('expression') •

closest('expression') • parent('expression') •

parents('expression') •

100
‫الفصل الرابع‪:‬‬

‫تعديل شيفرات ‪HTML‬‬

‫‪4‬‬
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

‫ أثناء التنفيذ‬HTML ‫ إنشاء وإضافة وتعديل‬.1


‫ إلى‬HTML ‫ أثنبباء التنفيببذ عبببر تمريببر سلسببلة نصببية فيهببا شببيفرة‬HTML ‫يمكنببك إنشبباء شببيفرات‬

:(‫ )مثال حي‬jQuery ‫دالة‬

<!DOCTYPE html>
<html lang="en">
<body>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// "DIV" :‫الناتج‬
alert($('<div><a></a></div>').get(0).nodeName);
// ‫ وحيد‬div ‫ أي هنالك عنصر‬،"1" :‫الناتج‬
alert($('<div><a></a></div>').length);
// div ‫َي‬
‫ أي هنالك عنصر‬،"2" :‫الناتج‬
alert(
$('<div><a></a></div><div><a></a></div>').length);
})(jQuery);
</script>
</body>
</html>

102
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫ُ‬
‫فستضببباف العناصبببر‬ ‫من المهم أن تلحبببظ ّ‬
‫أنه عنبببد إنشببباء بُبببنى ‪ DOM‬باسبببتخدام دالبببة ‪،jQuery‬‬

‫ً‬
‫فمثل في الشببيفرة السببابقة‪ ،‬سببتتواجد عناصببر >‪ <div‬فقببط‬ ‫الرئيسببية فقببط إلى مجموعببة التغليببف‪.‬‬

‫في مجموعة التغليف‪.‬‬

‫يمكنك استخدام الدالة )(‪ find‬للتعامل مع أيّ ة عناصر في بنية ‪ HTML‬بعد إنشائها‪.‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)'‪$('<div><a></a></div>').find('a').text('jQuery‬‬
‫;)'‪.attr('href', 'http://www.jquery.com‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫بعببد النتهبباء من التعامببل مببع شببيفرة ‪ HTML‬الجديببدة‪ ،‬فسببنتمكن من إضببافتها إلى شببجرة ‪DOM‬‬

‫عبببببر اسببببتخدام إحببببدى دوال ‪ .jQuery‬سنسببببتخدم في المثببببال التي الدالببببة )(‪ appendTo‬لضببببافة‬

‫الشيفرة إلى الصفحة )مثال حي(‪:‬‬

‫‪103‬‬
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

<!DOCTYPE html>
<html lang="en">
<body>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('<div><a></a></div>')
.find('a')
.text('jQuery')
.attr('href', 'http://www.jquery.com')
.end().appendTo('body');
// find() ‫ للخروج من الدالة‬end() ‫استخدمنا‬
})(jQuery);
</script>
</body>
</html>

ً ) ‫ العناصر البسيطة التي ل تحتوي على خاصيات‬-


:‫مثل‬
َ ‫( ُت‬$('<div></div>')
‫ بينما‬document.createElement ‫نشأ عبر الدالة‬

ُ
‫ تستطيع‬،‫ وفي الواقع‬.‫ في بقية الحالت‬innerHTML ‫ستستعمَ ل الخاصية‬ ‫ملحاظات‬
َ ُ‫تمرير عنصر م‬
jQuery ‫ إلى دالة‬document.createElement ‫نشأ عبر‬

.($(document.createElement('div')) :‫)مثال‬

104
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫‪ -‬سلسلة ‪ HTML‬النصية المُ ِ‬


‫مررة إلى دالة ‪ jQuery‬ل يمكن أن تحتوي على‬

‫عناصر ل يُ سمَ ح بأن يحتويها العنصر >‪.<div‬‬

‫ً‬
‫مكتوبة‬ ‫‪ -‬سلسلة ‪ HTML‬النصية المُ ِ‬
‫مررة إلى دالة ‪ jQuery‬يجب أن تكون‬

‫بطريقةٍ سليمةٍ تمامً ا‪.‬‬

‫ً‬
‫نصية فيها‬ ‫ً‬
‫سلسلة‬ ‫مرر‬ ‫وت َ‬
‫غلق جميع عناصر ‪ HTML‬عندما ُت ِ‬ ‫‪ -‬يجب أن ُتفتَح ُ‬

‫وخصوصا‬
‫ً‬ ‫‪ HTML‬إلى دالة ‪ .jQuery‬إن لم تفعل ذلك فقد تتسبب بحدوث علل‬

‫في متصفح ‪ .IE‬أغلق جميع عناصر ‪ HTML‬دومً ا ول تستخدم الوسوم‬


‫المختصرة ) ً‬
‫مثل‪.(<div /> :‬‬

‫‪ .2‬فهم آلية عمل الدالة )(‪index‬‬


‫من الممكن تحديد فهرس أحد العناصببر داخببل مجموعببة التغليببف بتمريببر ذاك العنصببر إلى الدالببة‬

‫أن لديك مجموعة تغليف تحتوي على جميع عناصببر >‪ <div‬الموجببودة في‬ ‫)(‪ .index‬افترض ً‬
‫مثل ّ‬

‫صفحة ويب وتريد أن تعرف فهرس آخر عنصر >‪ <div‬فيها )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>0</div‬‬
‫>‪<div>1</div‬‬
‫>‪<div>2</div‬‬
‫>‪<div>3</div‬‬
‫‪<script‬‬

‫‪105‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫"‪: "3‬الناتج ‪//‬‬
‫;)))'‪alert($('div').index($('div:last‬‬

‫ً‬
‫قليل في إصأدار ‪// 1.3.3‬‬ ‫ّرت آلية عمل )(‪index‬‬
‫تغي‬
‫أصأبح الن بإمكاننا استخدام هذه الشيفرة ‪//‬‬
‫)(‪// $('div:last').index‬‬
‫لعادة القيمة ‪ 3‬في هذا المثال‪// .‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫لن تفهم اسببتخدام )(‪ index‬تمامً ب ا حببتى تببرى كيببف يمكن اسببتخدامها مببع الحببداث )‪.(events‬‬

‫ً‬
‫فمثل‪ ،‬عند النقر على عناصر >‪ <div‬الموجببودة في الصببفحة فسب ُن ِ‬
‫مرر العنصببر >‪ <div‬الببذي تم النقببر‬

‫عليه )باستخدام الكلمة المحجوزة ‪ (this‬إلى الدالة )(‪ index‬لتحديد فهرسه )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>"‪<div id="nav‬‬

‫‪106‬‬
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

<div>nav text</div>
<div>nav text</div>
<div>nav text</div>
<div>nav text</div>
<div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫ِطَ عليه من بين‬
‫ الذي ضُغ‬div ‫إظهار ترتيب عنصر‬
// ‫ الموجودة في مجموعة التغليف‬div ‫جميع عناصأر‬
$('#nav div').click(function()
{
alert($('#nav div').index(this));

// ‫أو يمكنك استخدام هذه الخدعة الجميلة‬


// alert($(this).prevAll().length);
});
})(jQuery);
</script>
</body>
</html>

107
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫‪ .3‬فهم طريقة عمل الدالة )(‪text‬‬


‫ستعيد العقدة النصية )‪ (text node‬لول عنصر في‬ ‫خط ًئا ّ‬
‫أن الدالة )(‪ُ text‬‬ ‫ِ‬ ‫قد يفترض أحدنا مُ‬

‫مجموعب ببة التغليب ببف؛ وإنمب ببا سب ببتجمع محتب ببوى جميب ببع العقبببد النصبببية لجميبببع العناصبببر الموجبببودة في‬

‫َ‬
‫فهمت هببذه الفكببرة وإل‬ ‫أنك قد‬ ‫وت عيد القيمة النهائية كسلسلةٍ نصيةٍ وحيدة‪ّ .‬‬
‫تأكد ّ‬ ‫مجموعة التغليف ُ‬

‫فقد تحصل على نتائج غير متوقعة عند استخدامها )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>1,</div‬‬
‫>‪<div>2,</div‬‬
‫>‪<div>3,</div‬‬
‫>‪<div>4</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫"‪: "1,2,3,4‬الناتج ‪alert($('div').text()); //‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪108‬‬
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

‫ تبديل أو إزالة المحارف باستخدام التعابير النمطية‬.4


–jQuery ‫ –مع اسببتعمال دوال مكتبببة‬JavaScript ‫ الموجودة في‬replace() ‫باستخدامنا للدالة‬

‫بط من المحببارف موجببودٍ في النص المحتببوى ضببمن‬


ٍ ‫أي نمب‬ ّ
ُ ‫بنتمكن بكببل سببهولة من تبببديل أو حببذف‬
‫سب‬

:(‫أحد العناصر )مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<p>
I really hate using JavaScript.
I mean really hate it!
It is the best crap ever!
</p>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

var $p = $('p');
ً
// hate ‫بدل من‬ love ‫وضع‬
$p.text($p.text().replace(/hate/ig, 'love'));

109
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫حذف ‪ crap‬وعدم وضع أي شيء مكانها ‪//‬‬


‫;))'' ‪$p.text($p.text().replace(/crap/ig,‬‬

‫ً ‪//‬‬
‫ً نصية‬ ‫َ الدالة )(‪ replace‬ت‬
‫ُعيد سلسلة‬ ‫ّ‬
‫ِ في بالك أن‬
‫أبق‬
‫ول تعيد كائن ‪ ،jQuery‬وهذا هو السبب وراء ‪//‬‬
‫وضع الدالة )(‪ replace‬بعد الدالة )(‪// text‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ً‬
‫أيضا تحديث أيّ ة محارف موجودة ضمن سلسلة نصية ُمعببادة من الدالببة )(‪ ،html‬وهببذا‬ ‫يمكنك‬

‫ً‬
‫أيض ب ب با تحبببببديث واسب ب ببتبدال عناصب ب ببر ‪ DOM‬عب ب بببر‬ ‫يعبببببني ّ‬
‫أنك تسب ب ببتطيع تحب ب ببديث النص‪ ،‬وتسب ب ببتطيع‬

‫التعابير النمطية‪.‬‬

‫‪ .5‬شرح كيفية عمل الدالة )(‪contents‬‬


‫يمكن أن ُتسببتخ َدم الدالببة )(‪ .contents‬للعثببور على عقببد )‪ (nodes‬جميببع العناصببر البنبباء‪ ،‬بمببا‬

‫في ذلبببك العقبببد النصبببية )‪ (text node‬الموجبببودة داخبببل العنصبببر‪ .‬لكن انتببببه‪ ،‬إن كبببانت المحتويبببات‬

‫نصي ة فقط فسيوضع النبباتج داخببل مجموعببة التغليببف كعقببدة نصببية‬


‫ّ‬ ‫الناتجة عن هذه الدالة هي عقد‬

‫وحيدة‪ .‬لكن إن كانت المحتويببات تحتببوي على عنصببر أو أكببثر بالضببافة إلى العقببد النصببية‪ ،‬فسب ُبتعيد‬

‫الدال ببة )(‪ .contents‬العق ببد النص ببية وعق ببد العناص ببر معًب ب ا‪ .‬امعن النظ ببر في الش ببيفرة الس ببابقة لتفهم‬

‫الشرح السابق )مثال حي(‪:‬‬

‫‪110‬‬
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

<!DOCTYPE html>
<html lang="en">
<body>
<p>I love using jQuery!</p>
<p>I love <strong>really</strong> using jQuery!</p>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// HTML ‫" لعدم وجود عناصأر‬I love using jQuery!" ‫ينتج‬
alert($('p:first').contents().get(0).nodeValue);
// "I love" :‫الناتج‬
alert($('p:last').contents().get(0).nodeValue);
// ‫ وليس عقدة نصية‬HTML ‫" لكنه عنصر‬really" :‫الناتج‬
alert($('p:last').contents().eq(1).text());
// "using jQuery!" :‫الناتج‬
alert($('p:last').contents().get(2).nodeValue);
})(jQuery);
</script>
</body>
</html>

ً ‫بدة نصب‬
‫ فعلينببا اسببتخراج المحتببوى عبببر‬،‫بية‬ ً ‫أنه إذا كببان العنصببرُ في مجموعببة التغليببف عقب‬
ّ ‫لحببظ‬

..get(0).nodeValue

111
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

ٌ ‫ مفي ب‬contents() ‫الدال ببة‬


‫ ومن الممكن اس ببتخراج العق ببد‬.‫بدة عن ببد اس ببتخراج قيم العق ببد النص ببية‬

:(‫ )مثال حي‬contents() ‫ عبر استخدام‬DOM ‫النصية فقط من بُنية‬

<!DOCTYPE html>
<html lang="en">
<body>
<p>jQuery gives me
<strong>more <span>power</span></strong>
than any other web tool!
</p>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('p')
.find('*') // ‫تحديد جميع العقد‬
.addBack() // <p> ‫بما في ذلك‬
.contents() // ‫الحصول على جميع العقد البناء بما‬
// ‫في ذلك العقد النصية‬
.filter(function()
{
return this.nodeType == Node.TEXT_NODE;
}) // ‫حذف جميع العقد غير النصية‬

112
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

.each(function(i, text)
{
alert(text.nodeValue)
}); // ‫إظهار النصوص الموجودة ضمن مجموعة التغليف‬
})(jQuery);
</script>
</body>
</html>

ً ‫ حيث تعطينببا وصب‬،contents() ‫هنالببك اسببتخدامٌ آخببر للدالببة‬


‫ الموجببود‬HTML ‫بول إلى مسببتند‬

‫< والصبببفحة‬iframe> ‫ لطالمبببا كبببانت الصبببفحة الموجبببودة ضبببمن عنصبببر‬،<iframe> ‫ضبببمن عنصبببر‬

:(domain) ‫»الب« في نفس النطاق‬

<!DOCTYPE html>
<html lang="en">
<body>
<iframe src="iframe.html" height="100px"
width="100px"></iframe>
<!-- iframe ‫ محتوى عنصر‬-->
<!--
<!DOCTYPE html>
<html lang="en">
<body>
<body>
<p>Hi, I am the content inside of the iframe's body

113
jQuery ‫تعلم‬ HTML ‫ تعديل شيفرات‬:‫الفصل الرابع‬

element.</p>
</body>
</html>
-->
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

/* ‫الناتج‬: "<p>Hi, I am the content inside of the


iframe's body element.</p>" */
alert($('iframe').contents().find('body').html());
// ... jQuery ‫أو عبر تمرير »السياق« إلى الدالة‬
/* ‫الناتج‬: "<p>Hi, I am the content inside of the
iframe's body element.</p>" */
alert($('body', $('iframe').contents()).html());

})(jQuery);
</script>
</body>
</html>

114
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫حاول الكثيرون استخدام )(‪ contents‬للوصول إلى محتوى عنصر‬

‫>‪ <iframe‬ليس موجو ًدا بنفس النطاق وواجهوا مشكلة »سياسة المصدر‬
‫الواحد« )‪ّ .(same-origin policy‬‬
‫تأكد ّ‬
‫أنك تفهم محدوديات استخدام‬

‫‪ JavaScript‬وعناصر ‪ iframe‬قبل أن تحاول الوصول إلى أو تعديل محتوى‬ ‫ملحاظة‬


‫ٌ‬
‫موجودة في ‪http://code.google.com/p/jquery-‬‬ ‫ٌ‬
‫إضافة )‬ ‫‪ .iframe‬هنالك‬

‫التفافيا إذا أردت التواصل مع >‪<iframe‬‬


‫ً‬ ‫‪ (crossframe/‬التي تعطيك ً‬
‫حل‬

‫نطاق آخر‪.‬‬
‫ٍ‬ ‫موجودٍ في‬

‫‪ .6‬استخدم )(‪ remove‬لن ُيزيل العناصر من مجموعة التغليف‬


‫عنببدما تسببتخدم )(‪ remove‬لحببذف جببزء من ‪ DOM‬فببإن العناصببر الموجببودة ضببمن بُنيببة ‪DOM‬‬

‫إذا أن تحبببذف عنصبببرًا‪ ،‬ثم تجبببري‬ ‫ً‬


‫موجبببودة ضبببمن مجموعبببة التغليبببف‪ .‬يمكنبببك ً‬ ‫المحذوفبببة سبببتبقى‬

‫ً‬
‫مرة أخرى في شجرة ‪ ،DOM‬وذلك عبببر سلسببلة ‪ jQuery‬وحيببدة‬ ‫تعديلت على ذاك العنصر‪ ،‬ثم تضعه‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>remove me</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬

‫‪115‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الرابع‪ :‬تعديل شيفرات ‪HTML‬‬

‫{‬
‫=‪$('div').remove().html('<a href‬‬
‫)'>‪"http://www.jQuery.com">jQuery</a‬‬
‫;)'‪.appendTo('body‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫َ‬
‫استخدمت )(‪ remove‬لحذف العناصر من شببجرة ‪ ،DOM‬فهببذا‬ ‫الفكرة الساسية هنا هي ّ‬
‫أنك إذا‬

‫ست َ‬
‫حذف من مجموعة التغليف في ‪.jQuery‬‬ ‫أن تلك العناصر ُ‬
‫ل يعني ّ‬

‫‪116‬‬
‫الفصل الخامس‪:‬‬

‫نماذج ‪HTML‬‬

‫‪5‬‬
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

‫ تفعيل وتعطيل عناصر النموذج‬.1


disabled ‫ تعطيببل عناصببر النمبباذج عبببر ضبببط الخاصببية‬jQuery ‫نسببتطيع بسببهولة باسببتخدام‬

‫ ثم‬،‫ يمكنن ببا فع ببل ذل ببك بك ببل بس بباطة باختي ببار حق ببل إدخ ببال‬.disabled ‫لعناص ببر النم ببوذج إلى القيم ببة‬

:(‫ )مثال حي‬disabled ‫ لضبط الخاصية‬attr() ‫استخدام الدالة‬

<!DOCTYPE html>
<html lang="en">
<body>
<input name="button" type="button" id="button"
value="button" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('#button').attr('disabled', 'disabled');
})(jQuery);
</script>
</body>
</html>

118
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

ّ ُ‫لتفعيببببببل حقببببببل م‬
‫ باسببببببتخدام الدالببببببة‬disabled ‫ يمكننببببببا ببسبببببباطة حببببببذف الخاصببببببية‬، ‫عطبببببب ل‬

‫ إلى سلسب ببلةٍ نصبببيةٍ فارغبببة باسب ببتخدام‬disabled ‫ أو عب بببر ضب بببط قيمب ببة الخاصب ببية‬removeAttr()

:(‫ )مثال حي‬attr()

<!DOCTYPE html>
<html lang="en">
<body>
<input name="button" type="button" id="button"
value='button' disabled="disabled" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('#button').removeAttr('disabled');

// ‫أو‬
// $('#button').attr('disabled', '');
})(jQuery);
</script>
</body>
</html>

119
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

‫معط ًل‬
ّ ‫فع ًل أم‬
ّ ‫ كيفية تحديد إذا كان أحاد عناصر النموذج ُم‬.2
ِ ُ‫باستخدام م‬
‫ يسببهل علينببا تحديببد‬:enabled ‫ أو‬:disabled ‫ الخاصة بالنمبباذج‬jQuery ‫رشحات‬

ّ ‫ انظببر‬.(boolean ) ‫معط ًل أم مفعّ ًل بإعببادة قيمببة منطقيببة‬


‫مليا إلى‬ ّ ‫ومعرفة إذا كببان عنصببرٌ في نمب‬
‫بوذج‬
ٍ

:(‫الشيفرة التية للتوضيح )مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<input name="button" type="button" id="button1"
value="button" />
<input name="button" type="button" id="button2"
disabled="disabled" value="button" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
ً‫ُفع‬
// is ‫ّل باستخدام‬ ‫اختبار إن كان م‬
alert($('#button1').is(':enabled')); // ‫الناتج‬: true

ّ‫ُرش‬
// ‫ِح‬ ‫أو عبر استخدام م‬
alert($('#button1:enabled').length); // ‫الناتج‬: "1"

120
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

// is ‫ُعطًّل باستخدام‬
‫اختبار إن كان م‬
alert($('#button2').is(':disabled')); // "true"

ّ‫ُرش‬
// ‫ِح‬ ‫أو عبر استخدام م‬
alert($('#button2:disabled').length); // ‫الناتج‬: "1"

})(jQuery);
</script>
</body>
</html>

‫ اختيار أو عدم اختيار مربع اختيار أو مربع انتقاء‬.3


checked ‫( عبببر ضبببط خاصببية‬checkbox) ‫( أو مربببع اختيببار‬radio) ‫يمكنك اختيببار مربببع انتقباء‬

:(‫ )مثال حي‬attr() ‫ باستخدام الدالة‬true ‫إلى القيمة‬

<!DOCTYPE html>
<html lang="en">
<body>
<input name="" value="" type="checkbox" />
<input name="" value="" type="radio" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>

121
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

(function($)
{
// ‫اختيار جميع مربعات الختيار أو النتقاء‬
$('input:checkbox,input:radio')
.attr('checked', 'checked');
})(jQuery);
</script>
</body>
</html>

‫ باسببببببتخدام الدالببببببة‬checked ‫ فاحببببببذف الخاصببببببية‬،‫للغبببببباء اختيببببببار مربببببببع اختيببببببار أو انتقبببببباء‬

:(‫ إلى سلسلةٍ نصيةٍ فارغة )مثال حي‬checked ‫ أو عبر ضبط قيمة الخاصية‬removeAttr()

<!DOCTYPE html>
<html lang="en">
<body>
<input name="" type="checkbox" value=""
checked="checked">
<input name="" type="radio" value="" checked="checked">
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

122
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

$('input').removeAttr('checked');
// ‫أو‬
$('input').attr('checked', '');
})(jQuery);
</script>
</body>
</html>

‫عدة مربعات اختيار وانتقاء‬


ِ ‫ اختيار وإلغاء اختيار‬.4
ِ ‫ لختيببار عب‬jQuery ‫ في‬val() ‫يمكنك استخدام الدالببة‬
‫ وذلببك بتمريببر‬.‫بدة حقببول اختيببار وانتقبباء‬

ِ ‫مصببفوفة تحتببوي عب‬


‫ لحقببول الختيببار‬value ‫بدة سلسببل نصببية تتوافببق قيمتهببا مببع قيمببة الخاصببية‬

:(‫والنتقاء )مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<input type="radio" value="radio1">
<input type="radio" value="radio2">
<input type="checkbox" value="checkbox1">
<input type="checkbox" value="checkbox2">
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>

123
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫)‪(function($‬‬
‫{‬
‫اختيار جميع حقول الختيار والنتقاء في الصفحة ‪//‬‬
‫‪$('input:radio,input:checkbox').val(['radio1',‬‬
‫;)]'‪'radio2', 'checkbox1', 'checkbox2‬‬

‫يمكنك استخدام ما يلي للغاء اختيار جميع العناصأر ‪//‬‬


‫)'‪// $('input:radio,input:checkbox‬‬
‫‪//‬‬ ‫;)'‪.removeAttr('checked‬‬
‫أو ‪//‬‬
‫)'‪// $('input:radio,input:checkbox‬‬
‫‪//‬‬ ‫;)'' ‪.attr('checked',‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫إذا كان مربع اختيار أو انتقاء ُمختارًا من قبل‪ ،‬فلن يؤدي استخدام )(‪ val‬إلى‬
‫ملحاظة‬
‫إلغاء اختياره‪.‬‬

‫مختارا أم ل‬
‫ً‬ ‫‪ .5‬معرفة فيما إذا كان مربع اختيار أو مربع انتقاء‬
‫يمكنببك معرفببة إذا تم اختيببار أو لم يتم اختيببار مربببع اختيببار أو انتقبباء عبببر اسببتخدام المُ ِ‬
‫رش بح‬

‫عدة استخدامات للمُ ِ‬


‫رشح ‪) :checked‬مثال حي(‪:‬‬ ‫‪ .:checked‬انظر إلى الشيفرة التية لتشاهد ِ‬

‫‪124‬‬
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

<!DOCTYPE html>
<html lang="en">
<body>
<input checked="checked" type="checkbox" />
<input checked="checked" type="radio" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫الناتج‬: "true"
alert($('input:checkbox').is(':checked'));

// ‫أو إضافة العناصأر إلى مجموعة التغليف إن‬


// 1 ‫ الناتج‬.‫تم اختيارها‬
alert($('input:checkbox:checked').length);

// ‫الناتج‬: "true"
alert($('input:radio').is(':checked'));

// ‫أو إضافة العناصأر إلى مجموعة التغليف إن‬


// 1 ‫ الناتج‬.‫تم اختيارها‬
alert($('input:radio:checked').length);
})(jQuery);

125
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

</script>
</body>
</html>

‫مخفيا‬
ً ‫حاقل في النموذج‬
ٌ ‫ معرفة إذا كان‬.6
ِ ُ‫( عبببر الم‬hidden) ‫مخفي ا‬
‫ انظببر إلى‬.:hidden ‫رشبح‬ ‫ًب‬ ٌ
‫حقل ما في النموذج‬ ‫يمكنك معرفة إذا كان‬

ِ ُ‫الشيفرة التية لتعاين استخدامات مختلفة للم‬


:(‫ )مثال حي‬:hidden ‫رشح‬

<!DOCTYPE html>
<html lang="en">
<body>
<input type="hidden" />
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫الناتج‬: "true"
alert($('input').is(':hidden'));

// ‫أو إضافة العناصأر المخفية إلى مجموعة التغليف‬


// 1 ‫الناتج‬
alert($('input:hidden').length);

126
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

})(jQuery);
</script>
</body>
</html>

‫ لحقل إدخال‬value ‫ ضبط أو الحصول على قيمة الخاصية‬.7


‫ لعنصر إدخببال )أي‬value ‫ لضبط أو الحصول على قيمة الخاصية‬val() ‫يمكن استخدام الدالة‬

submit ‫ و‬reset ‫ و‬radio ‫ و‬password ‫ و‬image ‫ و‬hidden ‫ و‬checkbox ‫ و‬button ‫عببنببباصببببببر‬

‫بال‬ َ
ٍ ‫بل إدخب‬
ِ ‫ سأضبط في المثببال التي قيمببة كببل حقب‬.(… HTML5 ‫ وغير ذلك من عناصر نماذج‬text ‫و‬

:(‫ )مثال حي‬val() ‫ و‬alert() ‫ ثم سأعرضها عبر‬val() ‫باستخدام‬

<!DOCTYPE html>
<html lang="en">
<body>
<input type="button" />
<input type="checkbox" />
<input type="hidden" />
<input type="image" />
<input type="password" />
<input type="radio" />
<input type="reset" />
<input type="submit" />
<input type="text" />

127
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

$('input:button').val('I am a button')
$('input:checkbox').val('I am a checkbox')
$('input:hidden').val('I am a hidden input')
$('input:image').val('I am a image')
$('input:password').val('I am a password')
$('input:radio').val('I am a radio')
$('input:reset').val('I am a reset')
$('input:submit').val('I am a submit')
$('input:text').val('I am a text')

// value ‫إظهار قيمة الخاصأية‬


alert($('input:button').val());
alert($('input:checkbox').val());
alert($('input:hidden').val());
alert($('input:image').val());
alert($('input:password').val());
alert($('input:radio').val());
alert($('input:reset').val());
alert($('input:submit').val());

128
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫;))(‪alert($('input:text').val‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫حددة لعنصر اختيار من متعدد‬


‫الم ّ‬
‫‪ .8‬ضبط والحصول على القيمة ُ‬
‫يمكننببا تحديببد القيم المُ ختببارة باسببتخدام الدالببة )(‪ val‬في عنصببر اختيببار من متعببدد )‪multi-‬‬

‫‪ (select‬بتمرير مصفوفة إلى الدالة )(‪ val‬تحتوي على القيم النصية للخيارات الموافقة‪.‬‬

‫ً‬
‫أيض با اسببتخدام الدالببة‬ ‫وللحصببول على القيم المُ ختببارة في عنصببر اختيببار من متعببدد‪ ،‬نسببتطيع‬

‫)(‪ val‬للحصبببول على مصبببفوفة للقيم المختبببارة‪ .‬سبببتحتوي المصبببفوفة على قيم الخاصبببية ‪value‬‬

‫لجميع القيم المُ ختارة )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>"‪<select size="4" multiple="multiple‬‬
‫>‪<option value="option1">option one</option‬‬
‫>‪<option value="option2">option two</option‬‬
‫>‪<option value="option3">option three</option‬‬
‫>‪<option value="option4">option four</option‬‬
‫>‪</select‬‬

‫‪129‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫ضبط القيم المختارة ‪//‬‬
‫;)]'‪$('select').val(['option2', 'option4‬‬

‫ُختارة ‪//‬‬
‫الحصول على القيم الم‬
‫"‪: "option2, option4‬الناتج ‪//‬‬
‫;))' ‪alert($('select').val().join(',‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .9‬ضبط والحصول على النص الموجود ضمن عنصر ‪textarea‬‬


‫يمكنك ضبط محتوى العقدة النصية لعنصببر >‪ <textarea‬عبببر تمريببر سلسببلة نصببية إلى الدالببة‬

‫)(‪ُ val‬‬
‫لتسبببببتخ َد م كمحتبببببوى نصبببببي للعنصبببببر‪ .‬ولكي نحصبببببل على محتويبببببات العنصبببببر ‪textarea‬‬

‫ً‬
‫أيضا الدالة )(‪ val‬كما هو ظاهر في المثال التي )مثال حي(‪:‬‬ ‫فسنستخدم‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬

‫‪130‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫>‪<body‬‬
‫>‪<textarea></textarea‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫ضبط محتوى مربع النص ‪//‬‬
‫;)'‪$('textarea').val('I am a textarea‬‬

‫"‪: "I am a textarea‬الناتج ‪//‬‬


‫;))(‪alert($('textarea').val‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .10‬ضبط والحصول على قيمة الخاصية ‪ value‬للعنصر ‪button‬‬


‫يمكنببك ضبببط قيمببة الخاصببية ‪ value‬لعنصببر ‪ button‬بتمريببر سلسببلة نصببية إلى الدالببة )(‪.val‬‬

‫ولكي نحص ببل على قيم ببة الخاص ببية ‪ value‬التابع ببة لعنص ببر >‪ <button‬فيمكنن ببا أن نس ببتعمل الدال ببة‬

‫ً‬
‫أيضا )مثال حي(‪:‬‬ ‫)(‪val‬‬

‫‪131‬‬
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

<!DOCTYPE html>
<html lang="en">
<body>
<button>Button</button>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫ضبط العنصر إلى‬
//<button value="I am a Button Element">
$('button').val('I am a Button Element')

// ‫الناتج‬: "I am a Button Element"


alert($('button').val());
})(jQuery);
</script>
</body>
</html>

select ‫ تعديل مكونات العنصر‬.11


ِ ‫ُت‬
‫ سأشببرح‬.<select> ‫ كثببيرًا من إجببراء بعض المهببام الشببائعة عنببد تعببديل العنصببر‬jQuery ‫سهل‬

ً
.‫مثال عن الشيفرة‬ ‫فيما يلي بعض تلك المهام وسأريك‬

132
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

:‫إضافة خيارات جديدة في النهاية‬ •

$('select').append('<option value="">option</option>');

:‫إضافة خيارات جديدة إلى البداية‬ •

$('select').prepend('<option value="">option</option>');

ً ‫وضع خيارات جديدة‬


:‫بدل من القديمة‬ •

$('select').html('<option value="">option</option><option
value="">option</option>');

ِ ُ‫معين؛ ع ب بببر اس ب ببتخدام الم‬


‫ لتحدي ب ببد‬:eq() ‫رشب ب بح‬ ّ (index) ‫اس ب ببتبدال عناص ب ببر ذات فه ب ببرس‬ •

:‫ لستبدالها‬.replaceWith() ‫العناصر ثم استخدام الدالة‬

$('select option:eq(1)').replaceWith('<option
value="">option</option>');

:2 ‫ إلى العنصر ذي الفهرس‬select ‫ضبط العنصر المُ ختار في‬ •

$('select option:eq(2)').attr('selected', 'selected');

133
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫إزالة آخر خيار من الخيارات‪:‬‬ ‫•‬

‫;)(‪$('select option:last').remove‬‬

‫معينببة من عنصببر ‪ select‬عبببر ترتيبهببا في مجموعببة التغليببف باسببتخدام‬


‫ّ‬ ‫تحديببد خيببارات‬ ‫•‬

‫ُم ِ‬
‫رشحات خاصة‪:‬‬

‫;)'‪$('#select option:first‬‬
‫;)'‪$('#select option:last‬‬
‫;)')‪$('#select option:eq(3‬‬
‫;)')‪$('#select option:gt(5‬‬
‫;)')‪$('#select option:lt(3‬‬
‫;)')'‪$('#select option:not(':selected‬‬

‫الحصول على القيم النصية لجميع الخيارات المُ ختارة‪:‬‬ ‫•‬

‫;)(‪$('select option:selected').text‬‬

‫الحصببول على قيمببة الخاصببية ‪ value‬لحببد خيببارات العنصببر ‪) select‬س ب ُن ِ‬


‫حدد آخببر خيببار‬ ‫•‬

‫في مثالنا(‪:‬‬

‫;)(‪$('select option:last).val‬‬

‫أن الشببيفرة‬ ‫الحصول على فهرس العنصر المُ ختببار )الببترقيم بب ً‬


‫بدءا من الصبفر(؛ يجببدر بالببذكر ّ‬ ‫•‬

‫‪134‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الخامس‪ :‬نماذج ‪HTML‬‬

‫التية لن تعمل مع العناصر التي يمكن اختيار أكثر من خيار فيها‪:‬‬

‫;))'‪$('select option').index($('select option:selected‬‬

‫مكان معين‪:‬‬
‫ٍ‬ ‫إضافة خيار بعد‬ ‫•‬

‫‪$('select option:eq(1)').after('<option‬‬
‫;)'>‪value="">option</option‬‬

‫مكان معين‪:‬‬
‫ٍ‬ ‫إضافة خيار قبل‬ ‫•‬

‫‪$('select option:eq(3)').before('<option‬‬
‫;)'>‪value="">option</option‬‬

‫‪ .12‬تحديد حاقول النموذج عبر نوعها‬


‫مثل‪ ($('input:checkbox') :‬تب ِ‬
‫بوفر ‪jQuery‬‬ ‫من الممكن تحديببد حقببول النمبباذج عبببر نوعهببا ) ً‬

‫المُ ِ‬
‫رش حات التية المرتبطة بأنواع حقول النموذج لتحديد العناصر حسب نوعها‪.‬‬

‫‪:image‬‬ ‫•‬ ‫‪:text‬‬ ‫•‬

‫‪:reset‬‬ ‫•‬ ‫‪:password‬‬ ‫•‬

‫‪:file‬‬ ‫•‬ ‫‪:radio‬‬ ‫•‬

‫‪:button‬‬ ‫•‬ ‫‪:checkbox‬‬ ‫•‬

‫‪:submit‬‬ ‫•‬

‫‪135‬‬
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

‫ تحديد جميع عناصر النماذج‬.13


ِ ُ‫حدد هذا الم‬
‫رشبح‬ ِ ُ‫من الممكن تحديد جميع عناصر النماذج عبر استخدام الم‬
ِ ُ‫ لن ي‬.:input ‫رشح‬

<select> ‫< و‬textarea> ‫أيببببببببببببب ة عناصبببببببببببببر‬ ِ ‫بببببببببببببي‬


ّ ‫حدد‬ ُ ‫ وإنمبببببببببببببا س‬،‫ فحسبببببببببببببب‬input ‫عناصبببببببببببببر‬

ً ‫< أي‬button> ‫و‬


‫ لمجموعببببة التغليببببف في المثببببال التي عنببببد اسببببتخدام‬length ‫ لحببببظ قيمببببة‬.‫ضببببا‬

ِ ُ‫الم‬
:(‫ )مثال حي‬:input ‫رشح‬

<!DOCTYPE html>
<html lang="en">
<body>
<input type="button" value="Input Button" />
<input type="checkbox" />
<input type="file" />
<input type="hidden" />
<input type="image" />
<input type="password" />
<input type="radio" />
<input type="reset" />
<input type="submit" />
<input type="text" />
<select>
<option>Option</option>
</select>
<textarea></textarea>
<button>Button</button>
<script

136
jQuery ‫تعلم‬ HTML ‫ نماذج‬:‫الفصل الخامس‬

src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫ عنصرًا من عناصأر النماذج‬13 ‫الناتج هو‬
alert($(':input').length);
})(jQuery);
</script>
</body>
</html>

137
‫الفصل السادس‪:‬‬

‫الحاداث في ‪jQuery‬‬

‫‪6‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫مقيدين بحدث )(‪ ready‬واحاد فقط‬


‫ّ‬ ‫‪ .1‬لسنا‬
‫من المهم أن تبقي بذهنك ّ‬
‫أنه من الممكن استخدام الحدث المخصص )(‪ ready‬عَ ب َد َد مببا شب َ‬
‫بئت؛‬

‫بت مقيب ًدا بإضببافة حببدث )(‪ .ready‬وحيببد إلى المسببتند‪ .‬وسب ُبت ّ‬
‫نفذ الشببيفرات المرتبطببة بالحببدث‬ ‫ولسب َ‬

‫)(‪ ready‬بنفس ترتيب ورودها‪.‬‬

‫تمرير دالة إلى دالة ‪ً ) jQuery‬‬


‫مثل‪:‬‬
‫ٌ‬
‫مختصرة للحدث‬ ‫ٌ‬
‫طريقة‬ ‫)}‪ (jQuery(function(){//code here‬هي‬ ‫ملحاظة‬
‫)(‪) ready‬أي )(‪.(jQuery(document).ready‬‬

‫‪ .2‬إضافة أو إزالة الحاداث باستخدام )(‪ on‬و )(‪of‬‬


‫باسببببتخدام الدالببببة )(‪ً ) on‬‬
‫مثل‪ (jQuery('a').on('click', function(){}) :‬يمكننببببا‬

‫أي من معالجات الحداث القياسية )‪ (standard handlers‬إلى عناصر ‪ DOM‬الملئمة‪.‬‬


‫إضافة ّ‬

‫‪mousedown‬‬ ‫•‬ ‫‪blur‬‬ ‫•‬

‫‪mouseup‬‬ ‫•‬ ‫‪focus‬‬ ‫•‬

‫‪mousemove‬‬ ‫•‬ ‫‪load‬‬ ‫•‬

‫‪mouseover‬‬ ‫•‬ ‫‪resize‬‬ ‫•‬

‫‪mouseout‬‬ ‫•‬ ‫‪scroll‬‬ ‫•‬

‫‪change‬‬ ‫•‬ ‫‪unload‬‬ ‫•‬

‫‪select‬‬ ‫•‬ ‫‪beforeunload‬‬ ‫•‬

‫‪submit‬‬ ‫•‬ ‫‪click‬‬ ‫•‬

‫‪keydown‬‬ ‫•‬ ‫‪dblclick‬‬ ‫•‬

‫‪139‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫‪error‬‬ ‫•‬ ‫‪keypress‬‬ ‫•‬

‫‪keyup‬‬ ‫•‬

‫كمببببا هببببو واضببببح –واعتمببببا ًدا على معببببايير ‪ –DOM‬يمكن أن ترتبببببط معالجببببات أحببببداث مُ حبببب ّددة‬

‫معينة‪.‬‬
‫ّ‬ ‫بعناصر‬

‫ً‬
‫أيض با اسببتخدام‬ ‫بالضببافة إلى القائمببة السببابقة الخاصببة بمعالجببات الحببداث القياسببية‪ ،‬يمكنببك‬

‫الدالببببببببببببببة )(‪ on‬لربببببببببببببببط معالجببببببببببببببات الحببببببببببببببداث الخاصببببببببببببببة في ‪ jQuery‬مثببببببببببببببل ‪mouseenter‬‬

‫و ‪ ،mouseleave‬بالضافة إلى أيّ ة معالجات أحداث مخصصة ُت ِ‬


‫نشئها أنت‪.‬‬

‫لحذف معالجات أحداث قياسية أو خاصة‪ ،‬يمكننا ببسبباطة تمريببر اسببم المعببالج أو اسببم المعببالج‬

‫الخاص الذي نريد حذفببه إلى الدالببة )(‪ً ،off‬‬


‫مثل )'‪ .jQuery('a').off('click‬إن لم ُتمب ِبررَ أيّب ة‬

‫وسبببببببائط إلى الدالبببببببة )(‪ off‬فسبببببببيؤدي ذلبببببببك إلى حبببببببذف جميبببببببع معالجبببببببات الحبببببببداث المرتبطة‬

‫بالعنصر المُ ح ّدد‪.‬‬

‫سأريك المفاهيم التي شرحناها في العلى في المثال التي‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<input type="text" value="click me" /‬‬
‫>‪<br /‬‬
‫>‪<br /‬‬
‫>‪<button>remove events</button‬‬
‫>‪<div id="log" name="log"></div‬‬
‫‪<script‬‬

‫‪140‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery
.min.js"></script>
<script>
(function($)
{
// ‫ربط الحداث‬
$('input').on('click', function()
{
alert('You clicked me!');
});
$('input').on('focus', function()
{
‫ مع‬focus ‫ والحدث‬alert ‫استخدام‬
// ‫ًا سيسبب بحلقة‬
// ‫ لن حدث التركيز على حقل‬،‫تكرار ل نهائية‬
َ ُ
// ‫طلق في كل مرة نغلق فيها مربع التحذير‬‫الدخال سي‬
ً
// alert ‫بدل من استخدام‬ ‫سنعرض الناتج في الصفحة‬
$('#log').html('You focused this input!');
});

// ‫ كاختصار‬click ‫استخدام الدالة‬


$('button').click(function()
{
// ‫فك ارتباط الحداث‬
$('input').off('click');
$('input').off('focus');

141
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫أو فك ارتباط جميع الحداث ‪//‬‬


‫;)(‪// $('button').off‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫عدة اختصارات لستخدام الدالة )(‪ on‬مع جميع أحداث ‪DOM‬‬ ‫ِ‬
‫توفر ‪ِ jQuery‬‬ ‫‪-‬‬

‫القياسية‪ ،‬أي باستثناء أحداث ‪ jQuery‬الخاصة مثل ‪mouseenter‬‬


‫و ‪ .mouseleave‬لستخدام هذه الختصارات عليك وضع اسم الدالة ً‬
‫بدل من‬

‫اسم الحدث‪.‬‬

‫أمثلة‪ click() :‬و )(‪ mouseout‬و )(‪.focus‬‬

‫‪ -‬يمكنك أن تربط عد ًدا ل محدو ًدا من الحداث إلى عنصر ‪ DOM‬وحيد‬

‫باستخدام ‪.jQuery‬‬
‫ملحاظات‬
‫ً‬
‫حدثا ما إلى‬ ‫ً‬
‫دالة لمعالجة الحداث باسم )(‪ one‬والتي ستربط‬ ‫ِ‬
‫توفر ‪jQuery‬‬ ‫‪-‬‬

‫سيزال‪ .‬الدالة )(‪ one‬ما هي إل‬ ‫ً‬


‫واحدة فقط ثم ُ‬ ‫ً‬
‫مرة‬ ‫سي ّ‬
‫نفذ‬ ‫عناصر ‪ DOM‬والذي ُ‬
‫ٌ‬
‫مختصرة ُتستعمَ ل فيها الدالتان )(‪ on‬و )(‪.off‬‬ ‫ٌ‬
‫طريقة‬

‫َ‬ ‫ُ‬
‫ضيفت الدالتان )(‪ on‬و )(‪ off‬إلى إصدار ‪ 1.7‬من ‪ ،jQuery‬وكنّا نستعمل‬‫‪-‬أ‬
‫بدل منهما الدالتين )(‪ bind‬و )(‪ُ .unbind‬أهمِ َ‬
‫ل استعمال الدالتين )(‪bind‬‬ ‫ً‬

‫بدءا من الصدار ‪ ،3.0‬لذا ل يُ َ‬


‫نصح باستخدامهما في‬ ‫ً‬ ‫و )(‪unbind‬‬
‫التطبيقات الحديثة‪.‬‬

‫‪142‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫برمجيا عبر دوال الحاداث المختصرة‬


‫ً‬ ‫‪ .3‬استدعاء معالجات الحاداث‬
‫الشكل المختصر لربط معالجببات الحببداث إلى عنصببر ‪) DOM‬مثببل‪ click() :‬و )(‪ mouseout‬و‬

‫برمجيا‪ .‬لفعل ذلك علينببا اسببتدعاء‬


‫ً‬ ‫ً‬
‫أيضا لستدعاء معالجات الحداث‬ ‫)(‪ (focus‬يمكن أن يُ ستخ َدم‬

‫الدالببة المختصببرة دون أن ُنمب ِبرر إليهببا دالب ً‬


‫بة‪ .‬هببذا يعببني أننببا نسببتطيع –نظريًب ا– ربببط معببالج أحببداث إلى‬

‫ً‬
‫بتعمل‬ ‫عنصببر ‪ DOM‬ثم اسببتدعاء ذاك المعببالج مباشب ً‬
‫برة‪ .‬سأشببرح الفكببرة السببابقة في المثببال التي مسب‬

‫الحدث )(‪) click‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪ --‬الضغط على هذا العنصر سيؤدي إلى إظهار ‪<!-- hi‬‬
‫>‪<a>Say Hi</a‬‬
‫>‪ --‬الضغط على هذا العنصر سيؤدي إلى إظهار ‪<!-- hi‬‬
‫>‪<a>Say Hi</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫ربط معالج لحدث النقر إلى جميع عناصأر >‪// <a‬‬
‫ً ‪//‬‬
‫ومن ثم استدعاء تلك المعالجات مباشرة‬

‫‪143‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫)(‪$('a').click(function‬‬
‫{‬
‫;)'‪alert('hi‬‬
‫;)(‪}).click‬‬
‫سيظهر تحذير )‪ (alert‬مرتين عند تحميل الصفحة ‪//‬‬
‫َي >‪// <a‬‬
‫وسيظهر أيضًا عند الضغط على أحد عنصر‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫معينة؛ ً‬
‫مثل‪:‬‬ ‫ّ‬ ‫ً‬
‫أيضا استخدام الدالة )(‪ trigger‬لستدعاء أحداث‬ ‫من الممكن‬

‫)( ‪jQuery('a').click(function‬‬
‫)'‪{ alert('hi') }).trigger('click‬‬ ‫ملحاظة‬

‫ً‬
‫أيضا مع الحداث المخصصة‪.‬‬ ‫سيعمل ما سبق‬

‫وحا َدت ‪ jQuery‬طريقة التعامل مع الكائن ‪event‬‬


‫‪ّ .4‬‬
‫باء على معببايير ‪ .W3C‬وهببذا يعببني ّ‬
‫أنه عنببدما‬ ‫وح َدت ‪ jQuery‬طريقة التعامل مع الكببائن ‪ event‬بنب ً‬
‫ّ‬

‫يُ مرّ ر الكائن ‪ event‬إلى دالة مُ عالِجة للحداث‪ ،‬فلن تضطر للقلق حول كيفية تعامل المتصببفحات مببع‬

‫الكببائن ‪ً ) event‬‬
‫مثل‪ :‬ع بببر الكببائن ‪ window.event‬في متصببفح ‪ .(IE‬يمكنببك اس ببتخدام الخاص ببيات‬

‫لن ‪ jQuery‬قببد‬
‫والدوال التية التابعة للكائن ‪ event‬دون أن تقلق من الختلفببات بين المتصببفحات ّ‬

‫وح َدت طريقة التعامل مع الكائن ‪.event‬‬


‫ّ‬

‫‪144‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

event ‫خاصيات الكائن‬ •

event.type ◦
event.target ◦
event.data ◦
event.relatedTarget ◦
event.currentTarget ◦
event.pageX ◦
event.pageY ◦
event.result ◦
event.timeStamp ◦

event ‫الدوال التابعة للكائن‬ •

event.preventDefault() ◦
event.isDefaultPrevented() ◦
event.stopPropagation() ◦
event.isPropagationStopped() ◦
event.stopImmediatePropagation() ◦
event.isImmediatePropagationStopped() ◦

‫ّب‬
‫« )أو اخببتر‬event» ‫ عليببك تمريببر وسببيط اسببمه‬jQuery ‫الموح د في‬ event ‫للوصول إلى الكائن‬

‫ ثم يمكنببك‬.jQuery ‫أي اسب ٍبم يحلببو لببك( إلى دالببةٍ مجهولببةٍ ُممببرّ رةٍ إلى دالببةٍ للتعامببل مببع الحببداث في‬
ّ
ِ
‫يوضب ب بح‬ ‫ المث ب ببال التي‬.event ‫اس ب ببتخدام المعام ب ببل داخ ب ببل الدال ب ببة المجهول ب ببة للوص ب ببول إلى الك ب ببائن‬

:‫هذا المفهوم‬

145
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)‪$(window).on('load', function(event‬‬
‫{‬
‫;)‪alert(event.type‬‬
‫"‪: "load‬الناتج ‪}); //‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .5‬فهم مجالت أسماء الحاداث في ‪jQuery‬‬


‫لكائن في ‪.DOM‬‬
‫ٍ‬ ‫بحدث وحيد‬
‫ٍ‬ ‫سيصدف وأن نحتاج إلى ربط أكثر من دالةٍ‬

‫لنأخ ببذ الح ببدث ‪ resize‬على س بببيل المث ببال‪ .‬يمكنن ببا ع بببر ‪ jQuery‬أن ُنض ببيف ّ‬
‫أي ع ببددٍ نش بباء من‬

‫الببدوال لمعالجببة الحببدث ‪window.resize‬؛ لكن مبباذا يحببدث عنببدما نحتبباج إلى حببذف إحببدى تلببك‬

‫الدوال ولكن ل نريد حذفها كلها؟‬

‫‪146‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

َ ‫ فسب ب ُبت‬$(window).off('resize') ‫إذا اسب ببتخدمنا‬


‫حذف جميب ببع الب ببدوال المرتبطب ببة بالحب ببدث‬

:‫ أي على سبببيل المثببال‬.namespace ) ‫ أمببا لببو وضببعنا الحببدث في مجببال أسببماء‬.window.resize

:‫( فيمكننا حذف دالة بعينها‬resize.unique

<!DOCTYPE html>
<html lang="en">
<body>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$(window).on('resize', function()
{
alert('I have no namespace');
});

$(window).on('resize.unique', function()
{
alert('I have a unique namespace');
});

// resize.unique ‫سنحذف الدالة المرتبطة بمعالجة الحدث‬


$(window).off('resize.unique')

147
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أضببفنا في المثببال السببابق دالببتين لمعالجببة الحببدث ‪ .resize‬واسببتخدمنا مجببال أسببماء للحببدث‬

‫أننببا لم نحببذف‬ ‫ِ‬


‫أوض بح ّ‬ ‫ُ‬
‫فعلت ذلببك لكي‬ ‫‪ resize‬الثبباني ومن ثم حببذفناه مباشب ً‬
‫برة باسببتخدام )(‪.off‬‬

‫معينة مُ عالِجة للحببداث‬


‫ّ‬ ‫أوّ ل دالة‪ .‬يعطينا استخدام مجال السماء القدرة على تسمية وحذف دوال‬

‫حين ترتبط أكثر من دالة لتعالج الحدث نفسه على عنصر ‪ DOM‬نفسه‪.‬‬

‫ً‬
‫أيض با اسببتخدام مجببالت‬ ‫معينببة مرتبطببة بحببدث وعنصببر ُمح ب ّدد‪ ،‬يمكننببا‬
‫ّ‬ ‫إضب ً‬
‫بافة إلى حببذف دالببة‬

‫ًبب‬
‫مرتبط ا بعنص ب ٍبر‬ ‫معين ببة )ع بببر اس ببتعمال )(‪ (trigger‬تع ببالج ح ب ً‬
‫بدثا مُ حبب ّد ًدا‬ ‫ّ‬ ‫الس ببماء لس ببتدعاء دال ببة‬

‫معين‪ .‬توجببد في المثببال التي دالتببان لمعالجببة الحببدث ‪ click‬للعنصببر >‪ ،<a‬وسنسببتدعي إحببداهما‬

‫عبر الستفادة من مجال السماء‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<a>click</a‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬

‫‪148‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫{‬
‫)(‪$('a').on('click', function‬‬
‫{‬
‫)'‪alert('You clicked me‬‬
‫;)}‬

‫)(‪$('a').on('click.unique', function‬‬
‫{‬
‫)'‪alert('You Trigger click.unique‬‬
‫;)}‬
‫استدعاء الدالة المرتبطة بمجال ‪//‬‬
‫أسماء ‪ click.unique‬فقط ‪//‬‬
‫;)'‪$('a').trigger('click.unique‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ -‬ل يوجد حد لعمق أو عدد مجالت السماء المستخدمة‪ً ،‬‬


‫مثل‬ ‫ملحاظات‬
‫‪.resize.layout.headerFooterContent‬‬

‫ٌ‬
‫ممتازة لحماية وحذف واستدعاء الدوال‬ ‫ٌ‬
‫طريقة‬ ‫‪ -‬استخدام مجال السماء هو‬
‫ٌ‬
‫إضافة )‪ (plugin‬ما‪.‬‬ ‫المرتبطة بالحداث والتي تستعملها‬

‫‪ -‬يمكن استخدام مجالت السماء مع الحداث الخاصة كما هو الحال مع‬


‫الحداث القياسية‪ً ،‬‬
‫مثل ‪ click.unique‬أو ‪.myclick.unique‬‬

‫‪149‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫‪ .6‬ما هو تفويض الحاداث‬


‫يعتمب ببد تفب ببويض الحب ببداث ) ‪ (event delegation‬على نشب ببر الحب ببداث )‪.(event propagation‬‬

‫فعنبببدما تضبببغط على العنصبببر >‪ <a‬الموجبببود داخبببل العنصبببر >‪ <li‬الموجبببود ببببدوره داخبببل العنصر‬

‫ابتببببببداء من >‪ <a‬إلى >‪ <li‬إلى >‪ <ul‬وهكببببببذا إلى أن ُت َ‬


‫طلق‬ ‫ً‬ ‫>‪ <ul‬فببببببإن الحبببببببدث ‪ click‬يُ َ‬
‫طلبببببببق‬

‫َ‬
‫أطل َق الحدث‪.‬‬ ‫لعنصر من »أجداد« )‪ (ancestors‬العنصر الذي‬ ‫ً‬
‫حدثا‬ ‫كل دالةٍ ُتعالِج‬
‫)‪ُ (fires‬‬
‫ٍ‬

‫ه ببذا يع ببني ّ‬
‫أنن ببا ل ببو أض ببفنا الح ببدث ‪ click‬إلى عنص ببر >‪ <ul‬ومن ثم ض ببغطنا على عنص ببر >‪<a‬‬

‫موجود داخل >‪ <ul‬فسيؤدي ذلك إلى اسببتدعاء الدالببة المُ عالِجببة للحببدث ‪ click‬المرتبطببة بالعنصببر‬

‫ِج حب ً‬
‫بدثا مببا أن نسببتخدم الكببائن ‪) event‬تحدي ب ًدا الخاصببية‬ ‫>‪ .<ul‬ويمكننببا حين اسببتدعاء دالببةٍ ُتعببال ُ‬

‫أن هببذا سببيعطينا‬ ‫‪ (event.target‬لتحديد ما هو العنصر في شجرة ‪ DOM‬الذي أطلق الحدث‪ِ .‬‬
‫أكرر ّ‬

‫ب بإطلق الحدث‪.‬‬
‫سب َ‬
‫العنصر الذي ّ‬

‫بير من عناصببر ‪ DOM‬عبببر تعريببف دالببةٍ‬ ‫ً‬ ‫يمكننا بفعل ذلك أن ُنضيف‬
‫حدث ما لعددٍ كبب ٍ‬
‫ٍ‬ ‫دالة لمعالجة‬

‫ٌ‬ ‫وحيدةٍ‪ .‬وهذا مفي ٌد ج ًد ا‪ ،‬ويمكننا الستفادة منه )على سبيل المثال( عنببدما يكببون عنببدنا جب‬
‫بدول فيببه‬

‫‪ 500‬س ببطر‪ ،‬إذ يوج ببد ح ببدث ‪ click‬مرتب ب ٌ‬


‫بط بك ببل س ببطر‪ ،‬وحينئ ببذٍ نس ببتطيع الس ببتفادة من تف ببويض‬

‫الحداث‪ .‬انظر إلى الشيفرة التية للتوضيح )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<ul‬‬
‫>‪<li><a href="#">remove</a></li‬‬
‫>‪<li><a href="#">remove</a></li‬‬

‫‪150‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

<li><a href="#">remove</a></li>
<li><a href="#">remove</a></li>
<li><a href="#">remove</a></li>
<li><a href="#">remove</a></li>
</ul>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('ul').click(function(event)
{
// <ul> ‫ إلى العنصر‬click ‫ربط دالة لمعالجة الحدث‬
// ‫ إليها‬event ‫وتمرير الكائن‬

// <a> ‫ هي‬event.target ‫قيمة‬


// parent() ‫< باستخدام‬li> ‫حذف العنصر‬
$(event.target).parent().remove();

// ‫إلغاء السلوك الفتراضي للمتصفح‬


// ‫( الحدث‬propagation) ‫وإيقاف نشر‬
return false;
});
})(jQuery);
</script>

151
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫َ‬
‫بغطت على إحببدى النقببط الببتي تظهببر قبببل عناصببر القائمببة وليس على الرابببط‬‫حس بنًا‪ ،‬مبباذا لببو ضب‬

‫نفسببه؟ سببيؤدي ذلببك إلى حببذف العنصببر >‪ .<ul‬لمبباذا؟! ّ‬


‫لنك عنببدما تضببغط على النقطببة فسببتكون‬

‫سببببببببببت ِ‬
‫حدد العنصر‬ ‫ُ‬ ‫قيمببببببببببة ‪ event.target‬هي >‪ <li‬وليس >‪ ،<a‬وبالتببببببببببالي الدالبببببببببة )(‪parent‬‬

‫>‪ <ul‬وتحذفه‪ .‬يمكننا تحديث الشيفرة السابقة لكي تحذف عناصر >‪ <li‬فقط عندما تضغط على‬

‫>‪ <a‬بتمرير تعبير لمطابقة العنصر ‪ li‬إلى الدالة )(‪.parent‬‬

‫;)(‪$(event.target).parent('li').remove‬‬

‫أن عليببك معرفببة مببا الببذي ُ‬


‫ضببغِ ط عليببه في العناصببر الببتي تحتببوي على‬ ‫الفكببرة المهمببة هنببا هي ّ‬
‫ُ‬
‫أن الحدث قد أطل َِق من العنصر الذي تتوقعه‪.‬‬
‫عناصر أبناء‪ .‬ولهذا فعليك أن تتحقق من ّ‬

‫‪ .7‬تطبيق دوال معالجة الحاداث على عناصر ‪ DOM‬بغض النظر عن‬

‫تحديث شجرة ‪DOM‬‬


‫حاليب ا في الصببفحة وإلى تلببك‬
‫ً‬ ‫يمكننببا ربببط دوال معالجببة الحببداث إلى عناصببر ‪ DOM‬الموجببودة‬

‫َ‬
‫بويض الحببداث‬ ‫الببتي لم نضببفها إلى الصببفحة بعببد باسببتخدام الدالببة )(‪َ .on‬تسببتخدِ م الدالب ُ‬
‫بة )(‪ on‬تفب‬

‫)‪ (event delegation‬للسماح لعناصر ‪ DOM‬المُ ضببافة حببدي ًثا بالسببتجابة إلى دوال معالجببة الحببداث‬

‫بغض النظبببببر عن التعبببببديلت أو التغيبببببيرات الديناميكيبببببة لشبببببجرة ‪ .DOM‬يمكن على سببببببيل المثبببببال‬

‫استخدام )(‪ on‬لنشاء زر )‪ (button‬الذي يُ ِ‬


‫نشئ زرًا آخر… وهكذا إلى ما ل نهاية‪:‬‬

‫‪152‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<button>Add another Button</button‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)(‪$('body').on('click', 'button', function‬‬
‫{‬
‫‪$(this).after("<button>Add another‬‬
‫;)">‪Button</button‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫أن الدال ببة )(‪ on‬ق ببد أ ّدت إلى‬ ‫بع ببد تفحص الش ببيفرة الس ببابقة‪ ،‬يجب أن يك ببون واض ب ً‬
‫بحا ل ببك كي ببف ّ‬

‫تط ب بببيق تف ب ببويض الح ب ببداث ) ‪ (event delegation‬إلى عنص ب ببر أب )العنص ب ببر >‪ <body‬في الش ب ببيفرة‬

‫َ‬
‫الستجابة إلى الحدث ‪.click‬‬ ‫أي عنصر >‪ <button‬موجود في الصفحة‬
‫السابقة( لكي يستطيع ُ‬

‫)(‪ً ،on‬‬
‫مثل‪:‬‬ ‫سنسبببببببببتعمل الدالبببببببببة )(‪ off‬لزالببببببببة التبببببببببأثير النببببببببباتج عن اسبببببببببتعمال الدالببببببببة‬

‫)'‪.$('body').off('click', 'button‬‬

‫‪153‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫أن الدالة )(‪ on‬يمكن أن ُتستخ َدم لربط الحداث إلى عناصببر ‪ DOM‬الببتي ُتحب َ‬
‫بذف‬ ‫الفكرة هنا هي ّ‬

‫ُ‬
‫وتضاف عبر ‪ ، AJAX‬وبهذه الطريقة لن تضطر إلى إعادة ربط الحداث إلى عناصر جديدة في ‪.DOM‬‬

‫َ‬ ‫ُ‬
‫ضيفت الدالة )(‪ live‬في إصدار ‪ jQuery 1.3‬والتي كانت تستعمل لتفويض‬‫أ‬

‫الحداث‪ ،‬ولكنها ُأهمِ َلت )‪ (deprecated‬في إصدار ‪ُ 1.7‬‬


‫وحذِ َفت في إصدار‬

‫‪ .1.9‬وكان يمكن استخدام الدالة )(‪ delegate‬كبديل عنها‪ ،‬حيث تؤدي نفس‬
‫ُ‬ ‫ً‬
‫قليل(‪ ،‬لكن الدالة )(‪ delegate‬قد أهمِ َلت‬ ‫الغرض تمامً ا )وإن اختلفت الصيغة‬

‫بدءا من‬
‫ً‬ ‫في الصدار ‪3.0‬؛ لذا يجدر بنا استعمال الدالة )(‪ on‬والتي أضيفت‬ ‫ملحاظة‬

‫الصدار ‪.1.7‬‬

‫َ‬
‫كنت تستعمل إصدارًا أكبر من ‪ ،1.7‬أو‬ ‫خلصة القول‪ :‬استعمل الدالة )(‪ on‬إذا‬

‫َ‬
‫كنت تستعمل إصدارًا أقل من ‪.1.7‬‬ ‫استعمل )(‪ delegate‬إذا‬

‫‪ .8‬إضافة دالة لمعالجة أكثر من حادث‬


‫من الممكن تمرير أكببثر من حببدث إلى الدالببة )(‪ on‬لربطهببا جميعًب ا مببع دالببة وحيببدة‪ ،‬وهببذا يسببمح‬

‫بة مجهولب ً‬
‫بة‬ ‫بدة فقببط لمعالجببة أكببثر من حببدث‪ .‬سببنربط –في المثببال التي– دالب ً‬
‫برة واحب ً‬
‫بكتابببة الدالببة مب ً‬

‫لمعالجة الحداث ‪ click‬و ‪: keypress‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬

‫‪154‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الستجابة إلى أكثر من حدث ‪//‬‬
‫)‪$(document).on('click keypress', function(event‬‬
‫{‬
‫‪alert('A click or keypress event occured on the‬‬
‫;)'‪document.‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .9‬تعطيل السلوك الفتراضي للمتصفح باستخدام‬

‫)(‪preventDefault‬‬
‫عنب ببدما يُ ضب ب َبغط على رابب ببط أو عنب ببدما يُ َ‬
‫رس ب بل أحب ببد النمب بباذج‪ ،‬فسيسب ببتدعي المتصب ببفح الوظيفب ببة‬

‫الفتراضية المرتبطة بهذه الحداث‪ .‬على سبيل المثببال‪ ،‬الضببغط على رابببط >‪ <a‬سببيجعل المتصببفح‬

‫يحببباول تحميبببل قيمبببة الخاصبببية ‪ href‬للعنصبببر >‪ <a‬البببذي تم الضبببغط عليبببه في نافبببذة المتصبببفح‬

‫الحالي ب ببة‪ .‬ليق ب بباف المتص ب ببفح من إج ب ببراء ه ب ببذه الوظ ب ببائف الفتراض ب ببية نس ب ببتطيع اسبببببتخدام الدال ب ببة‬

‫ّ‬
‫الموحد ‪ event‬في ‪) jQuery‬مثال حي(‪:‬‬ ‫ٌ‬
‫جزء من الكائن‬ ‫)(‪ preventDefault‬التي هي‬

‫‪155‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

<!DOCTYPE html>
<html lang="en">
<body>
<a href="http://www.jquery.com">jQuery</a>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫عدم السماح للمتصفح بالنتقال إلى الصفحة الهدف‬
$('a').click(function(event)
{
event.preventDefault();
});
})(jQuery);
</script>
</body>
</html>

stopPropagation() ‫ إيقاف نشر الحاداث عبر‬.10


َ ‫بدث مببا لي عنصببر فسب ُبي‬
‫طلق نفس الحببدث‬ َ ُ‫ وعنببدما ي‬.DOM ‫تنتشببر الحببداث في شببجرة‬
ٌ ‫طلببق حب‬
ٍ ّ

‫ يخدم هذا السلوك الفتراضببي توظيببف حلببول مثببل تفببويض‬.(ancestor) «‫لجميع العناصر »الجداد‬

.(event delegation) ‫الحداث‬

156
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

‫ّب‬
jQuery ‫الموح د في‬ event ‫ الموجودة في كببائن‬stopPropagation() ‫يمكننا استخدام الدالة‬

:(‫لمنع هذا السلوك الفتراضي )مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<p><span>stop</span></p>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('p').click(function()
{
window.location = 'http://www.jquery.com'
});
$('span').click(function(event)
{
alert('You clicked a span inside of an p element');
َ ُ
// ‫طلق الحدث‬‫احذف السطر التي وسي‬
// !‫< أيضًا‬p> ‫ في العنصر‬click
event.stopPropagation();
});
})(jQuery);
</script>

157
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫لن يب ببؤدي الضب ببغط على العنصب ببر ‪ span‬إلى النتقب ببال إلى ‪ jquery.com‬وذلب ببك لننب ببا أوقفنب ببا نشب ببر‬

‫أن الحدث ‪ click‬المرتبط بالعنصر >‪ <p‬لن يُ َ‬


‫طلق(‪ .‬جب ِبرب حببذف‬ ‫الحداث في العنصر >‪) <span‬أي ّ‬

‫أن الضببببببببببببغط على العنصببببببببببببر ‪ span‬سببببببببببببيأخذك إلى‬


‫الدالببببببببببببة )(‪ stopPropagation‬وسببببببببببببتجد ّ‬

‫صفحة ‪.jquery.com‬‬

‫‪ .11‬إلغاء سلوك المتصفح الفتراضي ونشر الحاداث عبر‬

‫‪return false‬‬
‫إعبببادة القيمبببة ‪) false‬أي اسبببتخدام التعليمبببة البرمجيبببة ‪ (return false‬تكبببافئ اسبببتخدام‬

‫الدالتين )(‪ preventDefault‬و )(‪ stopPropagation‬معً ا )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫")'!‪<span><a href="javascript:alert('You clicked me‬‬
‫>‪class="link">click me</a></span‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬

‫‪158‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫{‬
‫)(‪$('span').click(function‬‬
‫{‬
‫إضافة حدث إلى العنصر >‪// <span‬‬
‫;'‪window.location = 'http://www.jquery.com‬‬
‫;)}‬
‫)(‪$('a').click(function‬‬
‫{‬
‫تجاهل النقرات على العنصر >‪// <a‬‬
‫;‪return false‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫فست ّ‬
‫نفذ الدالة )(‪ alert‬بسبب سببلوك‬ ‫ُ‬ ‫َ‬
‫حذفت العبارة ‪ return false‬في الشيفرة السابقة‬ ‫إذا‬

‫ً‬
‫أيضبا‬ ‫ست ّ‬
‫نفذ العبارة البرمجيببة الموجببودة في الخاصببية ‪ ،href‬وسببتنتقل‬ ‫المتصفح الفتراضي حيث ُ‬

‫إلى صفحة ‪ jquery.com‬بسبب إطلق الحدث ‪ click‬في العنصر ‪.span‬‬

‫‪ .12‬إنشاء أحاداث خاصة وإطلقها باستخدام )(‪trigger‬‬


‫لديك في ‪ jQuery‬إمكانية إنشاء أحداث خاصة بببك باسببتخدام الدالببة )(‪ ،on‬وذلببك بتوفببير دالببة‬

‫واسم خاص بالحدث إلى الدالة )(‪.on‬‬

‫ولن هببذه الحببداث خاصببة ول يعببرف المتصببفح عنهببا شببي ًئا‪ ،‬فالطريقببة الوحيببدة لسببتدعاء تلببك‬
‫ّ‬

‫‪159‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

ّ
‫تفحص‬ .jQuery ‫ التابعببة لمكتبببة‬trigger() ‫برمجي ا باسببتخدام الدالببة‬
‫ًب‬ ‫الحداث تكون عبببر إطلقهببا‬

ٌ
:trigger() ‫خاص ثم استدعي عبر الدالة‬ ٌ
‫حدث‬ ‫الشيفرة التية لترى كيف عُ ِر َف‬

<!DOCTYPE html>
<html lang="en">
<body>
<div>jQuery</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('div').on('myCustomEvent', function() {
// <div> ‫إضافة حدث خاص إلى العنصر‬
window.location = 'http://www.jquery.com';
});
$('div').click(function() {
// ‫< سيؤدي إلى استدعاء الحدث الخاص‬div> ‫الضغط على‬
$(this).trigger('myCustomEvent');
})
})(jQuery);
</script>
</body>
</html>

160
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

DOM ‫ نسخ الحاداث مع عناصر‬.13


.‫ إلى نسخ الحداث المرتبطة بها‬clone() ‫ باستخدام الدالة‬DOM ‫افتراضيا لن يؤدي نسخ بُنى‬
ً

َ ‫ولكي ُت‬
true ‫ فيجب تمريببر القيمببة المنطقيببة‬،‫ بالضافة إلى الحداث المرتبطة بها‬DOM ‫نسخ عناصر‬

:‫ أمعن النظر جي ًدا في المثال التي‬.clone() ‫إلى الدالة‬

<!DOCTYPE html>
<html lang="en">
<body>
<button>Add another Button</button>
<a href="#" class="clone">Add another Link</a>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('button').click(function()
{
var $this = $(this);
// ‫نسخ العنصر وجميع الحداث المرتبطة به‬
$this.clone(true).insertAfter(this);
// ‫ وإزالة الحدث‬،‫تغيير النص‬
$this.text('button').off('click');
});
$('.clone').click(function()

161
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫{‬
‫;)‪var $this = $(this‬‬
‫نسخ العنصر لكن دون الحداث المرتبطة به ‪//‬‬
‫;)‪$this.clone().insertAfter(this‬‬
‫تغيير النص وإزالة الحدث ‪//‬‬
‫;)'‪$this.text('link').off('click‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .14‬استخدام ‪ console‬لظإهار الحاداث المرتبطة بعناصر ‪DOM‬‬


‫إحببدى الخببدع المفيببدة عنببد اسببتخدام ‪ console‬هي القببدرة على عببرض قائمببة تفاعليببة لجميببع‬

‫الحبببببداث المرتبطبببببة بعنصبببببر ‪ DOM‬باسبببببتخدام ‪ .jQuery‬يرتببببببط الحبببببدثان ‪ click‬و ‪mouseleave‬‬

‫–في المثببال التي– بالعنصببر >‪ .<div‬وباسببتخدام ‪ console‬سببنتمكن من عببرض الحببداث المرتبطببة‬

‫بعنصر >‪ <div‬عبر الوصول إلى معلومات الحداث )بوساطة )'‪:($('div').data('events‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>click or hover over this text</div‬‬
‫‪<script‬‬

‫‪162‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)‪$('div').on('click mouseleave', function(event‬‬
‫{‬
‫;)‪alert(event.type‬‬
‫;)}‬
‫انظر إلى ‪ console‬لرؤية الحداث ‪//‬‬
‫المرتبطة بالعنصر >‪// <div‬‬
‫;))'‪console.dir($('div').data('events‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫الخلصة‪ُ :‬ت ّ‬
‫خزن معلومات الحداث عندما نربطها بأحد العناصر‪.‬‬

‫‪ .15‬الحصول على إحاداثيات ‪ X‬و ‪ Y‬لمؤشر الفأرة في إطار العرض‬


‫برببببببببط الحبببببببدث ‪ mousemove‬إلى كامببببببل الصببببببفحة )أي ‪ (document‬فيمكننبببببببا الحصبببببببول على‬

‫إحببداثيات ‪ X‬و ‪ Y‬لمؤشببر الفببأرة أثنبباء تحركببه داخببل إطببار العببرض )‪ ،(viewport‬وذلببك عبببر الحصببول‬

‫ّ‬
‫الموحد ‪ event‬في ‪) jQuery‬مثال حي(‪:‬‬ ‫على الخاصيتين ‪ pageY‬و ‪ pageX‬للكائن‬

‫‪163‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السادس‪ :‬الحداث في ‪jQuery‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)‪$(document).mousemove(function(e‬‬
‫{‬
‫الخاصأية ‪ e.pageX‬تعطيك إحداثيات ‪// X‬‬
‫الخاصأية ‪ e.pageY‬تعطيك إحداثيات ‪// Y‬‬
‫‪$('body').html('e.pageX = ' + e.pageX +‬‬
‫;)‪', e.pageY = ' + e.pageY‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪<html‬‬

‫عنصر آخر‬
‫ٍ‬ ‫ً‬
‫نسبة إلى‬ ‫‪ .16‬الحصول على إحاداثيات ‪ X‬و ‪ Y‬للفأرة‬
‫أحيانببا أن نحصببل على إحببداثيات ‪ X‬و ‪ Y‬لمؤشببر الفببأرة نسب ً‬
‫ببة إلى عنصب ٍبر آخببر غببير‬ ‫ً‬ ‫من الضببروري‬

‫إطببار العببرض )أو كامببل المسببتند(‪ .‬وهببذا مببا نفعلببه عب ً‬


‫بادة عنببد إنشبباء »تلميحببات« )‪ ،(tooltips‬حيث‬

‫ً‬
‫نسبة إلى مكان تحريك الفأرة‪.‬‬ ‫يظهر التلميح‬

‫‪164‬‬
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

ً ‫ للفببأرة نسب‬Y ‫ و‬X ‫( من إحببداثيات‬ofset) ‫يمكن فعببل ذلببك ببسبباطة بطببرح انزيبباح العنصببر‬
‫ببة إلى‬

:(‫كامل إطار العرض )مثال حي‬

<!DOCTYPE html>
<html lang="en">
<body>
<!-- ‫تحريك الفأرة فوق هذا العنصر سيؤدي إلى إظهار‬
‫ إحداثياتها النسبية‬-->
<div
style="margin:200px;height:100px;width:100px;background:#ccc;
padding:20px">
relative to this
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('div').mousemove(function(e)
{
// div ‫ً إلى عنصر‬
‫الحركة تكون نسبة‬
// (document) ‫وليس إلى كامل المستند‬
var relativeX = e.pageX - this.offsetLeft;
var relativeY = e.pageY - this.offsetTop;
$(this).html('releativeX = ' + relativeX +

165
jQuery ‫تعلم‬ jQuery ‫ الحداث في‬:‫الفصل السادس‬

', releativeY = ' + relativeY);


});
})(jQuery);
</script>
</body>
</html>

166
‫الفصل السابع‪:‬‬

‫‪ jQuery‬ومتصفح الويب‬

‫‪7‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السابع‪ jQuery :‬ومتصفح الويب‬

‫‪ .1‬تعطيل القائمة المنسدلة الظاهرة بالضغط على الزر اليمن‬

‫للفأرة‬
‫يمكن باسببتخدام ‪ JavaScript‬تعطيببل القائمببة المنسببدلة )‪ (contextual menu‬الببتي تظهببر عنببدما‬

‫ٌ‬
‫سبببببهل جببببب ًدا في ‪ .jQuery‬كبببببل مبببببا علينبببببا عملبببببه هبببببو تعطيل‬ ‫نضبببببغط على البببببزر اليمن‪ .‬فعبببببل ذلبببببك‬

‫الحدث ‪:contextmenu‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)(‪$(document).on('contextmenu', function‬‬
‫{‬
‫;‪return false‬‬
‫;)}‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪168‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل السابع‪ jQuery :‬ومتصفح الويب‬

‫‪ .2‬تمرير نافذة المتصفح‬


‫هنالك عد ٌد كبيرٌ ج ًدا من الضببافات لتمريببر )‪ (scroll‬نافببذة المتصبفح‪ ،‬وفعبل ذلببك سب ٌ‬
‫بهل جب ًدا في‬

‫‪ jQuery‬إذا كنببببا نحت ب بباج إلى التمري ب ببر فق ب ببط‪ .‬فبض ب بببط خاص ب ببية ‪ scrollTop‬في عنص ب ببرَ ي >‪<html‬‬

‫باقوليا‪.‬‬
‫ً‬ ‫أفقيببب ا أو ش ب‬
‫ً‬ ‫و >‪ <body‬فإننبببا سبببنتمكن من تحديبببد مك ببان التمري ببر ال ببذي نري ببد النتق ببال إليبببه‬

‫معين في الصفحة‪.‬‬
‫ّ‬ ‫عنصر‬
‫ٍ‬ ‫أفقيا إلى‬
‫ً‬ ‫سأستخدمُ في المثال التي الدالة )(‪ animate‬للتمرير‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<style‬‬
‫{ ‪li‬‬
‫;‪padding-bottom: 500px‬‬
‫}‬
‫>‪</style‬‬
‫>‪<ul‬‬
‫>‪<li><a href="#" class="next">Next</a></li‬‬
‫"‪<li><a href="#" class="next">Next</a>/<a href="#‬‬
‫>‪class="prev">Previous</a></li‬‬
‫"‪<li><a href="#" class="next">Next</a>/<a href="#‬‬
‫>‪class="prev">Previous</a></li‬‬
‫>‪<li><a href="#" class="prev">Previous</a></li‬‬
‫>‪</ul‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬

‫‪169‬‬
jQuery ‫تعلم‬ ‫ ومتصفح الويب‬jQuery :‫الفصل السابع‬

y.min.js"></script>
<script>
(function($)
{
$('.next').click(function()
{
$('html, body').animate(
{
scrollTop:
$(this).parent().next().find('a').offset().top
},
1000);
});
$('.prev').click(function()
{
$('html, body').animate(
{
scrollTop:
$(this).parent().prev().find('a').offset().top
},
1000);
});
})(jQuery);
</script>
</body>
</html>

170
‫الفصل الثامن‪:‬‬

‫الضافات في ‪jQuery‬‬

‫‪8‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫‪ .1‬استخدام ‪ $‬عند إنشاء إضافة‬


‫عندما تكتب إضافة ‪ ،jQuery‬فيجب عليك تطبيق آلية منع التضارب مع المكتبببات الخببرى الببتي‬

‫تستعملها في شيفرات ‪ jQuery‬العادية نفسها‪ ،‬وبهذا يجب أن تحتببوى جميببع الضببافات ضببمن مجببال‬

‫خاص )‪ (private scope‬حيث يمكن أن تستعمل الرمببز ‪ $‬دون الخببوف من حببدوث تضببارب أو نتببائج‬

‫غير متوقعة‪.‬‬

‫يجب أن تبببدو الشببيفرة التيببة مألوفب ً‬


‫بة لببديك لننببا اسببتخدمناها في أغلبيببة المثلببة في الفصببل‬

‫الول من هذا الكتاب )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫ًا ‪//‬‬
‫َ ذلك ليس عملي‬
‫ّ‬
‫ل تستعمل ‪ $‬هنا لن‬
‫;)‪alert(jQuery(document).jquery‬‬
‫)‪(function($‬‬
‫{‬
‫يمكننا استخدام ‪ $‬هنا دون الخوف من التضاربات ‪//‬‬
‫;)‪alert($(document).jquery‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬

‫‪172‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫جزءا من‬
‫ً‬ ‫لح َقة بالكائن ‪ jQuery.fn‬ستصبح‬
‫الم َ‬
‫‪ .2‬الضافات الجديدة ُ‬
‫دوال ‪jQuery‬‬
‫ٌ‬
‫بديل للكب ببائن‬ ‫ُتلحَبببب ق الضببببافات الجديببببدة بالكب ببائن ‪ jQuery.fn‬والببببذي هببببو اختصببببارٌ أو اسب ب ٌ‬
‫بم بب ب‬

‫‪ .jQuery.prototype‬س ببأريك في المث ببال أدن بباه ّ‬


‫أنن ببا كتبن ببا إض ببافة »عبب ّداد« ) ‪ (counter‬وألحقناه ببا‬

‫خصصببة والببتي يمكن أن‬


‫ّ‬ ‫بالكائن ‪ .jQuery.fn‬وبفعلنا لذلك سنكون قببد أنشببأنا أوّ ل إضببافة ‪ jQuery‬مُ‬

‫ُتستعمَ ل على مجموعة تغليف فيها كائنات ‪.DOM‬‬

‫عمومًبببب ا‪ ،‬يَ سببببمَ ح لنببببا إلحبببباق إضببببافة بالكببببائن ‪ jQuery.fn‬بإنشبببباء دوال خاصببببة شبببببيهة بتلببببك‬

‫ُ‬
‫فستضبمّ ن‬ ‫لنه عنببدما ُنلحِب ق دالببة الضببافة بالكببائن ‪jQuery.fn‬‬
‫الموجودة في أساس ‪ .jQuery‬وذلك ّ‬

‫دالتنا في سلسلة ‪ ($.fn.count = function(){}) prototype‬لجميع كائنات ‪ jQuery‬التي ُت َ‬


‫نشأ‬

‫أن إضببافة دالببة إلى‬


‫باسببتخدام دالببة ‪ .jQuery‬إذا أصبببح رأسببك يؤلمببك ممببا سبببق‪ ،‬فعليببك أن تعببرف ّ‬

‫أن الكلم ببة المحج ببوزة ‪ this‬داخ ببل الدال ببة التابع ببة للض ببافة ُ‬
‫ستش ببير إلى الك ببائن‬ ‫‪ jQuery.fn‬يع ببني ّ‬

‫‪ jQuery‬نفسه )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="counter1"></div‬‬

‫‪173‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function()
{
// jQuery ‫ هنا إلى كائن‬this ‫ُشير‬
‫ت‬
var $this = this;
// ‫ّاد ليبدأ من الصفر‬
‫ضبط العد‬
$this.text('0');
// ‫المهلة الزمنية‬
var myInterval = window.setInterval(function()
{
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);
};
})(jQuery);

jQuery('#counter1').count();
</script>
</body>
</html>

174
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫أن إضافتنا تود استخدام‬


‫بإلحاق الضافة إلى الكائن ‪ jQuery.fn‬فإننا نقول ّ‬
‫الدالة ‪ jQuery‬لتحديد السياق )‪) (context‬أي عناصر ‪ .(DOM‬إذا لم تتطلب‬
‫ً‬ ‫ملحاظة‬
‫سياقا ُمح ّد ًدا )بعبارةٍ أخرى‪ :‬مجموعة من كائنات ‪ (DOM‬التي يجب‬ ‫إضافتك‬

‫أن ُت جري عملياتها عليها‪ ،‬فقد ل تحتاج إلى إلحاق هذه الضافة بالكائن ‪.$.fn‬‬

‫‪ .3‬ستُ شير ‪ this‬داخل إضافة إلى كائن ‪ jQuery‬الحالي‬


‫عن ببدما ُتلحِبب ق إض ب ً‬
‫بافة بالك ببائن ‪ jQuery.fn‬ف ببإن الكلم ببة المحج ببوزة ‪ this‬داخ ببل دال ببة الض ببافة‬

‫ُ‬
‫ستشير إلى كائن ‪ jQuery‬الحالي )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="counter1"></div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)(‪$.fn.count = function‬‬
‫{‬
‫‪ this‬هنا مساوية إلى )'‪// jQuery('#counter1‬‬
‫الناتج هو كائن ‪// jQuery‬‬
‫;)‪alert(this‬‬

‫‪175‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫الناتج هو عنصر ‪// div‬‬


‫;)]‪alert(this[0‬‬
‫الناتج هو " ‪// "counter1‬‬
‫;)‪alert(this[0].id‬‬
‫;}‬
‫;)‪})(jQuery‬‬

‫;)(‪jQuery('#counter1').count‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫من المهم أن تفهم ما الذي ُتشير إليه الكلمة المحجوزة ‪ this‬داخل دالة الضافة‪.‬‬

‫ستخدم )(‪ each‬للمرور على كائن ‪ jQuery‬وتوفير مرجعية إلى‬


‫َ‬ ‫‪ُ .4‬ت‬

‫كل عنصر في ذاك الكائن باستخدام ‪this‬‬


‫يمكننببا باسببتخدام )(‪ each‬أن ُن ِ‬
‫نشبئ حلقببة تكببرار ضببمنية لضببافتنا‪ .‬وهببذا يعببني ّ‬
‫أنه لببو احتببوت‬

‫طبق دالبببببة الضبببببافة على كبببببل عنصبببببر في‬ ‫ُ‬


‫فسبببببت ّ‬ ‫عنصبببببر واحبببببد‪،‬‬
‫ٍ‬ ‫مجموعبببببة التغليبببببف على أكبببببثر من‬

‫مجموعة التغليف‪.‬‬

‫بة عامب ٌ‬
‫بة ُتسببتخ َدم للمببرور‬ ‫يمكننا فعل ذلبك باسببتخدام الدالببة )(‪ each‬في ‪ ،jQuery‬والببتي هي دالب ٌ‬

‫على عناصر الكائنات أو المصفوفات‪ .‬وهي ُت ِ‬


‫سه ل إنشاء حلقات التكرار‪ .‬سنمر في المثببال التي على‬

‫وستشببير الكلمببة المحجببوزة ‪ this‬داخببل الدالببة المُ مب ِبررة إلى )(‪ each‬إلى كببل‬
‫ُ‬ ‫كببائن ‪ jQuery‬نفسببه‪،‬‬

‫كائن موجود في مجموعة التغليف )مثال حي(‪:‬‬

‫‪176‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<!DOCTYPE html>
<html lang="en">
<body>
<div id="counter1"></div>
<div id="counter2"></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function()
{
this.each(function()
{
// ‫ الحالي‬jQuery ‫ هنا إلى كائن‬this ‫ُشير‬
‫ت‬
var $this = $(this);
// ‫ّاد ليبدأ من الصفر‬
‫ضبط العد‬
$this.text('0');
var myInterval = window.setInterval(function()
{
// ‫المهلة الزمنية‬
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);

177
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫;)}‬
‫;}‬
‫;)‪})(jQuery‬‬

‫;)(‪jQuery('#counter1, #counter2').count‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫بروري جب ًد ا إن كنت تريببد من إضببافتك أن تسببتعمل المببرور الضببمني‬


‫ٌ‬ ‫اسببتخدام الدالببة )(‪ each‬ضب‬

‫)‪ (implicit iteration‬على عناصر مجموعة التغليف‪.‬‬

‫عموما كائن ‪ jQuery‬لكي نتمكن من متابعة‬


‫ً‬ ‫‪ُ .5‬تعيد الضافات‬

‫السلسلة باستخدام دوال ‪ jQuery‬الخرى‬


‫كببببائن ‪ jQuery‬لكي ل تببببؤدي الضببببافة إلى »كسببببر«‬
‫َ‬ ‫ِ‬
‫الضببببافات‬ ‫ُ‬
‫أغلبيببببة‬ ‫من الطبببببيعي أن ُتعيببببد‬

‫معينببة فيجب أن تسببمح بإكمببال‬


‫ّ‬ ‫السلسبلة‪ .‬بعبببارةٍ أخببرى‪ ،‬إذا لم تحتبباج في الضببافة إلى إعببادة قيمببة‬

‫السلسببببلة لكي ُت ّ‬
‫طبق المزيببببد من الببببدوال على مجموعببببة التغليببببف‪ .‬سبببب ُنعيد في المثببببال التي كببببائن‬

‫‪ jQuery‬عب بببر التعليمب ببة ;‪ return this‬لكي ل نكسب ببر السلسب ببلة‪ .‬لحب ببظ ّ‬
‫أنني أسب ببتخدام الب ببدالتين‬

‫ُ‬
‫استدعيت الدالة )(‪ count‬الخاصة بالضافة )مثال حي(‪:‬‬ ‫)(‪ parent‬و )(‪ append‬بعد أن‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬

‫‪178‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<body>
<div id="counter1"></div>
<div id="counter2"></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function()
{
return this.each(function()
{
// each() ‫" بعد‬this" ‫ أو‬،jQuery ‫إعادة كائن‬
var $this = $(this);
$this.text('0');
var myInterval = window.setInterval(function()
{
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);
});
};
})(jQuery);
jQuery('#counter1, #counter2')

179
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫)(‪.count‬‬
‫ّنا من إكمال السلسلة لن الدالة )(‪// count‬‬
‫تمك‬
‫أعادت كائن ‪// jQuery‬‬
‫)(‪.parent‬‬
‫;)'>‪.append('<p>Chaining still works!</p‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ً‬
‫هادمة وذلك عند عدم إعادتها لكائن‬ ‫من الممكن أن تكون دالة الضافة‬
‫ملحاظة‬
‫‪.jQuery‬‬

‫‪ .6‬خيارات الضافة الفتراضية‬


‫خيبببارات ُتعت ََبببب ر ّ‬
‫أنهبببا الضببببط الفتراضبببي الساسبببي لليبببة عمبببل‬ ‫ٍ‬ ‫ً‬
‫عبببادة على‬ ‫تحتبببوي الضبببافات‬
‫ُ‬
‫سأ ِ‬
‫نش ب بئ في المثب ببال التي كب ببائن‬ ‫وتسب ببتخ َدم تلب ببك الخيب ببارات عنب ببدما ُتسب ببتدعى الضب ببافة‪.‬‬
‫الضب ببافة‪ُ ،‬‬

‫‪ defaultOptions‬يحتببوي على خاصببيةٍ وحيببدةٍ )‪ (startCount‬وقيمببةٍ )‪ .(0‬ويُ خب ّبزن هببذا الكببائن‬

‫ضمن الدالة ‪) count‬أي ‪ ،($.fn.count.defaultOptions‬ونفعببل ذلببك لكي نتمكن من تخصببيص‬

‫تلك الخيارات من خارج الضافة )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬

‫‪180‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<div id="counter1"></div>
<div id="counter2"></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function()
{
return this.each(function()
{
var $this = $(this);
// 0 ‫ّاد إلى‬
‫ضبط قيمة بداية العد‬
$this.text($.fn.count.defaultOptions.startCount +
'');
var myInterval = window.setInterval(function()
{
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);

});
};

181
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫{ = ‪$.fn.count.defaultOptions‬‬
‫‪startCount: 100‬‬
‫;}‬

‫;)‪})(jQuery‬‬
‫;)(‪jQuery('#counter1, #counter2').count‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .7‬خيارات مخصصة للضافة‬


‫مرر في‬ ‫ً‬
‫عببادة تجبباوز الخيببارات الفتراضببية للضببافة عبببر ضبببط خيببارات مخصصببة‪ .‬سبب ُن ِ‬ ‫يمكن‬

‫سبببيدمَ ج هبببذا الكبببائن مبببع كبببائن‬


‫ُ‬ ‫المثبببال التي الكبببائن ‪ customOption‬كمعامبببل إلى دالبببة الضبببافة‪.‬‬

‫‪ defaultOptions‬لنشبببباء كببببائن ‪ options‬وحيببببد‪ .‬سنسببببتخدم الدالببببة )(‪ extend‬الببببتي توفرهببببا‬

‫كائن وحيببد‪ .‬تسببمح لنببا الدالببة )(‪ extend‬بإضببافة خاصببيات )أو قيم(‬ ‫‪ jQuery‬لدمج ِ‬
‫عدة كائنات في‬
‫ٍ‬

‫ِ‬
‫سأمرر‬ ‫جديدة إلى كائن‪ .‬ويمكننا الن تمرير الخيارات إلى دالة الضافة بعد تغييرنا لشيفرتها‪ .‬حيث‬

‫في المث ببال التي ال ببرقم ‪ 500‬إلى الدال ببة ‪ count‬لكي يُ س ببتخ َدم كنقط ببة بداي ببة للعبب ّداد‪ ،‬وه ببذا الخي ببار‬

‫المُ خصص سيتجاوز القيمة الفتراضية ‪) 0‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div id="counter1"></div‬‬

‫‪182‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<div id="counter2"></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function(customOptions)
{
// ‫ وملؤه‬،‫ جديد‬option ‫إنشاء كائن‬
// customOptions ‫ و‬defaultOptions ‫بخاصأيات‬
var options = $.extend(
{}, $.fn.count.defaultOptions, customOptions);
return this.each(function()
{
var $this = $(this);
// ‫ضبط قيمة بداية العداد إلى القيمة الفتراضية‬
// ‫َت إلى الضافة‬
‫ِر‬
ّ‫ُر‬
‫َصة إن م‬
ّ‫مخص‬
ُ‫أو إلى القيمة ال‬
$this.text(options.startCount + '');
var myInterval = window.setInterval(function()
{
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);
});

183
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫;}‬
‫{ = ‪$.fn.count.defaultOptions‬‬
‫‪startCount: 100‬‬
‫;}‬
‫;)‪})(jQuery‬‬

‫َصة سيؤدي إلى تجاوز القيم الفتراضية ‪//‬‬


‫ُخصّ‬
‫تمرير خيارات م‬
‫(‪jQuery('#counter1, #counter2').count‬‬
‫{‬
‫‪startCount: 500‬‬
‫;)}‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .8‬تجاوز القيم الفتراضية دون تغيير شيفرة الضافة‬


‫لمّ ا كان من الممكن الوصول إلى الخيارات الفتراضية من خببارج الضببافة‪ ،‬فمن الممكن أن ُت ّ ب‬
‫غي ر‬

‫أردت أن ُتعب ِبرف قيمً ب ا للخيببارات دون تعببديل شببيفرة‬


‫َ‬ ‫قيمتهببا قبببل اسببتدعاء الضببافة‪ .‬وهببذا مفيب ٌد إن‬

‫لنك ُت ّ‬
‫هيئ الضببافة لتعمببل كمببا تشبباء‬ ‫بسبط عمليببات اسببتدعاء الضببافات‪ّ ،‬‬
‫سي ِ‬
‫الضافة‪ .‬وفعلببك لببذلك ُ‬

‫دون أن ُت ِ‬
‫عدل شيفرتها )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬

‫‪184‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<div id="counter1"></div>
<div id="counter2"></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.count = function(customOptions)
{
var options = $.extend(
{}, $.fn.count.defaultOptions, customOptions);
return this.each(function()
{
var $this = $(this);
$this.text(options.startCount + '');
var myInterval = window.setInterval(function()
{
var currentCount = parseFloat($this.text());
var newCount = currentCount + 1;
$this.text(newCount + '');
}, 1000);
});
};
$.fn.count.defaultOptions = {
startCount: 100

185
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫;}‬
‫;)‪})(jQuery‬‬

‫تجاوز القيم الفتراضية ‪//‬‬


‫;‪jQuery.fn.count.defaultOptions.startCount = 200‬‬

‫ً‬
‫بدل من ‪// startCount: 0‬‬ ‫سنستخدم ‪startCount: 200‬‬
‫;)(‪jQuery('#counter1').count‬‬
‫(‪jQuery('#counter2').count‬‬
‫{‬
‫‪startCount: 500‬‬
‫تجاوز القيم الفتراضية ‪}); //‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫برمجيا‬
‫ً‬ ‫‪ .9‬إنشاء العناصر أثناء التنفيذ واستدعاء الضافات‬
‫اعتما ًد ا على طبيعة إضافتك‪ ،‬قد تهتم بإمكانية استدعاء الضافة بشببكل اعتيببادي )عبببر عناصببر‬

‫ٌ‬
‫أوقات سيظهر فيها مربببع‬ ‫أن لدينا إضافة لنشاء مربع حوار‪ :‬هنالك‬
‫وبرمجيا‪ .‬تخيل ّ‬
‫ً‬ ‫وأحداث ‪(DOM‬‬

‫باء على‬
‫بان أخببرى سببنحتاج إلى إظهببار مربببع الحببوار بنب ً‬
‫باء على أفعببال المسببتخدم‪ ،‬وفي أحيب ٍ‬
‫الحببوار بنب ً‬

‫أحداث تتعلق بالبيئة أو النظام؛ وفي هذه الحالت يمكنك استدعاء الضافة دون وجود أيّ ب ة عناصببر‬
‫ٍ‬

‫ببببرمجي لكي يسبببتدعي الضبببافة‪ .‬سأسبببتدعي في الشبببيفرة التيبببة‬ ‫عنصبببر‬


‫ٍ‬ ‫في ‪ DOM‬وذلبببك بإنشببباء‬
‫ٍ‬

‫الضافة )(‪ dialog‬عند تحميل الصفحة‪ ،‬وذلك بإنشاء عنصر جديد )مثال حي(‪:‬‬

‫‪186‬‬
jQuery ‫تعلم‬ jQuery ‫ الضافات في‬:‫الفصل الثامن‬

<!DOCTYPE html>
<html lang="en">
<body>
<a href="#" title="Hi">dialog, say Hi</a>
<a href="#" title="Bye">dialog, say Bye</a>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$.fn.dialog = function(options)
{
var text = this.attr('title') || this.text();
alert(text);
};
})(jQuery);

jQuery('a').click(function()
{ // Invoked by user event
$(this).dialog();
return false;
});

$(window).load(function()
{

187
‫تعلم ‪jQuery‬‬ ‫الفصل الثامن‪ :‬الضافات في ‪jQuery‬‬

‫إنشاء عنصر لستدعاء الضافة ‪//‬‬


‫‪jQuery("<a></a>").attr('title', 'I say Hi when‬‬
‫ً ‪invoked!').dialog(); //‬‬
‫الستدعاء مباشرة‬
‫;)}‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫باء على خيببارات‬ ‫كمببا هببو واضببح‪ ،‬يمكن أن تكببون هنالببك عب ِ‬


‫بد ة تعببديلت على الطريقببة السببابقة بنب ً‬

‫برمجي ا عبببر‬
‫ًب‬ ‫وتعقيببد ووظيفببة الضببافة‪ .‬لكن الفكببرة الساسببية هنببا هي إمكانيببة اسببتدعاء الضببافات‬

‫ً‬
‫مسبقا بالضافة إلى العناصر المُ نشأة أثناء التنفيذ‪.‬‬ ‫عناصر ‪ DOM‬الموجودة‬

‫‪188‬‬
‫الفصل التاسع‪:‬‬

‫تحسين أداء شيفرات ‪jQuery‬‬

‫‪9‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫‪ .1‬استخدم آخر إصدار من ‪jQuery‬‬


‫فريق تطوير ‪ jQuery‬نشب ٌ‬
‫بط للغايببة ويواصببل تحسببين شببيفرة ‪ jQuery‬من ناحيببة الداء‪ .‬وبالتببالي‬

‫من المهم أن تسب ببتعمل دومً ب ب ا آخب ببر إصب ببدار من ‪ .jQuery‬أنصب ببحك –كمطب ب ِبور ‪ –jQuery‬أن تقب ببرأ سب ببجل‬

‫إصدارات جديدة التي تحتببوي‬


‫ٍ‬ ‫أن عليك التحديث إلى‬
‫التغييرات )‪ (release notes‬وتضع بالحسبان ّ‬

‫على تحسينات كبيرة في الداء‪.‬‬

‫حسن من الداء‬
‫سي ّ‬
‫‪ .2‬تمرير »سياق« إلى دالة ‪ُ jQuery‬‬
‫بياقا )‪ (context‬إلى دالببة ‪،jQuery‬‬ ‫ً‬
‫قليل من تنفيذ طلبية ‪ jQuery‬عنببدما ُتمب ِبرر سب ً‬ ‫يمكنك أن ُت ِ‬
‫سرع‬

‫ثان إلى دالببة‬ ‫ست ِ‬


‫وبفعل لذلك ُ‬
‫وسيط ٍ‬
‫ٍ‬ ‫قلل عدد عناصر ‪ DOM‬التي ستبحث ‪ jQuery‬فيها؛ وذلك بتمرير‬

‫وسيسببتخ َدم هبذا العنصببر كنقطببة انطلق لطلبيببة‬


‫ُ‬ ‫‪ ،jQuery‬الذي هو مرجعيببة إلى عنصببر ‪ DOM‬وحيببد‪،‬‬

‫‪) DOM‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div‬‬
‫>‪<div‬‬
‫>"‪<div id="context‬‬
‫>‪<a href="#">jQuery</a‬‬
‫>‪</div‬‬
‫>‪</div‬‬
‫>‪</div‬‬

‫‪190‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫الناتج‪// "context" :‬‬
‫‪alert($('a',‬‬
‫;)‪document.getElementById('context')).context.id‬‬

‫لن تحصل على تحسين في الداء‪ .‬الناتج "‪// "document‬‬


‫;)‪alert($('a', '#context').context.nodeName‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫تحسين فعلي للداء‪ ،‬فعليك أن ُت ِ‬


‫مرر مرجعية فعلية لعنصر‬ ‫ٍ‬ ‫لكي تحصل على‬
‫ٍ‬
‫كوسيط ثان‪ .‬أما تمرير كائن ‪ً ) jQuery‬‬
‫مثل‪ ($('#context') :‬يتطلب‬ ‫ٍ‬
‫ٍ‬ ‫‪DOM‬‬ ‫ملحاظة‬
‫البحث في كامل المستند عن ذاك العنصر‪ ،‬وهذا يفقد هذه التقنية مغزاها‪.‬‬

‫يمكن تطبيق هذه الطريقة على الحببالت الببتي تتببوافر فيهببا قيمببة ‪this‬؛ وذلببك عبببر تمريببر قيمببة‬

‫‪ this‬كسياق للبحث فيه ً‬


‫بدل من البحث في كامل المستند )مثال حي(‪:‬‬

‫‪191‬‬
jQuery ‫تعلم‬ jQuery ‫ تحسين أداء شيفرات‬:‫الفصل التاسع‬

<!DOCTYPE html>
<html lang="en">
<body>
<div>
<div>
<div id="context">
<a href="#">jQuery</a>
</div>
</div>
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

$('div#context').click(function()
{
// ‫الناتج‬: "object HTMLDivElement"
alert($('a', this).context);
}).click();

})(jQuery);
</script>

192
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫حددات‬
‫الم ِ‬
‫‪ .3‬فهم كيفية تحسين أداء ُ‬
‫بواء عنب ببدما نتحب ببدث عن الداء‪ .‬فهب ببل جميب ببع المتصب ببفحات‬ ‫ليسب ببت جميب ببع مُ حب ب ِ‬
‫بددات ‪ jQuery‬سب ب ً‬

‫ومحركببات ‪ JavaScript‬وأنظمببة التشببغيل وعتبباد الحواسببيب متسبباوية؟ إضب ً‬


‫بافة إلى صببعوبة الجببزم‬ ‫ِ‬

‫بأداء المُ ِ‬
‫حددات بشكل قاطع‪.‬‬

‫ً‬
‫مباشرة بمجموعةٍ مما يلي‪:‬‬ ‫ٌ‬
‫مرتبط‬ ‫أن أداء المُ ح ّددات‬
‫ضع ببالك ّ‬

‫نوع المُ ِ‬
‫حدد المستخدم‪.‬‬ ‫•‬

‫تعقيد تعبير التحديد‪.‬‬ ‫•‬

‫تعقيد وحجم شجرة ‪ DOM‬التي سيتم البحث فيها‪.‬‬ ‫•‬

‫ً‬
‫مثل‪getElementsByTagName() :‬‬ ‫ِ‬
‫ببببببببببببدد‪.‬‬‫تببببببببببببوفر دالببببببببببببة ‪ JavaScript‬مرتبطببببببببببببة بالمُ ح‬ ‫•‬

‫و )(‪ getElementById‬و )(‪getElementsByClassName‬‬

‫و )(‪.querySelectorAll‬‬

‫المتصفح‪ ،‬ونظام التشغيل‪ ،‬وعتاد الحاسوب‪.‬‬ ‫•‬

‫مقيدة‪:‬‬ ‫ولوجود هذه المتغيرات‪ ،‬فيجب أن يعتمد أداء المُ ِ‬


‫حددات على قواعد بسيطة وغير ّ‬

‫حبب ِ‬
‫بدد عناص ب ببر ‪ DOM‬باسبببببتخدام ‪ ID‬أينم ب ببا اس ب ببتطعت‪ ،‬فتنفي ب ببذ ذل ب ببك س ب ببريعٌ ل ب ببدعم جميبببببع‬ ‫•‬

‫َ‬
‫استخدمت اسببم فئببة ‪ ،CSS‬فل تسببتعملها‬ ‫المتصفحات للدالة )(‪ .getElementById‬أما إذا‬

‫‪193‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫بمفردهببا؛ وإنمببا اسببتعمل )'‪ $('td.class‬أو )'‪ .$('#nav.class‬لكن بعببد هببذا الحببد لن‬

‫ً‬
‫ضئيل‪.‬‬ ‫ِ‬
‫تؤثر أنواع المُ ِ‬
‫حددات على الداء إل تأثيرًا‬

‫حدد وحيد إلى دالة ‪ jQuery‬أسرع بكثير من تمرير ِ‬


‫عدة ُمح ّددات‪.‬‬ ‫تمرير مُ ِ‬ ‫•‬

‫مثل )'‪ً $('#fine‬‬


‫بدل‬ ‫عمومً ا كلما كان تعبير التحديد أبسط كان الداء أسرع‪ ،‬استخدم ً‬ ‫•‬

‫من )'‪.$('#div div.class .right#fine‬‬

‫البحث في ُبببنى ‪ DOM‬البسببيطة أسببرع بكثببير من ُ‬


‫البب نى الكبببيرة والمعقببدة‪ .‬وبالتببالي يصبببح‬ ‫•‬

‫تمرير »السياق« مهمً ا ج ًدا عندما نتعامل مع بُنى ‪ DOM‬الكبيرة‪.‬‬

‫بددات ال ببتي ُت ِ‬
‫مرره ببا لدال ببة‬ ‫بع ببد معرفت ببك له ببذه المعلوم ببات‪ ،‬لن يص ببعب علي ببك الموازن ببة بين المُ ح ب ِ‬

‫ٌ‬
‫دالببة‬ ‫ِ‬
‫حببددات أسببرع بكثببير عنببدما تكببون هنالببك‬ ‫‪ jQuery‬وبين تحسببين أداء الشببيفرة‪ .‬ستصبببح المُ‬

‫ً‬
‫مبثببببببببببببل‪:‬‬ ‫)‬ ‫ٌ‬
‫موجبببببببببببودة في ‪ JavaScript‬والبببببببببببتي يمكن اسبببببببببببتعمالها من ‪jQuery‬‬ ‫ٌ‬
‫مكافئبببببببببببة لهبببببببببببا‬

‫)(‪.(getElementsByClassName‬‬

‫ً‬
‫مقارنة‬ ‫في أغلبية الحالت‪ ،‬توفير سياق إلى دالة ‪ jQuery‬سيزيد الداء كثيرًا‬
‫ملحاظة‬
‫بكتابة مُ ح ّددات مُ ّ‬
‫حسنة‪.‬‬

‫ستخدم أكثر من مرة‬


‫َ‬ ‫حددة التي ُت‬
‫الم ّ‬
‫‪ .4‬تخزين مجموعة العناصر ُ‬
‫مؤقتً ا‬
‫ً‬
‫مرجعية إلى نتيجة الطلبيببة‪ .‬فلببو‬ ‫ل ُت ِ‬
‫كر ر إنشاء طلبيات لنفس العناصر عندما تستطيع أن تملك‬

‫ببقا‪ ،‬فخب ِبزن نتيجببة المُ حب ِ‬


‫بدد في‬ ‫بئت إعب َ‬
‫بادة اسببتخدام مجموعببةِ تغليب ٍبف تحتببوي عناصببر مُ ح ب ّددة مسب ً‬ ‫شب َ‬

‫‪194‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫متغير محلي ومن ثم استخدم الكائن المحفوظ في الذاكرة عند الحاجة‪.‬‬


‫ٍ‬

‫مهم ج ًدا عندما نتعامل مع حلقات التكرار‪ .‬فيجب أن ُت ّ‬


‫خزن مجموعة التغليببف في‬ ‫ٌ‬ ‫هذا المفهوم‬

‫متغير محلي خارج الحلقة‪ ،‬لكي نتفادى تنفيذ نفس الطلبية في كل تكرار‪.‬‬
‫ٍ‬

‫ٌ‬
‫مثال بطيء‪// :‬‬
‫تنفيذ )'‪ $('ul li‬في كل تكرار ‪//‬‬
‫{ )‪for (i = 0; i < $('ul li').length; i++‬‬
‫تنفيذ )'‪ $('ul‬في كل تكرار ‪//‬‬
‫;)(‪$('ul').eq(i).text‬‬
‫}‬

‫ٌ‬
‫مثال سريع‪// :‬‬
‫تخزين الطلبية ‪//‬‬
‫;)'‪var list = $('ul‬‬
‫تخزين طول )عدد عناصأر( الطلبية ‪//‬‬
‫;‪var listLength = list.find('li').length‬‬
‫أخذ قيمة طول الطلبية من الذاكرة ‪//‬‬
‫{ )‪for (i = 0; i < listLength; i++‬‬
‫أخذ قيمة الطلبية من الذاكرة ‪//‬‬
‫;)(‪list.eq(i).text‬‬
‫}‬

‫‪195‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫حدثة على ‪ DOM‬أقل ما يمكن‬


‫الم َ‬
‫أبق التغييرات ُ‬
‫‪ِ .5‬‬
‫من المهم ج ب ًدا عنببد تحسببين أداء صببفحة الببويب أن ُنبقي تغيببيرات شببجرة ‪ DOM‬أقببل مببا يمكن‪،‬‬

‫أنه كلمببببا ّ‬
‫قلت تعاملتببببك معهببببا كلمببببا كببببان‬ ‫وعليببببك دائمًبببب ا أن تخبببببر نفسببببك عنببببد تعاملببببك مببببع ‪ّ DOM‬‬

‫ذلك أفضل‪.‬‬

‫جليبب ا عنببدما يببأتي المببر إلى التعامببل مببع حلقببات التكببرار‪ ،‬فببأوّ ل حلقببة في‬
‫ً‬ ‫يظهببر هببذا المفهببوم‬

‫لنك ل تحتاج إل إلى التعامل مببع‬ ‫ست ِ‬


‫حدث ‪ DOM‬بمقدار ‪ 100‬مرة! وهذا غير مقبول ّ‬ ‫الشيفرة التية ُ‬

‫ً‬
‫واحدة فقط‪.‬‬ ‫ً‬
‫مرة‬ ‫‪DOM‬‬

‫ٌ‬
‫مثال بطيء‪// :‬‬
‫;)'‪var list = $('ul‬‬
‫{ )‪for (i = 0; i < 100; i++‬‬
‫التعامل مع ‪ DOM‬لمئة مرة ‪//‬‬
‫;)'>‪list.append('<li>List item ' + i + '</li‬‬
‫}‬

‫ٌ‬
‫مثال سريع‪// :‬‬
‫سلسة نصية فارغة ‪var listItems = ''; //‬‬
‫{ )‪for (i = 0; i < 100; i++‬‬
‫ُنية ‪//‬‬
‫ُنشِئ سلسلة نصية تحتوي على كامل ب‬
‫سن‬
‫‪ DOM‬التي نريد إضافتها ‪//‬‬
‫;'>‪listItems += '<li>List item ' + i + '</li‬‬
‫}‬

‫‪196‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫ً فقط ‪//‬‬
‫ً واحدة‬
‫سنستخدم الدالة )(‪ html‬لتحديث شجرة ‪ DOM‬مرة‬
‫;)‪$('ul').html(myListItems‬‬

‫ً‬
‫سلسلة نصية تحتوي على كامل بُنية ‪DOM‬؛ وبعببد ذلببك اسببتخدمنا‬ ‫استخدمنا في الحلقة الثانية‬

‫ً‬
‫واحدة فقط بتمريرها إلى الدالة )(‪.html‬‬ ‫ً‬
‫مرة‬ ‫هذه السلسلة النصية لتحديث ‪DOM‬‬

‫ً‬
‫قليل‪ ،‬فيمكننا استخدام الخاصية ‪ innerHTML‬لعنصر‬ ‫لتسريع تعديل بنى ‪DOM‬‬
‫ً‬
‫فبدل من )‪ $('div').html(stringOfHTML‬استعمل ‪$‬‬ ‫ً‬
‫مباشرة‪.‬‬ ‫‪DOM‬‬
‫ملحاظة‬
‫‪ .('div')[0].innerHTML = stringOfHTML‬وبهذا ستتخطى التعقيدات‬

‫الموجودة داخل دالة )(‪.html‬‬

‫‪ .6‬تحسين الداء عبر تمرير كائن يحتوي على مفاتيح وقيم إلى‬

‫دوال ‪jQuery‬‬
‫زوج وحيبببببدٍ‬ ‫ً‬
‫إضبببببافة إلى‬ ‫تقببببببل البببببدالتان )(‪ attr‬و )(‪ css‬كائنًبببببا فيبببببه الخاصبببببيات وقيمهبببببا‪،‬‬
‫ٍ‬

‫سي ِ‬
‫حسب ب ن تمري ببر ك ببائن من أداء الش ببيفرة بتقلي ببل ع ببدد كائن ببات ‪ jQuery‬المُ نش ببأة وبتقليل‬ ‫من القيم‪ُ .‬‬

‫الشيفرة المُ كرّ رة‪.‬‬

‫ٌ‬
‫مثال بطيء‪// :‬‬
‫;)'‪$('a').css('display', 'block‬‬
‫;)'‪$('a').css('color', 'red‬‬
‫;)'‪$('a').attr('title', 'Title Txt‬‬
‫;)'‪$('a').atrr('href', 'http://www.jquery.com‬‬

‫‪197‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫ٌ‬
‫مثال سريع‪// :‬‬
‫)'‪$('a‬‬
‫)}'‪.css({'display': 'block', 'color': 'red‬‬
‫‪.attr({'title': 'Title Txt', 'href':‬‬
‫;)}'‪'http://www.jquery.com‬‬

‫حددات إلى دالة ‪jQuery‬‬


‫عدة ُم ِ‬
‫‪ .7‬تحسين الداء بتمرير ِ‬
‫من الممكن تجميع المُ ِ‬
‫حددات مع بعضها وتمريرها إلى دالة ‪ jQuery‬كمعامل وحيببد وذلببك بفصببل‬

‫تلك المحددات بفاصلة )كما في ‪ .(CSS‬سببيزيد ذلببك من الداء بتقليببل عببدد كائنببات ‪ jQuery‬المُ نشببأة‬

‫وبتقليل الشيفرة المُ كرّ رة‪.‬‬

‫ٌ‬
‫مثال بطيء‪// :‬‬
‫;)(‪$('#div1').hide‬‬
‫;)(‪$('#div2').hide‬‬
‫;)(‪$('#div3').hide‬‬

‫ٌ‬
‫مثال سريع‪// :‬‬
‫;)(‪$('#div1, #div2, #div3').hide‬‬

‫‪ .8‬تحسين الداء باستخدام الدوال كسلسلة‬


‫ل تج ب ب ِر عمليب ببات بحث في ‪ DOM‬دون فائب ببدة‪ .‬من المنطقي اسب ببتخدام سلسب ببلة من الب ببدوال على‬

‫نفس الكببببببببائن وسببببببببيزيد ذلببببببببك من كفبببببببباءة الشببببببببيفرة‪ .‬وبفعلنببببببببا لببببببببذاك سببببببببنزيد من الداء بتقليل‬

‫تكرار الشيفرات‪.‬‬

‫‪198‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫ِة نسخ من كائن ‪// jQuery‬‬


‫ُنشِئ عد‬ ‫ٌ‬
‫مثال بطيٌ‬
‫ء ي‬
‫;)(‪$('div .open').hide‬‬
‫;)(‪$('div .close').show‬‬
‫;)(‪$('div').fadeIn‬‬

‫ٌ يستخدم سلسلة دوال ‪//‬‬ ‫ٌ‬


‫مثال سريع‬
‫للتعامل مع مجموعة التغليف الصألية ‪//‬‬
‫)'‪$('div‬‬
‫)'‪.find('.open‬‬
‫)(‪.hide‬‬
‫)(‪.end‬‬
‫)'‪.find('.close‬‬
‫)(‪.show‬‬
‫)(‪.end‬‬
‫;)(‪.fadeIn‬‬

‫ٍ بديل أن نفعل التي‪// :‬‬


‫يمكننا بشكل‬
‫ًا ‪var $div = $(div); //‬‬
‫ًا مؤقت‬
‫تخزين مجموعة التغليف تخزين‬
‫;)(‪$div.find('.open').hide‬‬
‫;)(‪$div.find('.close').show‬‬
‫;)(‪$div.fadeIn‬‬

‫‪ .9‬استخدم حالقة التكرار ‪ for‬عند التعامل مع حالقات التكرار الكبيرة‬


‫الدوال وبنى التحكم المُ ضمّ نة في المتصفح أسببرع دومًب ا! لكن السببؤال الببذي يجب أن نسببأله في‬

‫أغلبيبببة الحبببالت هبببو‪ :‬بكم أسبببرع؟ الزيبببادة في السبببرعة في أغلبيبببة الحبببالت تكبببون ضبببئيلة‪ .‬فلهبببذا‬

‫‪199‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل التاسع‪ :‬تحسين أداء شيفرات ‪jQuery‬‬

‫أسببببببتخدمُ الدالببببببة )(‪ each‬في ‪ jQuery‬ب ً‬


‫ببببببدل من اسببببببتخدام حلقببببببة تكببببببرار موجببببببودة في أسبببببباس‬

‫لغة ‪.JavaScript‬‬

‫أن جميع المهام التكراريببة الصببغيرة )الببتي تكببون أقببل من ‪ 1000‬تكببرار(‬


‫القاعدة التي أتبعها هي ّ‬

‫سيسب ِبهل من كتابببة الشببيفرات‪ ،‬وهببذا أكببثر‬ ‫ُت ِ‬


‫ناس بب الدالببة )(‪ each‬تمامًب ا‪ .‬واسببتخدام الدالببة )(‪ُ each‬‬

‫قيم ب ً‬
‫بة من التحس ببين الض ببئيل في الداء الببذي يببأتي من اس ببتخدام حلق ببات التك ببرار المُ ضببمنة في لغببة‬

‫بفبببببارق حقيقي عنبببببدما‬


‫ٍ‬ ‫‪ JavaScript‬في حلقبببببات التكبببببرار الصبببببغيرة‪ .‬والحبببببق يُ قبببببال أنبببببني ل أشبببببعر‬

‫ِ‬
‫أجرب الصفحة‪.‬‬

‫أمببا عنببدما يببأتي المببر إلى حلقببات التكببرار الكبببيرة )أكببثر من ‪ 1000‬تكببرار( فربمببا عليببك أن تبببدأ‬

‫مهم جب ًدا في متصببفح‬


‫ٌ‬ ‫بقيبباس الفببرق بين تنفيببذ حلقببات ‪ JavaScript‬وحلقببات ‪ .jQuery‬هببذا الختبببار‬

‫‪ Internet Explorer‬الذي يتعامل ببطء شديد مع جميع حلقات التكرار الكبيرة‪.‬‬

‫‪ .10‬تغيير المظهر باستخدام ‪ ID‬و ‪ً Class‬‬


‫بدل من تعديل خاصيات‬

‫مباشرة‬
‫ً‬ ‫‪style‬‬
‫عندما نتعامل مع خاصيات ‪ CSS‬فمن الفضل تحديث عنصر ‪ DOM‬وإضافة فئة )‪ (class‬جديدة‬

‫ً‬
‫مباشرة عبر الدالة )(‪) css‬مثال حي(‪:‬‬ ‫أو خاصية ‪ً id‬‬
‫بدل من تحديث خاصية ‪style‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<head‬‬
‫>‪<style‬‬

‫‪200‬‬
jQuery ‫تعلم‬ jQuery ‫ تحسين أداء شيفرات‬:‫الفصل التاسع‬

.newStyles {
background-color: red;
display: block;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div></div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
ٌ
// :‫مثال بطيء‬
$('div').css(
{
'display': 'block',
'width': '100px',
'height': '100px',
'background-color': '#f00'
});

201
jQuery ‫تعلم‬ jQuery ‫ تحسين أداء شيفرات‬:‫الفصل التاسع‬

ٌ
// :‫مثال سريع‬
$('div').addClass('newStyles');
})(jQuery);
</script>
</body>
</html>

202
‫الفصل العاشر‪:‬‬

‫المؤثرات في ‪jQuery‬‬

‫‪10‬‬
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

jQuery ‫ تعطيل جميع دوال المؤثرات في‬.1


true ‫ بإسببناد القيمببة‬jQuery ‫من الممكن تعطيببل جميببع دوال الحركببات والمببؤثرات الببتي توفرهببا‬

:(‫ كما يلي )مثال حي‬off ‫إلى الخاصية‬

<!DOCTYPE html>
<html lang="en">
<body>
<div style="height:100px; width:100px; background-
color:red; position:absolute;
left:20px;">
Try to animate me!
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
jQuery.fx.off = true;
// ‫ً دون مؤثرات‬
‫سيختفي العنصر مباشرة‬
$('div').slideUp();
})(jQuery);
</script>
</body>
</html>

204
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

‫ فلن تظه ببر أيّب ب ة حرك ببات في دوال الت ببأثيرات وس ببتظهر أو‬true ‫ إلى‬off ‫عن ببد ض بببط الخاص ببية‬

ً ‫تختفي مباشب‬
‫ يمكنببك‬.display:block ‫ و‬display:none ‫ الببتي هي‬CSS ‫برة باسببتخدام خاصببيات‬

:(‫ )مثال حي‬off ‫ إلى الخاصية‬false ‫إعادة تفعيل الحركات بإسناد القيمة‬

<!DOCTYPE html>
<html lang="en">
<body>
<div style="height:100px; width:100px; background-
color:red; position:absolute;
left:20px;">
Try to animate me!
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
jQuery.fx.off = true;
// ‫ً دون حركات‬
‫سيختفي العنصر مباشرة‬
$('div').slideUp();

jQuery.fx.off = false; // ‫ً أخرى‬


‫تفعيل الحركات مرة‬
$('div').slideDown(); // ‫سيظهر العنصر مع حركات‬

205
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .2‬فهم آلية عمل دالة الحركات )(‪stop‬‬


‫حاليببب ا قببببل الببببدء ببببأخرى‪ .‬على سببببيل المثبببال عنبببد‬
‫ً‬ ‫ً‬
‫عبببادة إيقببباف حركبببة تجبببري‬ ‫من الضبببروري‬

‫استخدام الحداث الخاصببة ‪ mouseenter‬و ‪) mouseleave‬أو الدالببة )(‪ (hover‬فقببد ُتفعّ ل الحركببة‬

‫ً‬
‫نتيجبببة لحبببدث ‪ mouseenter‬أو ‪ mouseleave‬سبببابق‪ .‬وبسببببب محاولبببة‬ ‫ً‬
‫سبببلفا‬ ‫عنصبببر يتحبببرك‬ ‫على‬
‫ٍ‬

‫إجببراء مجموعببة من الحركببات‪ ،‬فسببيؤدي ذلببك إلى حببدوث خطببأ واضببح في الحركببة؛ ولتفببادي ذلببك‬

‫استخدم الدالة )(‪ stop‬ليقاف الحركة الحالية قبل البدء بحركة جديدة )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<div style="height:100px; width:100px; background-‬‬
‫;‪color:red; position:absolute‬‬
‫>";‪left:20px‬‬
‫!‪Hover over Me‬‬
‫>‪</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬

‫‪206‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫(‪$('div').hover‬‬
‫)(‪function‬‬
‫{‬
‫;)'‪$(this).stop().animate({left: 75}, 'fast‬‬
‫‪},‬‬
‫)(‪function‬‬
‫{‬
‫;)'‪$(this).stop().animate({left: 20}, 'fast‬‬
‫}‬
‫;)‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ِ‬
‫عبببدة مبببرات لبببترى مببباذا‬ ‫ِ‬
‫وحبببرك الفبببأرة فب ببوق العنصب ببر‬ ‫أزل دوال )(‪ stop‬من الشبببيفرة السبببابقة‬

‫س ببيحدث بالحرك ببة‪ .‬تحري ببك الف ببأرة ف ببوق العنص ببر س ببيؤدي إلى ت ببراكم الحرك ببات‪ ،‬وه ببذا م ببا ل تري ببده‬

‫بكل تأكيد‪.‬‬

‫‪207‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫ً‬
‫أيضا‬ ‫بالضافة إلى إمكانية إيقاف الحركة الحالية للعنصر المُ ح ّدد‪ ،‬يمكنك‬

‫إيقاف جميع الحركات المتراكمة بتمرير القيمة ‪ true‬إلى الدالة )(‪ stop‬وهذا‬
‫ً‬ ‫ملحاظة‬
‫مفعلة )أي تجري‬ ‫سواء كانت‬
‫ً‬ ‫سيؤدي إلى إيقاف جميع الحداث المتراكمة‬

‫الن( أم ل‪.‬‬

‫‪ .3‬معرفة إن كان العنصر يخضع إلى حاركة عبر ‪:animated‬‬


‫حالي ا إلى حركببة‪.‬‬
‫ًب‬ ‫يمكن أن يُ ستعمَ ل المُ ِ‬
‫رشح الخاص ‪ :animated‬لتحديد العناصر الببتي تخضببع‬

‫سأسبببببببتخدم في المثبببببببال التي هبببببببذا المُ ح ِ‬


‫بببببببدد لضبببببببافة نص إلى عنصبببببببر >‪ <div‬خاضبببببببع للحركة‬

‫)مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<div style="height:100px; width:100px; background-‬‬
‫>‪color:red; color:white"></div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)(‪function recursiveAnimate‬‬
‫{‬
‫;)‪$('div').slideToggle('slow', recursiveAnimate‬‬

‫‪208‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫;}‬

‫;)(‪recursiveAnimate‬‬

‫;)'‪$('div:animated').text('I am animating‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .4‬استخدام الدوال )(‪ show‬و )(‪ hide‬و )(‪ toggle‬دون حاركة‬


‫سبببببيؤدي تمريبببببر معامبببببل إلى البببببدوال )(‪ show‬و )(‪ hide‬و )(‪ toggle‬إلى إظهبببببار أو إخفببببباء‬

‫العناصببر مببع اسببتخدام حركببة عبببر تغيببير خاصببيات ‪ CSS‬التاليببة‪ height :‬أو ‪ width‬أو ‪ opacity‬أو‬

‫‪ margin‬أو ‪ .padding‬من الممكن أن نوقف الحركات عند إخفاء أو إظهار العناصر‪ ،‬وذلببك عنببد عببدم‬

‫تمرير أيّ ة وسائط لتلك الدوال‪ ،‬وهذا سيؤدي إلى تغيير كيفية تعديل تلك الببدوال لظهببور العنصببر؛ إذ‬

‫ً‬
‫مباشبببرة دون حركبببات‪ ،‬وذلبببك عب بببر تعبببديل قيمبببة خاصب ببية‬ ‫سب ببتظهر أو سب ببتختفي العناصب ببر المتبببأثرة‬

‫‪ display‬في ‪) CSS‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<head‬‬
‫>"‪<style type="text/css‬‬

‫‪209‬‬
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

div {
height: 100px;
width: 100px;
background-color: red;
color: white;
margin: 5px;
}
</style>
</head>
<body>
<div>Click Me (hide animation)</div>
<div>Click Me (hide no animation)</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫إخفاء مع حركات‬
$('div:first').click(function()
{
$(this).hide(1000)
});
// ‫إخفاء دون حركات‬
$('div:last').click(function()
{

210
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫)(‪$(this).hide‬‬
‫;)}‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫دوال ‪ hide() jQuery‬و )(‪ show‬و )(‪ toggle‬و )(‪slideUp‬‬


‫و )(‪ slideDown‬و )(‪ slideToggle‬عندما ُتستخ َدم على العناصر التي لها‬
‫ملحاظة‬
‫غير مؤق ًتا إلى ‪display:block‬‬ ‫ُ‬
‫فست ّ‬ ‫القيمة ‪ inline‬لخاصية ‪،display‬‬

‫خلل مدة الحركة‪.‬‬

‫‪ .5‬فهم الحركات المتزامنة وغير المتزامنة‬


‫وقت واحببد‪ ،‬وبين الحركببات الببتي‬
‫ٍ‬ ‫من المهم أن تفهم الفببرق بين الحركببات الببتي تحببدث معً ب ا في‬

‫تتعب بباقب خلل فب ببترةٍ من الب ببزمن‪ .‬افتراضب ب ًبيا‪ ،‬عنب ببدما ُتسب ببتعمَ ل دوال المب ببؤثرات كسلسب ببلة فسب ببتحدث‬

‫المؤثرات بالتتالي بعضها تلو بعض )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<div style="height:100px; width:100px; background-‬‬
‫;‪color:red; position:absolute‬‬
‫>"‪left:20px; border:1px solid #ff9933‬‬

‫‪211‬‬
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

Animate me!
</div>
<div style="height:100px; width:100px; background-
color:red; position:absolute;
left:20px; top:100px; border:1px solid #ff9933">
Animate me!
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫كل مؤثر سيحدث على حدة بعد انتهاء‬
// ‫المؤثر الذي قبله‬
$('div:first')
.slideUp('slow').slideDown('slow').hide('slow');

// ‫كل مؤثر سيحدث على حدة بعد انتهاء‬


// ‫المؤثر الذي قبله‬
$('div:last').animate(
{
width: '200px'
}, 1000).animate(
{
borderLeftWidth: '10px'

212
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

}, 1000);
})(jQuery);
</script>
</body>
</html>

‫ فيمكننببا أن نضبببط حببدوث المببؤثرات في الببوقت نفسببه‬animate() ‫أمببا عنببد اسببتخدام الدالببة‬

‫ سببيزداد في المثببال‬.‫ وحيببدة‬animate() ‫ الببتي نريببد تغييرهببا إلى دالببة‬CSS ‫بتمريببر جميببع خاصببيات‬

:(‫وسي ضاف له إطار على طرفه اليسر في نفس الوقت )مثال حي‬
ُ <div> ‫التي عرض العنصر‬

<!DOCTYPE html>
<html lang="en">
<body>
<div style="height:100px; width:100px; background-
color:red; position:absolute;
left:20px; border:1px solid #ff9933">
Animate me!
</div>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{

213
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫سيحدث كل المؤثرين في نفس الوقت ‪//‬‬


‫(‪$('div').animate‬‬
‫{‬
‫‪width: '200px',‬‬
‫'‪borderLeftWidth: '10px‬‬
‫;)‪}, 1000‬‬

‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .6‬الدالة )(‪ animate‬هي الدالة الساسية‬


‫الدالببة )(‪ animate‬هي الدالببة الساسببية ذات المسببتوى المنخفض )‪ (low level‬الببتي ُتسببتخ َدم‬

‫مثل‪ hide() :‬أو )(‪ (slideDown‬وت ب ِ‬


‫بوفر الق ببدرة على‬ ‫ببقا ) ً‬
‫لنش بباء جمي ببع الحرك ببات المض بببوطة مس ب ً‬

‫تغيير قيمة الخاصية ‪) style‬خلل فترة زمنية(‪.‬‬

‫هذا ما يجب عليك أن تعرفه عندما تستخدم هذه الدالة‪:‬‬

‫بكلم آخببر‪ ،‬ل يمكنببك‬


‫ٍ‬ ‫الخاصيات الوحيدة المدعومة هي الخاصيات التي تقبل قيمً ا رقميب ً‬
‫بة‪.‬‬ ‫•‬

‫إنشببباء مبببؤثرات لقيمبببة الخاصبببية ‪) backgroundColor‬على القبببل ليس ببببدون إضبببافة(‪.‬‬

‫وكذلك المر للخاصيات التي تأخذ أكثر من قيمة مثل ‪.backgroundPosition‬‬

‫في إص ببدار ‪ jQuery 1.2‬وم ببا بعببده‪ ،‬يمكن ببك إنشبباء مببؤثرات لخاص ببيات ‪ CSS‬باس ببتخدام ‪em‬‬ ‫•‬

‫و ‪ %‬إن أمكن ذلك‪.‬‬

‫‪214‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل العاشر‪ :‬المؤثرات في ‪jQuery‬‬

‫يمكن إنشاء مؤثرات نسبية باسببتخدام »=‪ «+‬أو »=‪ «-‬أمبام قيمببة الخاصببية‪ .‬حيث يمكنببك‬ ‫•‬

‫ً‬
‫نسبة إلى مكانه الحالي‪.‬‬ ‫سلبيا(‬
‫ً‬ ‫إيجابيا أو‬
‫ً‬ ‫استخدام هذه التقنية لتحريك العنصر )‬

‫ً‬
‫مببدة للحرك ببة‪ ،‬فس ببتحدث الحرك ببة‬ ‫َ‬
‫حببددت القيمببة ‪0‬‬ ‫في إص ببدار ‪ jQuery 1.3‬وم ببا بعببده‪ ،‬إذا‬ ‫•‬

‫ً‬
‫مباشرة وستتحول العناصر إلى التنسيق النهائي دون حركة‪.‬‬

‫فست َ‬
‫عكس حركة التأثير من النهاية إلى البداية‪.‬‬ ‫ُ‬ ‫كاختصار‪ ،‬إذا مُ ِررَ َ‬
‫ت القيمة ‪toggle‬‬ ‫•‬

‫جميع خاصيات ‪ CSS‬المضبوطة عبر دالة )(‪ animate‬وحيدة ستتحرك في نفس الوقت‪.‬‬ ‫•‬

‫‪ .7‬فهم آلية عمل دوال الختفاء في ‪jQuery‬‬


‫يجب أن تعي المفبببببببباهيم الثلثببببببببة التيببببببببة عنببببببببد اسببببببببتخدام دوال )(‪ fadeIn‬و )(‪fadeOut‬‬

‫و )(‪.fadeTo‬‬

‫على عكس بقية دوال المؤثرات‪ ،‬دوال الختفاء سب ُبت ِ‬


‫عدل شببفافية العنصببر‪ .‬وسب ُبيف َترَ ض عنببد‬ ‫•‬

‫ً‬
‫وعرضا‪.‬‬ ‫ً‬
‫طول‬ ‫أن العنصر الذي »سيختفي« يملك‬
‫استخدام هذه الدوال ّ‬

‫بدءا من شفافيته الحالية‪.‬‬


‫ً‬ ‫دوال الختفاء ستؤدي إلى إخفاء العنصر‬ ‫•‬

‫بدءا من شفافيته الحالية وعنببدما‬


‫ً‬ ‫استخدام الدالة )(‪ fadeOut‬سيؤدي إلى إخفاء العنصر‬ ‫•‬

‫غير قيمة الخاصية ‪ display‬في ‪ CSS‬إلى ‪.none‬‬ ‫ُ‬


‫فست ّ‬ ‫ً‬
‫شفافا بنسبة ‪%100‬‬ ‫يصبح‬

‫ّ‬
‫موضحة في الشيفرة التية )مثال حي(‪:‬‬ ‫جميع النقط السابقة‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬

‫‪215‬‬
jQuery ‫تعلم‬ jQuery ‫ المؤثرات في‬:‫الفصل العاشر‬

<body>
ً
<!-- ‫طول وعرضًا‬ ‫ يجب أن تملك العناصأر التي ستخفى‬-->
<div style="height:100px; width:100px; background-
color:red;"></div>
<button>Fade the rest of the way</button>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
$('div').fadeTo('slow', 0.50);
$('button').click(function()
{
// 0 ‫إخفاء العنصر من الشفافية الحالية إلى‬
// display:none ‫ًا عبر الخاصأية‬
‫ثم إخفاء العنصر تمام‬
$('div').fadeOut('slow');
});
})(jQuery);
</script>
</body>
</html>

216
‫الفصل الحادي عشر‪:‬‬

‫تقنية ‪Ajax‬‬

‫‪11‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الحادي عشر‪ :‬تقنية ‪Ajax‬‬

‫‪ .1‬الدالة )(‪ ajax‬هي الدالة الساسية‬


‫الدال ببة )(‪ ajax‬هي الدال ببة الساس ببية ذات المس ببتوى المنخفض ال ببتي تس ببتخدم لنش بباء طلب ببات‬

‫‪) XMLHttpRequest‬أي ‪ .(AJAX‬جميبببببع دوال ‪ AJAX‬الخبببببرى في ‪– jQuery‬مثبببببل )(‪ –load‬تسبببببتعمل‬

‫الدالب ب ببة )(‪ .ajax‬الدالب ب ببة )(‪ ajax‬لهب ب ببا الكثببببببير من المب ب ببيزات وقابلب ب ببة للتخصببببببيص لنشب ب بباء طلبب ب ببات‬

‫‪ XMLHttpRequest‬تناسب احتياجاتنا‪.‬‬

‫الكب ببائن ‪ XMLHttpRequest‬هب ببو جب ب ٌ‬


‫بزء من تقنيب ببة ‪ ،Ajax‬ويمكن باسب ببتخدام هب ببذه التقنيب ببة تمريب ببر‬

‫البيانببات بين المتصببفح والخببادم‪ ،‬ولن نحتبباج إلى تحببديث الصببفحة عنببد فعببل ذلببك‪ .‬انتشببر اسببتعمال‬

‫الكببائن ‪ XMLHttpRequest‬كثببيرًا في الفببترة الخببيرة ممببا أدى إلى بنبباء تطبيقببات ويب مثل ‪Google‬‬

‫‪ Maps‬و ‪ Gmail‬التي تستخدم الكائن ‪ XMLHttpRequest‬لعرض أجزاء أخرى من الخريطة أو رسببائل‬

‫البريد اللكتروني الجديدة دون الحاجة إلى إعادة تحميل كامل الصفحة‪.‬‬

‫ً‬
‫اختلفببا كبببيرًا‪ ،‬وهببذا‬ ‫لسوء الحظ‪ ،‬تختلف الواجهة البرمجية للتعامل مع ‪ Ajax‬بين المتصببفحات‬

‫أن على الم بببرمجين أن يأخ ببذوا بالحس بببان جمي ببع الختلف ببات بين المتص ببفحات لض ببمان عم ببل‬
‫يع ببني ّ‬

‫موح ً‬
‫دة الفروقببات بين‬ ‫ِ‬ ‫بدعم لتقنيببة ‪Ajax‬‬
‫بكل سببليم؛ لكن لحسببن الحببظ‪ ،‬تببأتي ‪ jQuery‬بب‬
‫ٍ‬ ‫تقنية ‪ Ajax‬بشب ٍ‬
‫بابقا‪ ،‬وت ب ِ‬
‫بوفر‬ ‫المتص ببفحات في واجه ببة برمجي ببة خاص ببة ب ببه‪ ،‬وت ب ِ‬
‫بوفر الدال ببة )(‪ ajax‬ال ببتي ذكرناه ببا س ب ً‬

‫ً‬
‫دوال أخببرى مختصببرة لنببواع ُمحب ّددة من طلبيببات ‪ .XMLHttpRequest‬هببذه الببدوال مببا‬ ‫ً‬
‫أيضا‬ ‫‪jQuery‬‬

‫ٌ‬
‫اختصارات للدالة )(‪ ،ajax‬وهي‪:‬‬ ‫هي إل‬

‫)(‪load‬‬ ‫•‬

‫)(‪get‬‬ ‫•‬

‫)(‪getJSON‬‬ ‫•‬

‫‪218‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الحادي عشر‪ :‬تقنية ‪Ajax‬‬

‫)(‪getScript‬‬ ‫•‬

‫)(‪post‬‬ ‫•‬

‫ٌ‬
‫مفيدة في بعض الحيببان‪ ،‬لكنهببا جميعًب ا تسببتخدم‬ ‫أن هذه الختصارات‬
‫الفكرة الساسية هنا هي ّ‬

‫)(‪ ajax‬وراء السببتار‪ .‬وعنببدما تريببد اسببتخدام جميببع المببيزات والتخصيصببات الببتي توفرهببا ‪jQuery‬‬

‫لتقنية ‪ ،AJAX‬فعليك حينها استخدام الدالة )(‪.ajax‬‬

‫أشببهر طريقتببان لرسببال الطلبيببات إلى الخببادم همببا ‪ GET‬و ‪ ،POST‬ومن المهم فهم الفببرق بينهمببا‬

‫ً‬
‫صحيحا‪.‬‬ ‫ً‬
‫استعمال‬ ‫لستعمالهما‬

‫الطريقببة ‪ GET‬تسببتعمل للعمليببات » غببير الهادمببة«‪ ،‬أي العمليببات الببتي تتضببمن »الحصببول« على‬

‫ً‬
‫فمثل‪ :‬نسببتخدم طلبيببة ‪ GET‬عنببد محاولببة الحصببول على نتببائج‬ ‫البيانات من الخببادم‪ ،‬وليس تعببديلها؛‬

‫أن طلبيبببببات ‪ GET‬يمكن تخزينهبببببا مؤق ًتب ببا )‪ (cached‬في‬


‫من أح ب ببد محرك ب ببات البحث‪ .‬يج ب ببدر بالبببببذكر ّ‬

‫المتصفحات‪ ،‬مما قد يؤدي إلى سلوكٍ غير متوقع إذا لم تضع ذلك بالحسبان‪.‬‬

‫أم ببا الطريق ببة ‪ POST‬فهي تس ببتعمل للعملي ببات »الهادم ببة«‪ ،‬أي العملي ببات ال ببتي ت ببؤدي إلى تع ببديل‬

‫ظ المسبببتخدم منشبببورًا في مدونتبببه فيجب حينئبببذٍ‬ ‫ً‬


‫فمثل‪ ،‬إذا َحفِببب َ‬ ‫البيانبببات الموجبببودة في الخبببادم‪.‬‬

‫ً‬
‫عبببادة‬ ‫أن طلبيبببات ‪ POST‬ل ُت ّ‬
‫خبببزن مؤق ًتبببا‬ ‫اسبببتخدام الطريقبببة ‪ POST‬لنقبببل البيانبببات؛ يجبببدر بالبببذكر ّ‬

‫من المتصفح‪.‬‬

‫افتراضيا‪ ،‬الدالتان )(‪ ajax‬و )(‪ load‬ستستخدمان الطريقة ‪ GET‬في‬


‫ً‬
‫ملحاظة‬
‫بروتوكول ‪.HTTP‬‬

‫لمزيدٍ من المعلومات والمثلة عن استعمال الدالة )(‪ ،ajax‬يرجى مراجعة التوثيق الرسمي‪.‬‬

‫‪219‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الحادي عشر‪ :‬تقنية ‪Ajax‬‬

‫‪ .2‬تدعم ‪ jQuery‬تقنية ‪ JSONP‬العابرة للنطاقات‬


‫تقنية ‪) JSONP‬اختصببار للعبببارة ‪ (JSON with Padding‬هي تقنيببة تسببمح لمُ ِ‬
‫رسبل طلبيببة ‪HTTP‬‬

‫ِ‬
‫يوفر اسمً ا للدالة الببتي ُ‬
‫ستسببتدعى ويُ مببرّ ر كببائن ‪ JSON‬إليهببا كوسببيط‪.‬‬ ‫–عندما ُتعاد صيغة ‪ –JSON‬أن‬

‫ه ببذه التقني ببة ل تس ببتخدم ‪XHR‬؛ وإنم ببا تس ببتخدم العنص ببر ‪ script‬لكي نتمكن من اس ببتقبال وإرس ببال‬

‫أي موق ببع‪ .‬اله ببدف من ه ببذه التقني ببة ه ببو اللتف بباف على المح ببدوديات الناجم ببة عن‬
‫البيان ببات من وإلى ّ‬

‫»سياسة المصدر الواحد« )‪ (same-origin policy‬في تقنية ‪.XHR‬‬

‫ببببباق‬
‫باسبببببتخدام دالبببببة ‪ jQuery‬ذات السبببببم )(‪ getJSON‬يمكننبببببا تحميبببببل بيانبببببات ‪ JSON‬من نط ٍ‬

‫)‪ (domain‬آخر عندما ُتضاف الدالببة المُ عالِجببة لطلبيببة ‪ JSONP‬إلى رابببط ‪ .URL‬كمثببال‪ ،‬هببذا هببو رابببط‬

‫‪ URL‬الذي سنستخدمه للوصول إلى الواجهة البرمجية لموقع ‪.flickr‬‬

‫‪http://api.flickr.com/services/feeds/‬‬
‫?‪photos_public.gne‬‬
‫?=‪tags=resig&tagmode=all&format=json&jsoncallback‬‬

‫القيمببة ? ُتسببتخ َدم كاختصببار يخبببر ‪ jQuery‬أن تسببتدعي الدالببة الببتي مُب ِررت كوسببيط إلى الدالببة‬

‫)(‪ .getJSON‬يمكنك وضع اسم الدالة التي تريدها إن لم تشأ استخدام هذا الختصار‪.‬‬

‫سأضببيف إلى صببفحة الببويب في المثببال التي أحببدث الصببور الببتي تملببك الوسببم » ‪ «resig‬عبببر‬

‫استخدام الواجهة البرمجية لموقببع ‪ .flickr‬لحببظ أنببني أسببتخدم الختصببار ? لكي تسببتدعي ‪jQuery‬‬

‫ُ‬
‫مررتها إلى الدالةِ )(‪ .getJSON‬الوسيط الذي ُ‬
‫سيمرّ ر إلى تلك الدالة هو كائن ‪ JSON‬الذي‬ ‫َ‬
‫الدالة التي‬

‫استقبلناه من الموقع الخارجي )مثال حي(‪:‬‬

‫‪220‬‬
jQuery ‫تعلم‬ Ajax ‫ تقنية‬:‫الفصل الحادي عشر‬

<!DOCTYPE html>
<html lang="en">
<body>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
// ‫استخدام ? سيعني استدعاء الدالة‬
// getJSON() ‫التي مررناها إلى الدالة‬

$.getJSON("http://api.flickr.com/services/feeds/photos_public
.gne?tags=resig&tagmode=all&format=json&jsoncallback=?",
function(data)
{
// ‫ الذي‬JSON ‫ هو كائن‬data ‫الوسيط‬
// Flickr ‫استقبلناه من‬
$.each(data.items, function(i, item)
{
$('<img />').attr("src",
item.media.m).appendTo('body');
if (i == 30) return false;
});
});
})(jQuery);

221
‫تعلم ‪jQuery‬‬ ‫الفصل الحادي عشر‪ :‬تقنية ‪Ajax‬‬

‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫راجع توثيق الواجهة البرمجية )‪ (API‬للخدمة التي تستقبل البيانات منها لكي‬

‫تعرف الستخدام الصحيح لها‪ .‬على سبيل المثال‪ ،‬موقع ‪ Flickr‬يستعمل‬ ‫ملحاظة‬
‫?=‪ jsoncallback‬بينما !‪ Yahoo‬و ‪ Digg‬يستخدمان ?=‪.callback‬‬

‫‪ .3‬منع المتصفح من تخزين طلبيات ‪ XHR‬مؤقتً ا‬


‫نشبئ طلبيببة ‪ ،XHR‬فسب ُبي ِ‬
‫خزن متصبفح ‪ Internet Explorer‬الببرد )‪ (response‬مؤق ًتببا‪ .‬وإذا‬ ‫عندما ُت ِ‬

‫كان الرد ثاب ًت ا والذي سيصلح لفترةٍ من الزمن‪ ،‬فمن المستحسن تخزينه مؤق ًتا‪ .‬أما إذا كببان المحتببوى‬

‫أن المتصببفح لن‬ ‫ّ‬


‫تتأكببد ّ‬ ‫يتغير في أيّ ة ثانية‪ ،‬فعليببك حينئببذٍ أن‬
‫ّ‬ ‫الذي تطلبه هو محتوى ديناميكي وقد‬

‫يُ خ ب ِبزن ال ببرد مؤق ًتببا‪ .‬أح ببد الحل ببول الممكن ببة ه ببو تمري ببر قيم ببة فري ببدة في عن ببوان ‪ URL‬للطلبي ببة‪ ،‬وبه ببذا‬

‫أن كل طلبية يجريها المتصفح هي طلبية فريدة لها رابط ‪ URL‬مختلف‪.‬‬


‫ستتأكد ّ‬

‫إضافة عبارة فريدة في نهاية الرابط ‪//‬‬


‫(‪jQuery.ajax‬‬
‫‪url:'some.php?nocache='+(new Date()).getTime(),‬‬
‫'‪type:'POST‬‬
‫;)‬

‫‪222‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الحادي عشر‪ :‬تقنية ‪Ajax‬‬

‫أحببد الحلببول الخببرى – وهببو حب ٌ‬


‫بل عببامٌ– هببو أن تضبببط عببدم تخببزين الطلبيببات مؤق ًتببا في جميببع‬

‫طلبيببات ‪ Ajax‬وهببذا باس ببتخدام الخيببار ‪ .cache‬سنس ببتخدم هن ببا الدالببة ‪ ajaxSetup‬لضبببط تعطي ببل‬

‫التخزين المؤقت لجميع طلبيات ‪:Ajax‬‬

‫{( ‪$.ajaxSetup‬‬
‫القيمة هي ‪ true‬افتراضي‬
‫ًا ‪//‬‬
‫القيمة ‪ false‬تعني إيقاف التخزين المؤقت ‪//‬‬
‫‪cache: false‬‬
‫;)}‬

‫معينببة‪ ،‬فيمكنببك ببسبباطة تغيببير الخيببار‬


‫ّ‬ ‫َ‬
‫أردت الن تفعيببل التخببزين المببؤقت لطلبيببات ‪XHR‬‬ ‫وإن‬

‫ٌ‬
‫مثبال أجرينببا فيببه طلبيببة ‪ XHR‬باسببتخدام الدالببة )(‪ ajax‬مببع‬ ‫‪ cache‬باستخدام الدالة )(‪ .ajax‬هببذا‬

‫تجاوز الضبط الفتراضي وتخزين الرد مؤق ًتا‪:‬‬

‫{( ‪$.ajaxSetup‬‬
‫‪cache: false‬‬
‫;)}‬

‫(‪jQuery.ajax‬‬
‫‪cache: true,‬‬
‫‪url: 'some.php',‬‬
‫'‪type:'POST‬‬
‫;)‬

‫‪223‬‬
‫الفصل الثاني عشر‪:‬‬

‫مواضيع متفرقة‬

‫‪12‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫‪ .1‬تخزين البيانات في عناصر ‪DOM‬‬


‫من الممكن عبببر الدالببة )(‪ data‬تخببزين قيم ‪) JavaScript‬أي السلسببل النصببية والعببداد والقيم‬

‫المنطقيببة ]‪ [boolean‬والكائنببات والمصببفوفات…( ضببمن عناصببر ‪ .DOM‬هببذا الحببل لتخببزين البيانببات‬

‫ً‬
‫فمثل‪ ،‬علينببا تفببادي تخببزين البيانببات‬ ‫في عناصر ‪ DOM‬أفضل من تخزينهببا كقيمببة لخاصببيات العنصببر‪.‬‬
‫ُ‬
‫سأ ِ‬
‫خز ن في المثال التي اللون الذي تم اختيبباره من القائمببة في‬ ‫في خاصيات ‪ title‬و ‪ alt‬و ‪.rel‬‬

‫ً‬
‫لحقا‪.‬‬ ‫عنصر >‪ ، <ul‬والذي يمكن أن نحصل على القيمة المُ ّ‬
‫خزنة فيه‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>"‪<style type="text/css‬‬
‫{ ‪.selected‬‬
‫;‪background-color: #ffc‬‬
‫}‬
‫>‪</style‬‬
‫>‪<body‬‬
‫>‪<ul‬‬
‫>‪<li><a href="#">red</a></li‬‬
‫>‪<li><a href="#">orange</a></li‬‬
‫>‪<li><a href="#">blue</a></li‬‬
‫>‪<li><a href="#">green</a></li‬‬
‫>‪</ul‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬

‫‪225‬‬
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

<script>
(function($)
{
$('a').click(function()
{
$this = $(this);
$ul = $this.closest('ul');
// ‫تخزين القيمة النصية الموجودة داخل العنصر‬
$ul.data('selectedColor', $this.text());
$ul.find('a').removeClass('selected')
.end().end().addClass('selected');
// ‫مختار‬
ُ‫إظهار اللون ال‬
alert($ul.data('selectedColor'));
})
})(jQuery);
</script>
</body>
</html>

ً ) jQuery ‫بببببادة على عنصبببببرٌ ُمحببببب ّدد عببببببر دالبببببة‬


:‫مثل‬ ً ‫ ُتسبببببتخ َدم ع‬data() ‫أن الدالبببببة‬
ّ ‫بببببحيح‬
ٌ ‫ص‬

ً
.‫ بمفردها‬data() ‫أيضا استخدام الدالة‬ ‫( لكن من الممكن‬$('div').data()

ِ
:‫ كل الحالتين‬jQuery ‫يوضح توثيق‬

http://api.jquery.com/data •

http://api.jquery.com/jQuery.data •

226
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫عنببد تخببزين البيانببات في عناصببر ‪ ،DOM‬فأفضببل حببل هببو اسببتخدام الدالببة )(‪ data‬الموجببودة‬

‫في ‪.jQuery‬‬

‫‪ .2‬إضافة دوال جديدة إلى مجال أسماء ‪jQuery‬‬


‫من المفي ب ببد ع ب ب ً‬
‫بادة إع ب ببادة اس ب ببتخدام مج ب ببال الس ب ببماء ) ‪ (namespace‬الخ ب بباص بمكتب ب ببة ‪jQuery‬‬

‫) ً‬
‫بدل من إنشاء مجببال أسببماء خبباص بببك( لتعريببف الببدوال لكي تتفببادى كتابببة شببيفرات موجببودة في‬

‫المجببال العببام )‪ (global scope‬لكي تتجنب التضبباربات‪ .‬إضب ً‬


‫بافة إلى ّ‬
‫أنه من المستحسببن تخببزين أيّ ب ة‬

‫دوال متعلقة بمكتبة ‪ jQuery‬والتي ل تتطلب مجموعب ً‬


‫بة من عناصببر ‪ DOM‬في مجببال أسببماء ‪.jQuery‬‬

‫يمكنك فعل ذلك بإضافة خاصية جديدة إلى كائن ‪ .jQuery‬سأضببيف في المثببال التي دالب ً‬
‫بة جديب ً‬
‫بدة‬

‫باسم )(‪ customAlert‬إلى كائن ‪) jQuery‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫)‪$.customAlert = function(text‬‬
‫{‬
‫تخزين الدالة ‪ customAlert‬في كائن ‪// jQuery‬‬

‫‪227‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫;)‪alert(text‬‬
‫;}‬

‫استدعاء الدالة ‪// customAlert‬‬


‫;)'‪$.customAlert('Hi‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫إذا كانت لديك ِ‬


‫عدة دوال مرتبطة ببعضها‪ ،‬فعليك استضافتها جميعًب ا في مجببال أسببماء مختلببف‬

‫ُ‬
‫سأن ِشبئ في المثببال التي الكببائن ‪myDialog‬‬ ‫لكي تتجنب حدوث فوضى في مجببال أسببماء ‪.jQuery‬‬

‫دوال داخل الكائن ‪ myDialog‬تتعلق به‪.‬‬ ‫خزن بدوره في كائن ‪jQuery‬؛ وسأستضيف ِ‬
‫عدة‬ ‫الذي يُ ّ‬
‫ٍ‬

‫إنشاء الكائن ‪$.myDialog = { // myDialog‬‬


‫‪ },‬شيفرة ‪show: function(){ // Show‬‬
‫‪ },‬شيفرة ‪hide: function(){ // Hide‬‬
‫‪ },‬شيفرة ‪position: function(){ // Position‬‬
‫} شيفرة ‪initiate: function(){ // Initiate‬‬
‫;}‬

‫)(‪$.myDialog.initiate‬‬

‫‪228‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫‪ .3‬حاساب قيمة خاصية من خاصيات أحاد العناصر‬


‫قبببل ضبببط قيمببة عنصببر مببا‪ ،‬من الممكن حسبباب القيمببة بتمريببر دالببة إلى الدالببة )(‪ attr‬بب ً‬
‫بدل من‬ ‫ٍ‬

‫تمريببر سلسببلة نصببية كثبباني معامببل‪ .‬وهببذا يسببمح لببك بببالمرور على العناصببر في مجموعببة التغليببف‬

‫وإضافة قيم فريدة إليها )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<div>0</div‬‬
‫>‪<div>1</div‬‬
‫>‪<div>2</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬
‫{‬
‫المرور على كل عنصر >‪ <div‬وإعطاؤه قيمة ‪ id‬فريدة ‪//‬‬
‫)‪$('div').attr('id', function(i‬‬
‫{‬
‫‪return 'div' + i‬‬
‫;)}‬

‫‪229‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫يمكن أن نكتب أيضًا ‪//‬‬


‫*‪/‬‬
‫{)‪$('div').each(function(i‬‬
‫;)‪$(this).attr('id', 'div' + i‬‬
‫;)}‬
‫‪*/‬‬
‫;)‪})(jQuery‬‬
‫>‪</script‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .4‬استخدام خاصيات ‪ CSS‬أو مكافآتها في ‪JavaScript‬‬


‫عند الحصببول أو ضبببط خاصببيات ‪ CSS‬في عناصببر ‪ ،HTML‬فببأنت أمببام خيببارين‪ :‬إمببا أن تسببتعمل‬

‫النسخة الببتي فيهببا شببرطات )‪ (-‬من اسببم الخاصببية ) ً‬


‫مثل‪ (background-color :‬وإمببا أن تسببتعمل‬

‫خاصببية ‪ JavaScript‬المكافئببة لهببا ) ً‬


‫مثل‪ .(backgroundColor :‬أهم مببا في المببر –وبغض النظببر عن‬

‫النوع الذي اخترتببه– ّ‬


‫أن ه يجب تمريببر الخاصببية كسلسببلة نصببية )أي أن تضببعها بين علمتَي اقتببباس(‬

‫ِ‬
‫أفضب ل اسببتخدام أسببماء الخاصببيات الببتي فيهببا شببرطات لنهببا تماثببل مببا‬ ‫إلى الدالببة )(‪ .css‬شخصب ًبيا‪،‬‬

‫أكتبه باستخدام ‪) CSS‬مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<body‬‬
‫>‪<p style="background-color:#990033">jQuery</p‬‬

‫‪230‬‬
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer
y.min.js"></script>
<script>
(function($)
{
alert($('p').css('background-color'));
alert($('p').css('backgroundColor'));
})(jQuery);
</script>
</body>
</html>

JavaScript ‫خاصية‬ CSS ‫خاصية‬

background background

backgroundAttachment background-attachment

backgroundColor background-color

backgroundImage background-image

backgroundPosition background-position

backgroundRepeat background-repeat

border border

borderBottom border-bottom

borderBottomColor border-bottom-color

231
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

borderBottomStyle border-bottom-style

borderBottomWidth border-bottom-width
borderColor border-color

borderLeft border-left

borderLeftColor border-left-color

borderLeftStyle border-left-style

borderLeftWidth border-left-width

borderRight border-right

borderRightColor border-right-color

borderRightStyle border-right-style

borderRightWidth border-right-width

borderStyle border-style

borderTop border-top

borderTopColor border-top-color

borderTopStyle border-top-style

borderTopWidth border-top-width

borderWidth border-width

clear clear

clip clip

color color

cursor cursor

display display

232
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

filter filter

font font

fontFamily font-family

fontSize font-size

fontVariant font-variant

fontWeight font-weight

height height

left left

letterSpacing letter-spacing

lineHeight line-height

listStyle list-style

listStyleImage list-style-image

listStylePosition list-style-position

listStyleType list-style-type

margin margin

marginBottom margin-bottom

marginLeft margin-left

marginRight margin-right

marginTop margin-top

overflow overflow

padding padding

paddingBottom padding-bottom

233
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

paddingLeft padding-left

paddingRight padding-right

paddingTop padding-top

pageBreakAfter page-break-after

pageBreakBefore page-break-before

position position

styleFloat float

textAlign text-align

textDecoration text-decoration

textDecorationBlink text-decoration: blink

textDecorationLineThrough text-decoration: line-through

textDecorationNone text-decoration: none

textDecorationOverline text-decoration: overline

textDecorationUnderline text-decoration: underline

textIndent text-indent

textTransform text-transform

top top

verticalAlign vertical-align

visibility visibility

width width

zIndex z-index

234
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫‪ .5‬الوصول إلى محتوى ‪iframe‬‬


‫عنببببببببببببببببببببببببببببدما ُتسببببببببببببببببببببببببببببتخ َدم الدالببببببببببببببببببببببببببببة )(‪ contents‬على عنصببببببببببببببببببببببببببببر ‪) iframe‬م ً‬
‫ثل‪:‬‬

‫)(‪ ($('#myiFrame').contents‬يحت ببوي على مس ببتند مُ ستض بباف على نفس النط بباق فسنحص ببل‬

‫على محتوى المستند الموجود في عنصر ‪ ،iframe‬ممببا يعطينببا وصب ً‬


‫بول إلى شببجرة ‪ DOM‬التابعببة لببه‪.‬‬

‫بزءا‬
‫وبالتالي يمكننببا اسببتخدام ‪ jQuery‬لتعببديل عناصببر ‪ DOM‬التابعببة لعنصببر ‪ iframe‬كمببا لببو كببانت جب ً‬

‫من الصفحة الصلية‪.‬‬

‫الحصول على قيمة ‪ innerHTML‬للعنصر >‪ <body‬داخل عنصر ‪// iframe‬‬


‫;)(‪$('iframe').contents().find('body').html‬‬

‫ضبط قيمة ‪ innerHTML‬للعنصر >‪ <body‬داخل عنصر ‪// iframe‬‬


‫;)'>‪$('iframe').contents().find('body').html('<p>Hi</p‬‬

‫عليك أن تعرف ما هي المحدوديات عند استخدام ‪ iframe‬يُ شير إلى مستند‬


‫ملحاظة‬
‫نطاق آخر قبل أن تحاول استخدام التقنية السابقة‪.‬‬
‫ٍ‬ ‫موجود على‬

‫‪ .6‬التحميل المسبق للصور‬


‫حم ل الصور قبل أن يحتبباج المسببتخدم إليهببا )ربمببا للحببدث ‪ .(:hover‬هبذه دالب ٌ‬
‫بة‬ ‫من الحكمة أن ُن ِ‬

‫ٌ‬
‫مخصصة في ‪ jQuery‬للتحميل المسبق للصور‪.‬‬

‫‪235‬‬
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

(function($) {
// preloadImages() ‫تعريف الدالة‬
// jQuery ‫إضافة دالة خاصأة إلى مجال أسماء‬
$.preloadImages = function(arrayOfImages) {
$(arrayOfImages).each(function() {
// src ‫ وضبط الخاصأية‬img ‫إنشاء عنصر‬
$('<img/>')[0].src = this;
});
};

// preloadImages() ‫استخدام الدالة‬


$(window).load(function() {
// window.onload ‫تحميل الصور بعد الحدث‬
$.preloadImages(['img1.jpg', 'img2.jpg',
'img3.jpg']);
});
})(jQuery);

‫ إن لم تكن طريقببة‬jQuery ‫ راجببع فصببل الضببافات في‬،‫يمكن أن تك َتب الدالببة السببابقة كإضببافة‬

ً
.‫مألوفة لديك‬ ‫كتابة إضافات‬

(function($) {
$.fn.preloadImages = function() {
// jQuery ‫ تمثل كائن‬this
return this.each(function() {

236
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫ً في المصفوفة ‪//‬‬
‫‪ this‬تمثل قيمة‬
‫;‪$('<img/>')[0].src = this‬‬
‫;)}‬
‫;}‬

‫{ )(‪$(window).load(function‬‬
‫تمرير مصفوفة إلى ‪// jQuery‬‬
‫)]'‪$(['img1.jpg', 'img2.jpg', 'img3.jpg‬‬
‫;)(‪.preloadImages‬‬
‫;)}‬
‫;)‪})(jQuery‬‬

‫‪ .7‬التحميل المسبق للوسائط عبر ‪XHR‬‬


‫من الممكن أن ُتخب ِبزن وسببائط الصببفحة مؤق ًتببا عبببر اسببتخدام طلبيببات ‪ُ ،XHR‬‬
‫وتسب ِبهل ‪ jQuery‬من‬

‫ذلبببك كثبببيرًا‪ .‬الفكبببرة هنبببا هي طلب الوسبببائط في الخلفيبببة )أي بعيببب ًدا عن أعين المسبببتخدمين( بعبببد‬

‫اكتمال تحميل الصفحة‪.‬‬

‫نس ببتطيع طلب الوس ببائط )‪ .js‬و ‪ .gif‬و ‪ .png‬و ‪ .jpeg‬و ‪ (.css‬باس ببتخدام الح ببدث )(‪load‬‬

‫ً‬
‫مسبقا قبل أن يطلبها المسببتخدم‪ .‬سببأريك في مببا‬ ‫ودالة )(‪ ajax‬في ‪ ،jQuery‬والتي يمكن أن ُن ِ‬
‫خزنها‬

‫يلي مثب ً‬
‫بال عن شببيفرةٍ يمكن أن ُتسببتعمَ ل لتخببزين الملفببات مؤق ًتببا بعببد جلبهببا من الخببادم عبببر عمليببات‬

‫تجري في الخلفية بعد إكمال تحميل الصفحة‪.‬‬

‫‪237‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫{)‪(function($‬‬
‫انتظار الحدث ‪// window.onload‬‬
‫{)(‪$(window).on("load", function‬‬
‫ًا ‪//‬‬
‫ثم تحميل الوسائط وتخزينها مؤقت‬
‫;)} "‪$.ajax({ url:"javascript.js", dataType:"text‬‬
‫;)} "‪$.ajax({ url:"image.gif", dataType:"text‬‬
‫;)} "‪$.ajax({ url:"flash.swf", dataType:"text‬‬
‫;)} "‪$.ajax({ url:"styles.css", dataType:"text‬‬
‫;)}‬
‫;)‪})(jQuery‬‬

‫افتراضيا‪ ،‬لكن يمكنك تمرير‬


‫ً‬ ‫ست ّ‬
‫خزن مؤق ًتا‬ ‫أن الملفات المطلوبة ُ‬
‫أبق في ذهنك ّ‬
‫ِ‬
‫وسيط إلى دالة )(‪) ajax‬الذي هو }‪ ({cache: false‬لكي تطلب عدم‬
‫تخزين عنوان ‪ URL‬المطلوب مؤق ًتا‪ً .‬‬
‫إذا من الممكن إجبار المتصفح على عدم‬

‫أن ذلك عديم الفائدة لننا نحاول من‬


‫تخزين الوسائط التي تطلبها؛ ربما ترى ّ‬ ‫تنويه‬
‫الصل تخزين الملفات مؤق ًتا‪ ،‬لكن ذلك جديرٌ بالذكر ويمكن أن تستفيد منه في‬

‫الحالت التي تريد أن يحصل فيها المستخدم على نسخةٍ جديدةٍ من الملف‬

‫في كل مرة‪.‬‬

‫‪238‬‬
‫تعلم ‪jQuery‬‬ ‫الفصل الثاني عشر‪ :‬مواضيع متفرقة‬

‫‪ .8‬إضافة فئة ‪ CSS‬إلى عناصر ‪ HTML‬لكي تظهر تلك العناصر في‬

‫عط َلت ‪JavaScript‬‬


‫المتصفحات التي ّ‬
‫يمكننبببا أن تعبببرف إن كبببان متصبببفح المسبببتخدم قبببادرًا على تشبببغيل شبببيفرات ‪ JavaScript‬عببببر‬

‫معينببة للخاصببية ‪ class‬في عناصببر ‪ .HTML‬وذلببك بإنشبباء فئببة ُت ّ‬


‫طبق على عناصببر‬ ‫ّ‬ ‫اسببتخدام قيمببة‬

‫صفحة ‪ HTML‬في المتصفحات التي تدعم ‪ JavaScript‬فقببط‪ ،‬وسنسببتفيد كثببيرًا من هببذه التقنيببة إذا‬

‫أردنا إخفاء أجزاء من الصبفحة إن كبان المتصبفح يببدعم ‪ .JavaScript‬وإن لم يكن يببدعمها )أو كببانت‬

‫معطل ً‬
‫ببببببة( فلن ُتخفى أيّبببببب ة عناصببببببر‪ .‬سببببببنخفي في المثببببببال التي جميببببببع عناصببببببر >‪ <div‬إذا كببببببانت‬

‫‪ JavaScript‬مفعّ ً‬
‫لة )مثال حي(‪:‬‬

‫>‪<!DOCTYPE html‬‬
‫>"‪<html lang="en‬‬
‫>‪<style‬‬
‫{ ‪.js div‬‬
‫;‪display: none‬‬
‫}‬
‫>‪</style‬‬
‫>‪<body‬‬
‫>‪<div>Hide if JavaScript is enabled!</div‬‬
‫‪<script‬‬
‫‪src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquer‬‬
‫>‪y.min.js"></script‬‬
‫>‪<script‬‬
‫)‪(function($‬‬

‫‪239‬‬
jQuery ‫تعلم‬ ‫ مواضيع متفرقة‬:‫الفصل الثاني عشر‬

{
$('html').addClass('js');
})(jQuery);
</script>
</body>
</html>

240

You might also like