Professional Documents
Culture Documents
تعلم jQuery
ترجمة
ت
تعلم jQuery تقديم
أصببببح ظببباهرًا للعيبببان كيبببف أصببببحت مكتببببة jQueryمن أشبببهر مكتببببات JavaScriptوأكثرهبببا
استخدامً ا ،إذ تستعملها كبرى الشركات كشركة Googleوالبرمجيات الشهيرة كبرمجية ،WordPress
ُ
وحاولت أن أتوخى فيه الدقة مع الحفاظ على بساطة الشرح ووضوحه. ستتعلمها في المستقبل،
ٌ
مبببترجم عن كتببباب » «jQuery Enlightenmentلصببباحبه ،Cody Lindleyوالبببذي هبببذا الكتببباب
مرخص بمببوجب رخصببة المشبباع البببداعي َ » Creative Commonsنسببب المُ صبنّف -
ٌ هذا الكتاب
لمعلومبات
ٍ غير تجاري -الببترخيص بالمثببل ، (Attribution-NonCommercial-ShareAlike 4.0) «4.0
وفي النهاي ببة ،أحم ببد ا على توفيق ببه لي بإتم ببام العم ببل على الكت بباب ،وأرج ببو أن يك ببون إض ب ً
بافة
ً
مفيدة للمكتبة العربية ،وا ولي التوفيق.
4
هذا الكتاب برعاية
بهببا ،يكتب فيببه عببدد من المتطببوعين المهتمين بالبرمجيببات الحببرة والتقنيببة بشببكل عببام؛ يهتم وادي
التقنية بمواضيع مثل أنظمة التشغيل الحاسببوبية والهاتفيببة ،ولغببات البرمجببة ،والمكتبببات البرمجيببة،
وتقنيات الويب ،وأخبار شركات البرمجة الكبرى ،والمصادر المفتوحة ،والعتاد وأجهزة الحاسوب .
دعم وادي التقنيبببة كتاببببة العديبببد من الكتب التقنيبببة في مجبببال البرمجيبببات الحبببرة ومفتوحبببة
ً
مجان ا للمستخدم التقني العربي ،ومن أهم الكتب التي دعمها وادي التقنية: المصدر ،وتوفيرها
جدول المحتويات
تقديم3...............................................................
تمهيد13............................................................
.1اصطلحات 14..................................................................................... jQuery
ٌ
وشرح أقل 15............................................................................... ٌ
شيفرات أكثر .3
.6افهم الدالة )( textفي jQueryفهمً ا تامً ا قبل قراءة هذا الكتاب 17.................................
ِ
ضمن جميع ملفات CSSقبل تضمين 24....................................................... jQuery .5
ُ
متعددة الستخدامات 38............................................................... ُ
الدالة jQuery .14
ً
مباشرة دون 45.................jQuery .16استخراج العناصر من مجموعة التغليف لستخدامها
كافيا 51.......................
ً .19استخدام )( .eachعندما ل يكون الدوران الضمني على العناصر
ُ .20
ستعاد العناصر في مجموعة تغليف jQueryبنفس ترتيب ورودها في المستند56 ...........
ِ
المرش َحين :hiddenو 62................................................... :visible .2تمييز الفرق بين
.4يمكنك أن ُت ِ
مرر أكثر من مُ ِ
حدد إلى 66......................................................... jQuery
.8تحديد العناصر عبر خاصية idعندما تحتوي قيمتها على محارف خاصة 77....................
.10إنشاء مُ ِ
رشحات متشعبة 80.............................................................................
معط ًل120....................................
ّ .2كيفية تحديد إذا كان أحد عناصر النموذج ُمفعّ ًل أم
.5معرفة فيما إذا كان مربع اختيار أو مربع انتقاء مختارًا أم ل 124..................................
مخفيا 126...........................................................
ً ٌ
حقل في النموذج .6معرفة إذا كان
.8ضبط والحصول على القيمة المُ ح ّددة لعنصر اختيار من متعدد 129...............................
ُ .3
ستشير thisداخل إضافة إلى كائن jQueryالحالي 175.............................................
ُ .4تس ببتخ َدم )( eachللم ببرور على كببائن jQueryوتوف ببير مرجعي ببة إلى كببل عنص ببر في ذاك الكببائن
ُ .5تعيد الضافات عمومً ا كائن jQueryلكي نتمكن من متابعة السلسببلة باسببتخدام دوال jQuery
الخرى 178......................................................................................................
.6خيارات الضافة الفتراضية 180........................................................................
برمجيا 186......................................
ً .9إنشاء العناصر أثناء التنفيذ واستدعاء الضافات
.4تخزين مجموعة العناصر المُ ح ّددة التي ُتستخ َدم أكثر من مرة مؤق ًتا194.......................
.6تحسين الداء عبر تمرير كائن يحتوي على مفاتيح وقيم إلى دوال 197...............jQuery
عدة ُم ِ
حددات إلى دالة 198.......................................... jQuery .7تحسين الداء بتمرير ِ
ً
مباشرة200.............. .10تغيير المظهر باستخدام IDو ً Class
بدل من تعديل خاصيات style
.4استخدام الدوال )( showو )( hideو )( toggleدون حركة 209.....................................
عط َلت
.8إض ببافة فئ ببة CSSإلى عناص ببر HTMLلكي تظه ببر تل ببك العناص ببر في المتص ببفحات ال ببتي ّ
239................................................................................................. JavaScript
تمهيد
ت
تعلم jQuery تمهيد
برحا بسب ً
بيطا مختصببرًا لكي تصبببح ُ
كتبت هذا الكتاب لشرح المفاهيم الساسية لمكتبببة jQueryشب ً
ُ
والغبببرض منبببه هبببو تعريفبببك على الممارسبببات الشبببائعة بين ُمبرمِ ًج ا ذا مسبببتوى متوسبببط أو متقبببدم،
بل فيب ببه على المعلومب ببات اللزمب ببة لكي تصب بببح مطب ب ِبور ُ
صب ببفوف مطب ببوري jQuery؛ ويحتب ببوي كب ببل فصب ب ٍ
jQueryمحترف.
كتبب ب ا تعريفي ب ً
بة بمكتب ببة بوع مَ ن ق ببرؤوا ً ٌ
بم أول ن ب ٍ
بواع من الق ببراء .يض ب ُ
ٍ ملئم لثلث ببة أن ب ه ببذا الكت بباب
jQueryويتطلعون إلى الخطوة التالية .والنوع الثاني من القراء هم مطورو JavaScriptممن لديهم
أن ُ
أخبرتببك ّ خبببرة وتجربببة مببع إحببدى المكتبببات ويريببدون الن تعلم jQueryبسببرعة .ول ُتفاجببأ إذا
من المهم أن تتعببرّ ف – قبببل أن نبببدأ– على بعض المببور التنظيميببة المسببتعملة في الكتبباب ،أرجببو
.1اصطلحاات jQuery
(jQueryأقصبببببببد ببببببببه »الدالبببببببة البانيبببببببة «jQuery المصبببببببطلح »دالبببببببة function) « jQuery
)أي )( jQueryأو الشكل البديل )( ،($وهي ُتستخ َدم لنشاء نسخة من كائن .jQuery
ّ
المغلف ببة )(wrapped المص ببطلح »مجموع ببة التغلي ببف« ) (wrapper setيُ ش ببير إلى عناص ببر DOM
ح ب ِد َدت
وسيس ب ببتعمَ ل ه ب ببذا المص ب ببطلح تحديب ب ب ًدا للش ب ببارة إلى العناص ب ببر ال ب ببتي ُب ب
ُ ض ب ببمن دوال .jQuery
باسبببببببتخدام دالبببببببة .jQueryربمبببببببا تسبببببببمع البعض يبببببببدعو هبببببببذا الصبببببببطلح »بمجموعبببببببة «jQuery
14
تعلم jQuery تمهيد
تقض وق ًتببا
ِ مفبباهيم عن jQueryمعزولببةٍ عن بعضببها وهي ترتبببط بعنببوان الفصببل .إذا لم
ٍ فصببل على
ٍ
ً
طويل في صفحات التوثيق في موقع jquery.comفأنصحك بفعل ذلك قبل قراءة هذا الكتاب.
وشرح أقل
ٌ شيفرات أكثر
ٌ .3
بودة فيببه جيب ًدا .يجب أن تنظببر إلى متعم ًدا أن يتفحص القببارئُ المثلب َ
بة الموجب َ ِ ُ
كتبت هببذا الكتبباب
أن الش ببيفرة تس بباوي أل ببف كلم ببة .ل تقل ببق إن زاد
بق بالش ببيفرة .أرى شخص ب ًبيا ّ
بانوي ملح ب ٍبأمر ث ب
الش ببرح ك ب ٍ
ٍ
ِ
وتكببرر هببذه ً
مببرة أخببرى، ِ
تفحص الشببيفرة وقببراءة التعليقببات الشببرح حيرتببك في البدايببة؛ إذ عليببك
ً
واضحا .أرجو أن تصببل إلى مرحلببةٍ من الخبببرة كيل العملية حتى يصبح المفهوم الذي أحاول شرحه
ً
توثيقا جي ًدا لكي تستوعب أحد المفاهيم البرمجية. تحتاج إل إلى شيفرةٍ موثقةٍ
بحيح ّ
أنه ليس من الضببروري اسببتخدامها ،إل ٌ بكل ممتبباز في جميببع المتصببفحات؛ صب
وتعمببل عملهببا بشب ٍ
أنبببني لم أشبببأ إضبببافة بعض التعقيبببدات الناجمبببة عن اسبببتخدام 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 تمهيد
الكتاب
سنستخدم الدالة )( textالتابعة لمكتبة jQueryكثيرًا في المثلببة في هببذا الكتبباب .وعليببك أن
أن الدالببة )(– textعنببدما ُتسببتخ َدم على مجموعببةِ تغليب ٍبف ) (wrapper setتحتببوي على
تنتبببه إلى ّ
عنصر– ستؤدي إلى دمج عناصر مجموعببة التغليببف وإعببادة سلسببلة نصببية لجميببع النصببوص
ٍ أكثر من
النص
َ كنت تتوقببع أن ُتعي ب َد الدالب ُ
بة َ ربمببا يشوشببك هببذا إذا الموجببودة في كببل العناصببر المشب ِ
بكلة لهببا.
><!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 تمهيد
JavaScriptو .CSS
ولمّبب ا كببان هببذا الكتبباب معتمبب ًدا اعتمببا ًدا أساس ب ًبيا على المثلببة لشببرح مفبباهيم ،jQueryفارت ب ُ
بأيت
ضببرورة توفببير أمثلببة هببذا الكتبباب للتجربببة المباشببرة على متصببفحات الببويب؛ ويمكنببك الوصببول إلى
التجربة الحية للمثلة بالضغط على الرابط الموجود قبلها »)مثال حي(«.
ُ
اعتمدت على ذلك أثناء عملي على هذا الكتاب. أنا ل أشجعك على تعديل الشيفرات فحسب ،وإنما
18
الفصل الول:
1
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
بق عنصب ببرًا أو عناصب ببرَ من شب ببجرة DOMمن مسب ببتند HTMLوافعب ببل بهب ببا شب ببي ًئا مب ببا
بب ببه« .تحدي ب ب ًدا :انتب ب ِ
><!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
ٍ تحديببد
كمبرمج . jQuery
ً
أيض با .وبالتببالي يمكن توسببعة المفهببوم وراء بيء مببا«
توسببعة هببذا المفهببوم لضببيف عليببه »إنشبباء شب ٍ
بعد ذلك.
ننش بئ في المثببال التي عنصببرًا جدي ب ًدا هببو > <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 كما لو ّ
أنه موجو ٌد
نفسببه وفي رابببط 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
المعايير التقريبي
بفح بحيحا عنببدما يُ ِ
حمل المتصب ُ ً ً
عمل صب هنالك مشاكل معروفة مبع دوال jQueryفي ّ
أنهببا ل تعمببل
بفح يُ ِ
فسب بر ّ ّ َ
ص ببفحة HTMLبنم ببط التج بباوزات ) .(quirks modeتأكد أنك تس ببتخدم jQueryفي متص ب ٍ
HTMLبنمببط المعببايير ) (standards modeأو نمببط المعببايير التقريبببي )(almost standards mode
بإصدار :HTML5
23
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
><!DOCTYPE html
الخاص )( .readyوبسبب هذا التغيير في jQuery 1.3فعليك دومًب ا إضببافة جميببع ملفببات CSSقبببل
ً
لحقب ا في مسببتند .HTMLلكن ربمببا تكببون الصببور المُ شببار إليهببا عبببر CSSقببد JavaScriptالموجببودة
وربطها إلى مستند HTMLعبببر وضببع الملببف المصببدري للمكتبببة في مببوقعهم )أو نطبباقهم( الشخصببي.
مصدر آخر.
ٍ لكن هنالك خيارات أخرى التي تسمح لك باستخدام jQueryمن
تستضيف ِ Google
عدة نسخ من الشببيفرة المصببدرية لمكتبببة jQueryبغببرض إتاحتهببا لمن يشبباء
اسببتخدامها ،وهببذا رائببع! سأسببتخدمُ في المثببال التي العنصببر > <scriptلتضببمين نسببخة مُ صب ّبغرة
><!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هي السببرعة والوثوقيببة والحتمببال الكبببير أن
ً
مسبقا على جهاز العميل. خز ً
نة تكون المكتبة ُم ّ
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
26
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
{
;)'!alert('No really, the DOM is ready
;)}
27
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
س َتضمَ ن صحة عرض جميع العناصر في DOMقبل بدء تنفيذ شيفرات .jQuery
المستند
َ
بدوث الحببدث .window.onloadوهببذا هببو الغببرض من اسببتخدام حببدث خبباص ً
عادة حب ل ننتظر
مثل )( 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و )( unloadمن قبببل ،لكنهمببا أمسببتا مهملببتين
ً
بدل منهما ،وسنشرح ذلك باستفاضة في الفصل السادس »الحداث في .«jQuery
29
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
ً
معتمبببببدة على جهازية تسبببببتطيع تفبببببادي الحبببببدث )( readyتمامًببببب ا إذا لم تكن شبببببيفرة JavaScript
شجرة .DOM
بديلت
ٍ وخصوص با شببيفرات –jQueryتتضببمن تعب
ً أغلبيببة شببيفرات JavaScriptفي هببذه الونببة –
التعامببببببل معهببببببا .وهببببببذا هببببببو السبببببببب وراء اسببببببتعمال المطببببببورين للحببببببدث window.onloadفي
السنوات الماضية.
لتفادي استخدام الحدث )( readyمع الشيفرات التي تتعامل مببع ،DOMيمكنببك ببسبباطة وضببع
الش ببيفرة في مس ببتند HTMLقب ببل وس ببم الغلق للعنص ببر > .</bodyوبفعل ببك ل ببذلك ستض ببمن انته بباء
ُ
وضببببعت الشببببيفرة قبببببل نهايببببة جسببببم لن أسببببتعمل في المثببببال التي الحببببدث )( 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في أسبببفل الصبببفحة سب ببيؤدي إلى تجنب اسب ببتخدمنا للحبببدث
تحسين أدائها.
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للتعامل مع عناصر 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
ال ببتي يمكن أن ُتس ببتخ َدم في وس ببط السلس ببلة عن ببدما » َتضب ب ِبط« القيم ببة النص ببية للعنص ببر ،لكن الدال ببة
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
;)alert(theText
ل يمكن إكمال السلسلة بعد )( textلن السلسلة قد //
ة نصيٌ
َت سلسلٌ ُ
ة ،وليس كائن // jQuery انقطعت حيث أعيد
)})(jQuery
35
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
></script
></body
></html
مثبببال عن كيفيبببة
ٍ الحصبببول على النص الموجبببود ضبببمن عنصبببر باسبببتخدام )( textهبببو أبسبببط
ً
نصببية تحتببوي ً
سلسببلة لن إحببدى الببدوال )الببتي هي )( textفي مثالنببا( أعببادت
»كسببر« السلسببلة ّ
القيمة النصية للعقدة ) ،(nodeولم ُتعِ د مجموعة التغليف الخاصة بكائن .jQuery
ُ
فستكس ببر السلس ببلة، أنه إذا لم ُتعِب ب د إح ببدى دوال jQueryمجموع ب َ
بة التغلي ببف، يجب ّ
أل يُ دهش ببك ّ
ٌ
هادمة« ).(destructive ٌ
دوال » و َنع َت ِبر هذه الدوال ّ
أنها
)(end
عتبب ر الببدوال الموجببودة في jQueryوالببتي ُتعب ِ
بدل مجموعببة التغليببف الصببلية في ّ jQuery
أنهببا ُت َ
دوال هادم ب ٌ
بة ) .(destructiveالس بببب وراء ذل ببك ه ببو ع ببدم حفاظه ببا على الحال ببة الص ببلية لمجموع ببة ٌ
بيء أو يُ حب ب َ
بذف .وإنمب ببا سب ب ُبتربَط مجموعب ببة التغليب ببف السب ببابقة التغليب ببف؛ لكن ل تقلب ببق لن »يُ ه ب ب َدم« شب ب ٌ
ُ
فباس ب ببتخدامنا للدال ب ببة )( 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
متعددة الستخدامات
ُ ُ
الدالة jQuery .14
الدال ب ببة jQueryهي دال ب ب ٌ
بة متعببببددة الس ب ببتخدامات ،فيمكنن ب ببا تمري ب ببر مختل ب ببف القيم وتنس ب ببيقات
38
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
ِ
بمحددات ،CSSبالضافة إلى تحديد العناصر من شجرة DOMباستخدام تعابير شبيهة •
إمكانية استخدام تعابير خاصة بمكتبة jQuery؛ والقدرة على تحديد العناصر عبر مكانها
إنشاء عناصر HTMLأثناء التنفيذ ،بتمرير سلسلة نصية تحتوي على شيفرة HTMLالتي •
اختصار للحدث )( 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 المفاهيم الساسية في:الفصل الول
ً
وإن لم يكن ذل ب ببك ش ب ببائعً ا،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
الكلمةِ المحجوزةِ thisللشارة إلى كائن DOMالذي استدعى الحدث .المثببال التي يحتببوي شببيفرة
jQueryوالتي ستَر ِبط الحدث الخاص )والموجود في مكتبة mouseenter (jQueryإلى كل عناصر
سبببي َ
طلق ُ ٌ
حبببدث مُ ضبببمّ ٌن في لغبببة JavaScriptباسبببم mouseoverوالبببذي > <aفي الصبببفحة .هنالبببك
عنببدما يببدخل مؤشببر الفببأرة أو يخببرج من عنصب ٍبر ابن ) ،(child elementبينمببا ل يفعببل ذلببك الحببدث
><!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الحالي .وفي كل مرة ستلمس فيها الفأرة النص
ً
فبدل من: ،jQuery
42
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
لن الدالببة jQueryل تقبببل تمريببر تعببابير لتحديببد العناصببر فحسببب ،وإنمببا تقبببل
ممكن ّ
ٌ مببا سبببق
ضب ب با تمري ب ببر مرجعي ب ببة ) (referenceإلى كائن ب ببات .DOMحيث ُتش ب ببير الكلم ب ببة المحج ب ببوزة thisفي
أي ً
بدهيا؛ ففعببل السبب وراء رغبتك باستخدام jQueryمع كائنببات DOMيجب أن يكببون واضب ً
بحا وبب ً
ذلببك سببيعطيك إمكانيببة اسببتخدام دوال jQueryوتطبيقهببا على شببكل سلسببلة على تلببك الكائنببات إن
َ
احتجت إلى ذلك.
المرور على مجموعة من العناصببر الموجببودة ضببمن مجموعببة تغليببف في jQueryهببو أمببرٌ يشببابه
ً
سابقا .فيمكننا المببرور على كببل عنصب ٍبر من عناصببر شببجرة DOMوالموجببود في المفهوم الذي ناقشناه
ً
وصول إلى كببل عنصببر DOM مجموعة تغليف باستخدام الدالة )( eachفي .jQueryوهذا ما يمنحنا
وسنسببتخدم الدالببة )( 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
عنصر > <aفي الصفحة؛ ولوجود ثلثة عناصر > <aفي الصببفحة فسببتمرّ حلقببة التكببرار ثلث مببرات
مباشرة
ً .16استخراج العناصر من مجموعة التغليف لستخدامها
دون jQuery
إذا ح ّد َ
دت عناصر HTMLباستخدام jQueryفهذا ل يعني أب ًدا أنببك سببتفقد الوصببول إلى عناصببر
دومب ب ا اس ب ببتخراج عنص ب ببر من مجموع ب ببة التغلي ب ببف والتعام ب ببل مع ب ببه ع ب بببر لغ ب ببة
ًب DOMنفس ب ببها .يمكن ب ببك
.JavaScriptعلى سببببببيل المثبببببال ،سأضببببببط –في المثبببببال التي– خاصبببببية titleلعنصبببببر > <aفي
><!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
لكن هنالببك خيببارٌ آخببرٌ هنببا .إذ يمكنببك تفببادي اسببتخدام الدالببة )( getعبببر اسببتخدام القببواس
المربع ببة على كببائن jQueryنفس ببه )والببتي ُتس ببتعمَ ل للوص ببول إلى عناصببر المصببفوفات( .ففي س ببياق
;'$('a').get(0).title = 'jQuery.com
لتصبح كالتي:
;'$('a')[0].title = 'jQuery.com
ِ
أفضبل اسببتخدام القببواس ستتمكن في كل الطريقببتين من الوصببول إلى عنصببر .DOMشخصب ًبيا
المربعببةّ ،
لنهببا أسببرع إذ سنسببتخدم حينئببذٍ JavaScriptللحصببول على عنصب ٍبر من عناصببر المصببفوفة،
ً
بدل من الحاجة إلى استخدام إحدى دوال .jQuery
46
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
برس إليهب ببا إلى إعب ببادة جميب ببع عناصب ببر 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
استخدام )( getسيؤدي إلى »كسر« سلسلة دوال .jQueryحيث ستأخذ هذه
َ
مجموعة التغليف وستحولها إلى مصفوفةٍ من عناصر DOMالتي لم تعد ُ
الدالة
ملحاظة
ُمضمّ ن ًَة في كائن .jQueryوبالتالي استخدام الدالة )( .endلن يستعيد
مببا! أبسببط حببل هببو اسببتخدام العبببارة الشببرطية ifللتأكببد إن كببانت مجموعببة التغليببف تحتببوي أيّ ب ة
><!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
نستطيع تجنب استعمال العبارة الشرطية ،ifلكن ذلك مستحسن؛ فاستدعاء الدوال على مجموعببة
تغلي ببف فارغ ببة ق ببد يس ببتهلك وقت معالج ببة إض ببافي ،وق ببد تحص ببل على نت ببائج غ ببير مرغ ببوب فيه ببا إن
49
تعلم jQuery الفصل الول :المفاهيم الساسية في jQuery
ً
دونبببببا عن ،jQueryويسببببباعدك ذلبببببك في تجنب إع ب ببادة رببببببط المح ب ببرف $بمكتب ب ببة أخبببببرى تس ب ببتعمله
أنك تطب ِبور تطبببيق ويب لشببركة باسببم ،XYZفربمببا تجببد من المناسببب أن ُت ِ
خص بص jQuery لنقببل ّ
><!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
كافيا
ً
بحا بالنسبببة إليببك ّ
أنه إذا كببانت لببديك صببفحة ) HTMLكالظبباهرة في المثببال أن يكببون واضب ً
آمببل ّ
سببت ِ
حدد العناصببر الثلثببة في ُ أن تعليمببة jQueryالتاليببة
أدنبباه( وفيهببا ثلثببة عناصببر > <divفارغببة ّ
ُ
وستضيف السلسلة النصية »«I am a div ضمنيا ] ([implicit iteration
ً الصفحة ،وتمر عليها )دوارًا
><!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
يتطلب المرور على كل عنصر وضبط القيمة النصية لكل > <divإلى النص » .«I am a divوهذا ما
ما سبق مفي ٌد ج ًدا ،وأغلبية دوال jQueryتستعمل الدوران الضببمني .لكن سب ُبت ّ
طبق بعض الببدوال
على أوّ ل عنصبببر في مجموعبببة التغليبببف فقبببط .على سببببيل المثبببال ،الدالبببة )( attrالتابعبببة لمكتببببة
jQueryستصببببببل إلى أول عنصببببببر في مجموعببببببة التغليببببببف عنببببببدما ُتسببببببتخ َدم للحصببببببول على قيمة
إحدى الخاصيات.
ضمنيا
ً ً
دورانا ُ
فستطبِق jQuery عند استخدام الدالة )( attrلضبط خاصية،
ملحاظة
لضبط الخاصية لجميع العناصر الموجودة في مجموعة التغليف.
تحتببببوي مجموعببببة التغليببببف في الشببببيفرة التيببببة على جميببببع عناصببببر > <divالموجببببودة في
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
أن الشببيفرة السببابقة طويلببة ج ب ًد ا؟ أليس من الفضببل أن نمببر بحلقببة تكببرار على عناصببر
أل تببرى ّ
مجموع ببة التغلي ببف ومن ثم نس ببتخرج قيم ببة الخاص ببية 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
ورودها في المستند
بائج كمببا هي مرتبب ٌ
بة في المسببتند سيعيد مُ حب ِبركُ التحديببد النتب َ
في إصدار 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
ثاني ا
ًب أنك إن لم تب ِ
بوفر معببامِ ًل )(parameter ً ) document
مثل ($('a', document) :وهببذا يعببني ّ
لدالببة ً ) jQuery
مثل (jQuery() :لتحديببد مببا هببو السببياق الببذي سب ُبت ّ
نفذ فيببه طلبيببة ،DOMفسببيكون
من الممكن معرفبببة السبببياق البببذي ُتجبببري فيبببه دالبببة 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
ً
ٍ
سلسلة وحايدة .22إنشاء ُبنية DOMكاملة مع أحاداثها في
نشئ بُنى DOMكاملة ً
بدل من إنشبباء عنصببر يمكنك عبر استخدام دوال jQueryفي سلسلة أن ُت ِ
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
60
الفصل الثاني:
2
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
ستعم َلت
ِ حدد العناصر إن اُ لم ِ
رشحات jQueryالخاصة أن ُت ِ .1يمكن ُ
بمفردها
ليس من الضببببببببببببببروري توفببببببببببببببير عنصببببببببببببببر عنببببببببببببببد اسبببببببببببببببتخدام المرشبببببببببببببببحات ) (filtersمثل
ِ
)' ،$('div:hiddenفمن الممكن ببساطة تمريببر المُ رشبح بمفببرده في أي مكببان يمكنببك وضببع تعبب ٍ
بير
للتحديدِ فيه.
بعض المثلة:
ِ
المرش َحين :hiddenو :visible .2تمييز الفرق بين
َ
خاصية visibilityفي ل يأخذ المُ ِ
رشحان :hiddenو :visibleالخاصان بمكتبة jQuery
مخفيا
ً CSSبالحس بببان كم ببا ق ببد تتوق ببع .فالطريق ببة ال ببتي تس ببتعملها jQueryلتحدي ببد إن ك ببان العنص ببر
ً
قيمبببببة أكببببببر من الصبببببفر لحبببببدى الخاصبببببيتين الدقبببببة ،يكبببببون العنصبببببر ظببببباهرًا إذا أعببببباد المتصبببببفح
displayفي CSSذات القيمب ببة blockلكنب ببه محتب ببوى في عنصب ب ٍبر لب ببه الخاصب ببية displayوقيمتهب ببا
62
jQuery تعلم jQuery تحديد العناصر في:الفصل الثاني
ّ
ّ وتأكببد
على الببرغم منtrue أنك تفهم لمبباذا القيمببة المُ عببادة هي ّ ُت
فحص الشببيفرة التيببة بعنايببة
<!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
استخدام تعبير أو مُ ِ
رشح ) (filterللتحقق من احتواء المجموعة الحالية عليه وذلك بوسبباطة الدالببة
المُ ِ
رش ح الذي استخدمناه .وإن لم تحتوي المجموعة على ذلك العنصر فسب ُبتعاد القيمببة .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
64
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
أن الدال ببة )( alertالثاني ببة س ببتعيد falseلع ببدم احت ببواء مجموع ببة
جليب ا ل ببك ّ
ًب يجب أن يك ببون
التغليببف في مثالنببا على عنصببر > <divلببه خاصببية idذات القيمببة .i2الدالببة )( isمفيب ٌ
بدة ج ب ًدا إذا
عنصر معين.
ٍ َ
أردت معرفة إن احتوت مجموعة التغليف على
ُ -تستعمَ ل الدالة )( filterمن قِ َبل دوال jQueryالداخلية الخرى ،لذا أيّ ة
ً
أيضا. قواعد تنطبق عليها هناك ستنطبق هنا
ملحاظات
َ
الدالة )' is('.classلتحديد إن كان يملك عنصرٌ -يستعمل بعض المطورون
ً
دالة لفعل ذلك اسمها أن jQueryتملك
تنس ّ
عينة ،لكن ل َ ما َ
فئة ُ CSSم ّ
)' hasClass('classالتي يمكن أن ُتستعمَ ل على العناصر التي تحتوي على
داخليا.
ً )(is
65
تعلم jQuery الفصل الثاني :تحديد العناصر في 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
معينة والتي ُ
ستضبباف جميعًب ا إلى مجموعببة ّ سي ِ
حدد عناصرَ DOM تعبير من التعابير السابقة ُ
ٍ ُ
كل
أن جميببع
بق ببالببك ّ
التغليببف .يمكنببك بعببد ذلببك التعامببل مببع تلببك العناصببر باسببتخدام دوال .jQureyأبب ِ
العناصر المُ ح ّد دة ستتواجد في نفس مجموعة التغليببف .يمكن إظهببار نفس النبباتج لكن بطريقببة غببير
فعالة وليس ذات كفاءة عبر استدعاء الدالة jQueryثلث مرات :مرّ ًة لكل تعبير.
التغليف .يمكنك فعل ذلببك عبببر خاصببية 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
العناصببر في صببفحة ويب الببتي مكانهببا »مطلببق« ) .(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';
};
69
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
;)alert($('div:positionAbsolute').length
;)})(jQuery
></script
></body
></html
بددات خاص ببة ب ببك؛ لكن قب ببل أن تض ب ّبيع وقت ببك بإنش بباء مُ ح ب ِ
بدد ُم ّ
خصب بص .jQueryيمكن ببك إنش بباء ُمح ب ِ
فج ببرب ً
أول اس ببتعمال الدالببة )( filterم ببع تحدي ببد دالببة للترش ببيح .على سبببيل المث ببال ،يمكن ببك أن
)(.filter
أو //
70
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
:first •
:last •
:even •
:odd •
):eq(index •
):gt(index •
):lt(index •
رشحات التي ُت ِ
رشح مجموعة التغليف نفسها تبدأ بترشيح المجموعة من المُ ِ
71
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
اسببببتخدام :firstسببببيؤدي إلى تحديببببد أول عنصببببر في المجموعببببة بينمببببا اسببببتخدام :last
العناصببببببر الموجببببببودة في شببببببجرة .DOMوبالتببببببالي يجب أن تسببببببتنتج لمبببببباذا سببببب ُبتعيد المرشببببببحات
ّ
وتفحص الشببيفرة التيببة منطقي ا بالنسبببة لببك،
ًب تكببون هنالببك مجموعب ٌ
بة وحيببدة .يجب أن يكببون المببر
><!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
ٌ
ببببببيهة بتعبببببابير CSSالشبببببهيرة لتحديد بببببددات خاص ٌ
بببببة بمكتببببببة jQueryوالخبببببرى ش بعض تلبببببك المُ ح ِ
عناصر .DOM
:first-child •
مليا إلى المثال التي لزالة الغموض عمّ ا سبق )مثال حي(:
انظر ً
><!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
عناصببر > <liفي صببفحة الببويب والببتي هي »أبنبباء« ) (childrenلعناصببر أخببرى ومن ثم ترشببيحها
ِ ٌ
أن مجموعببة التغليببف هنببا مبنيببة على ُمرشب ٍ
ح الببذي يأخببذ بالحسبببان عناصببر > <liأبنبباء .الفكببرة هي ّ
علقببة العنصببر مببع غببيره من العناصببر في ،DOMوقببد تتواجببد مثببل هكببذا علقببة في أكببثر من مكببان
في المستند.
76
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
خاصة
بة من المحب ببارف الخاصب ببة ) ً
مثل (> = [] ~ # :والب ببتي بددات 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"] :
معينة ذات قيم مُ ح ّددة .على سبيل المثال ،شببيفرة jQueryالتيببة سب ُبت ِ
حدد عناصببر > <aفي صببفحة ّ
HTMLالتي:
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
ُختارة //
تحديد جميع مربعات الختيار الظاهرة والم
)'$(':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
81
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
المرشح )(:nth-child
.11التعرف على استعمالت ُ
مثل أن ُتحب ب ِ
بدد عب بببره العنصر ِ
المرش ب بح )( :nth-childلب ببه العديب ببد من السب ببتعمالت ،فيمكنب ببك ً
> <liال ببذي ترتيب ببه ه ببو الث ببالث والموج ببود ض ببمن عنص ببر > .<ulتفحص الش ببيفرة التي ببة لكي تفهم
><!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تجمع محتويات جميع العناصأر //
ّ
تذكر أن
الموجودة في مجموعة التغليف في سلسلة نصية واحدة //
83
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
></body
></html
النمطية
ِ
فجرب أن مُ ِ
رشحات الخاصيات في 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));
}
85
تعلم jQuery الفصل الثاني :تحديد العناصر في jQuery
></script
></body
></html
والحافاد
يمكن تحديببد البنبباء المباشببرين فقببط ) (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);
// أو
// 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
89
الفصل الثالث:
3
تعلم jQuery الفصل الثالث :التنقل في شجرة DOM
ست ِ
رشب بح عناص ببر > <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
حالي ا.
ًب ُ
فستستخ َدم للعثور على »أحفبباد« ) (descendantsالعناصببر المُ ح ب ّددة أما الدالة )(find
أن الدالة )( findستؤدي إلى تحديث أو تغيببير مجموعببة التغليببف الحاليببة لكي تحتببوي على
تخيل ّ
ستؤدي إلى تغيير مجموعة التغليف من عناصر > <pإلى عنصببرَ ي > <strongعبببر اسببتخدام الدالببة
><!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تؤدي إلى تقليل عببدد )أو ترشببيح( العناصببر المُ حب ّددة
الفكرة هنا هي ّ
93
تعلم jQuery الفصل الثالث :التنقل في شجرة DOM
مجموعة التغليف.
على سبببيل المثببال لنقببل أننببا نريببد وضببع جميببع عناصببر > <imgفي صببفحة HTMLضببمن عنصر
> <pفي حال لم يكن عنصر > <imgموجو ًدا من البداية ضمن عنصر >.<p
يمكنك إنشاء ُم ِ
رشح مخصص لتمام هذه المهمة أو يمكنك استخدام الدالببة )( filterبتمريببر
هببذا العنصببر من المجموعببة ،ومن ثم ستوضببع جميببع عناصببر > <imgالمتبقيببة في مجموعببة التغليببف
ً
دالة ست ِ
حدد كل عناصر > <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
و )( parentsو )( .closestمن المهم أن تفهم الفروقببببببات بين هببببببذه الببببببدوال .تفحص الشببببببيفرة
><!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
عنصر
ٍ مرّ َ
رته إليها .وبالتالي لن تتمكن الدالة )( closestمن إعادة أكثر من
وحيدٍ فقط.
ِ
عدة دوال للتنقل في شجرة .DOMربما يسهل علينببا نسببيان ذلببك لوجببود عببدد كبببير من دوال التنقببل
مطلقا ) ً
مثل.(next() : ً دون أن نحتاج إلى استخدام التعابير
99
jQuery تعلم DOM التنقل في شجرة:الفصل الثالث
prev('expression') • children('expression') •
prevAll('expression') • next('expression') •
siblings('expression') • nextAll('expression') •
closest('expression') • parent('expression') •
parents('expression') •
100
الفصل الرابع:
4
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" :الناتج
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>
ُ
تستطيع، وفي الواقع. في بقية الحالتinnerHTML ستستعمَ ل الخاصية ملحاظات
َ ُتمرير عنصر م
jQuery إلى دالةdocument.createElement نشأ عبر
.($(document.createElement('div')) :)مثال
104
تعلم jQuery الفصل الرابع :تعديل شيفرات HTML
ً
مكتوبة -سلسلة HTMLالنصية المُ ِ
مررة إلى دالة jQueryيجب أن تكون
ً
نصية فيها ً
سلسلة مرر وت َ
غلق جميع عناصر HTMLعندما ُت ِ -يجب أن ُتفتَح ُ
وخصوصا
ً HTMLإلى دالة .jQueryإن لم تفعل ذلك فقد تتسبب بحدوث علل
أن لديك مجموعة تغليف تحتوي على جميع عناصببر > <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));
107
تعلم jQuery الفصل الرابع :تعديل شيفرات HTML
مجموعب ببة التغليب ببف؛ وإنمب ببا سب ببتجمع محتب ببوى جميب ببع العقبببد النصبببية لجميبببع العناصبببر الموجبببودة في
َ
فهمت هببذه الفكببرة وإل أنك قد وت عيد القيمة النهائية كسلسلةٍ نصيةٍ وحيدةّ .
تأكد ّ مجموعة التغليف ُ
فقد تحصل على نتائج غير متوقعة عند استخدامها )مثال حي(:
><!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 تعديل شيفرات:الفصل الرابع
<!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
ً //
ً نصية َ الدالة )( replaceت
ُعيد سلسلة ّ
ِ في بالك أن
أبق
ول تعيد كائن ،jQueryوهذا هو السبب وراء //
وضع الدالة )( replaceبعد الدالة )(// text
;)})(jQuery
></script
></body
></html
ً
أيضا تحديث أيّ ة محارف موجودة ضمن سلسلة نصية ُمعببادة من الدالببة )( ،htmlوهببذا يمكنك
ً
أيض ب ب با تحبببببديث واسب ب ببتبدال عناصب ب ببر DOMعب ب بببر يعبببببني ّ
أنك تسب ب ببتطيع تحب ب ببديث النص ،وتسب ب ببتطيع
التعابير النمطية.
في ذلبببك العقبببد النصبببية ) (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 تعديل شيفرات:الفصل الرابع
<!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>
< والصبببفحةiframe> لطالمبببا كبببانت الصبببفحة الموجبببودة ضبببمن عنصبببر،<iframe> ضبببمن عنصبببر
<!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($)
{
})(jQuery);
</script>
</body>
</html>
114
تعلم jQuery الفصل الرابع :تعديل شيفرات HTML
> <iframeليس موجو ًدا بنفس النطاق وواجهوا مشكلة »سياسة المصدر
الواحد« )ّ .(same-origin policy
تأكد ّ
أنك تفهم محدوديات استخدام
نطاق آخر.
ٍ موجودٍ في
ً
مرة أخرى في شجرة ،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 نماذج:الفصل الخامس
ثم، يمكنن ببا فع ببل ذل ببك بك ببل بس بباطة باختي ببار حق ببل إدخ ببال.disabled لعناص ببر النم ببوذج إلى القيم ببة
<!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()
<!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 رشحات
<!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>
<!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 أو عبر ضبط قيمة الخاصية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>
<!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
إذا كان مربع اختيار أو انتقاء ُمختارًا من قبل ،فلن يؤدي استخدام )( valإلى
ملحاظة
إلغاء اختياره.
مختارا أم ل
ً .5معرفة فيما إذا كان مربع اختيار أو مربع انتقاء
يمكنببك معرفببة إذا تم اختيببار أو لم يتم اختيببار مربببع اختيببار أو انتقبباء عبببر اسببتخدام المُ ِ
رش بح
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'));
// الناتج: "true"
alert($('input:radio').is(':checked'));
125
jQuery تعلم HTML نماذج:الفصل الخامس
</script>
</body>
</html>
مخفيا
ً حاقل في النموذج
ٌ معرفة إذا كان.6
ِ ُ( عبببر الم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'));
126
jQuery تعلم HTML نماذج:الفصل الخامس
})(jQuery);
</script>
</body>
</html>
بال َ
ٍ بل إدخب
ِ سأضبط في المثببال التي قيمببة كببل حقب.(… HTML5 وغير ذلك من عناصر نماذجtext و
<!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')
128
تعلم jQuery الفصل الخامس :نماذج HTML
;))(alert($('input:text').val
;)})(jQuery
></script
></body
></html
(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
)(ُ 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
ولكي نحص ببل على قيم ببة الخاص ببية 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')
ً
.مثال عن الشيفرة فيما يلي بعض تلك المهام وسأريك
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>');
$('select option:eq(1)').replaceWith('<option
value="">option</option>');
133
تعلم jQuery الفصل الخامس :نماذج HTML
;)($('select option:last').remove
ُم ِ
رشحات خاصة:
;)'$('#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
في مثالنا(:
;)($('select option:last).val
134
تعلم jQuery الفصل الخامس :نماذج HTML
مكان معين:
ٍ إضافة خيار بعد •
$('select option:eq(1)').after('<option
;)'>value="">option</option
مكان معين:
ٍ إضافة خيار قبل •
$('select option:eq(3)').before('<option
;)'>value="">option</option
المُ ِ
رش حات التية المرتبطة بأنواع حقول النموذج لتحديد العناصر حسب نوعها.
:submit •
135
jQuery تعلم HTML نماذج:الفصل الخامس
ِ ُالم
:( )مثال حي: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وحيببد إلى المسببتند .وسب ُبت ّ
نفذ الشببيفرات المرتبطببة بالحببدث ولسب َ
139
تعلم jQuery الفصل السادس :الحداث في jQuery
keyup •
كمببببا هببببو واضببببح –واعتمببببا ًدا على معببببايير –DOMيمكن أن ترتبببببط معالجببببات أحببببداث مُ حبببب ّددة
معينة.
ّ بعناصر
ً
أيض با اسببتخدام بالضببافة إلى القائمببة السببابقة الخاصببة بمعالجببات الحببداث القياسببية ،يمكنببك
لحذف معالجات أحداث قياسية أو خاصة ،يمكننا ببسبباطة تمريببر اسببم المعببالج أو اسببم المعببالج
وسبببببببائط إلى الدالبببببببة )( 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!');
});
141
تعلم jQuery الفصل السادس :الحداث في jQuery
عدة اختصارات لستخدام الدالة )( onمع جميع أحداث DOM ِ
توفر ِ jQuery -
اسم الحدث.
باستخدام .jQuery
ملحاظات
ً
حدثا ما إلى ً
دالة لمعالجة الحداث باسم )( oneوالتي ستربط ِ
توفر jQuery -
َ ُ
ضيفت الدالتان )( onو )( offإلى إصدار 1.7من ،jQueryوكنّا نستعمل-أ
بدل منهما الدالتين )( bindو )(ُ .unbindأهمِ َ
ل استعمال الدالتين )(bind ً
142
تعلم jQuery الفصل السادس :الحداث في jQuery
ً
بتعمل عنصببر DOMثم اسببتدعاء ذاك المعببالج مباشب ً
برة .سأشببرح الفكببرة السببابقة في المثببال التي مسب
><!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 ملحاظة
ً
أيضا مع الحداث المخصصة. سيعمل ما سبق
يُ مرّ ر الكائن eventإلى دالة مُ عالِجة للحداث ،فلن تضطر للقلق حول كيفية تعامل المتصببفحات مببع
الكببائن ً ) event
مثل :ع بببر الكببائن window.eventفي متصببفح .(IEيمكنببك اس ببتخدام الخاص ببيات
لن jQueryقببد
والدوال التية التابعة للكائن eventدون أن تقلق من الختلفببات بين المتصببفحات ّ
144
jQuery تعلم jQuery الحداث في:الفصل السادس
event.type ◦
event.target ◦
event.data ◦
event.relatedTarget ◦
event.currentTarget ◦
event.pageX ◦
event.pageY ◦
event.result ◦
event.timeStamp ◦
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
لنأخ ببذ الح ببدث resizeعلى س بببيل المث ببال .يمكنن ببا ع بببر jQueryأن ُنض ببيف ّ
أي ع ببددٍ نش بباء من
الببدوال لمعالجببة الحببدث window.resize؛ لكن مبباذا يحببدث عنببدما نحتبباج إلى حببذف إحببدى تلببك
146
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('resize', function()
{
alert('I have no namespace');
});
$(window).on('resize.unique', function()
{
alert('I have a unique namespace');
});
147
تعلم jQuery الفصل السادس :الحداث في jQuery
;)})(jQuery
></script
></body
></html
أضببفنا في المثببال السببابق دالببتين لمعالجببة الحببدث .resizeواسببتخدمنا مجببال أسببماء للحببدث
حين ترتبط أكثر من دالة لتعالج الحدث نفسه على عنصر 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
ٌ
ممتازة لحماية وحذف واستدعاء الدوال ٌ
طريقة -استخدام مجال السماء هو
ٌ
إضافة ) (pluginما. المرتبطة بالحداث والتي تستعملها
149
تعلم jQuery الفصل السادس :الحداث في jQuery
فعنبببدما تضبببغط على العنصبببر > <aالموجبببود داخبببل العنصبببر > <liالموجبببود ببببدوره داخبببل العنصر
َ
أطل َق الحدث. لعنصر من »أجداد« ) (ancestorsالعنصر الذي ً
حدثا كل دالةٍ ُتعالِج
)ُ (fires
ٍ
ه ببذا يع ببني ّ
أنن ببا ل ببو أض ببفنا الح ببدث clickإلى عنص ببر > <ulومن ثم ض ببغطنا على عنص ببر ><a
موجود داخل > <ulفسيؤدي ذلك إلى اسببتدعاء الدالببة المُ عالِجببة للحببدث clickالمرتبطببة بالعنصببر
ِج حب ً
بدثا مببا أن نسببتخدم الكببائن ) eventتحدي ب ًدا الخاصببية > .<ulويمكننببا حين اسببتدعاء دالببةٍ ُتعببال ُ
أن هببذا سببيعطينا (event.targetلتحديد ما هو العنصر في شجرة DOMالذي أطلق الحدثِ .
أكرر ّ
ب بإطلق الحدث.
سب َ
العنصر الذي ّ
بير من عناصببر DOMعبببر تعريببف دالببةٍ ً يمكننا بفعل ذلك أن ُنضيف
حدث ما لعددٍ كبب ٍ
ٍ دالة لمعالجة
ٌ وحيدةٍ .وهذا مفي ٌد ج ًد ا ،ويمكننا الستفادة منه )على سبيل المثال( عنببدما يكببون عنببدنا جب
بدول فيببه
><!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 وتمرير الكائن
151
تعلم jQuery الفصل السادس :الحداث في jQuery
></body
></html
َ
بغطت على إحببدى النقببط الببتي تظهببر قبببل عناصببر القائمببة وليس على الرابببطحس بنًا ،مبباذا لببو ضب
سببببببببببت ِ
حدد العنصر ُ قيمببببببببببة event.targetهي > <liوليس > ،<aوبالتببببببببببالي الدالبببببببببة )(parent
> <ulوتحذفه .يمكننا تحديث الشيفرة السابقة لكي تحذف عناصر > <liفقط عندما تضغط على
;)($(event.target).parent('li').remove
َ
بويض الحببداث الببتي لم نضببفها إلى الصببفحة بعببد باسببتخدام الدالببة )(َ .onتسببتخدِ م الدالب ُ
بة )( onتفب
) (event delegationللسماح لعناصر DOMالمُ ضببافة حببدي ًثا بالسببتجابة إلى دوال معالجببة الحببداث
بغض النظبببببر عن التعبببببديلت أو التغيبببببيرات الديناميكيبببببة لشبببببجرة .DOMيمكن على سببببببيل المثبببببال
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والتي كانت تستعمل لتفويضأ
.1.9وكان يمكن استخدام الدالة )( delegateكبديل عنها ،حيث تؤدي نفس
ُ ً
قليل( ،لكن الدالة )( delegateقد أهمِ َلت الغرض تمامً ا )وإن اختلفت الصيغة
بدءا من
ً في الصدار 3.0؛ لذا يجدر بنا استعمال الدالة )( onوالتي أضيفت ملحاظة
الصدار .1.7
َ
كنت تستعمل إصدارًا أكبر من ،1.7أو خلصة القول :استعمل الدالة )( onإذا
َ
كنت تستعمل إصدارًا أقل من .1.7 استعمل )( delegateإذا
بة مجهولب ً
بة بدة فقببط لمعالجببة أكببثر من حببدث .سببنربط –في المثببال التي– دالب ً
برة واحب ً
بكتابببة الدالببة مب ً
><!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
)(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>
يخدم هذا السلوك الفتراضببي توظيببف حلببول مثببل تفببويض.(ancestor) «لجميع العناصر »الجداد
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وذلب ببك لننب ببا أوقفنب ببا نشب ببر
صفحة .jquery.com
return false
إعبببادة القيمبببة ) falseأي اسبببتخدام التعليمبببة البرمجيبببة (return falseتكبببافئ اسبببتخدام
><!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وسببتنتقل المتصفح الفتراضي حيث ُ
ولن هببذه الحببداث خاصببة ول يعببرف المتصببفح عنهببا شببي ًئا ،فالطريقببة الوحيببدة لسببتدعاء تلببك
ّ
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 الحداث في:الفصل السادس
َ ولكي ُت
true فيجب تمريببر القيمببة المنطقيببة، بالضافة إلى الحداث المرتبطة بهاDOM نسخ عناصر
<!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
–في المثببال التي– بالعنصببر > .<divوباسببتخدام consoleسببنتمكن من عببرض الحببداث المرتبطببة
><!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
الخلصةُ :ت ّ
خزن معلومات الحداث عندما نربطها بأحد العناصر.
إحببداثيات 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لمؤشببر الفببأرة نسب ً
ببة إلى عنصب ٍبر آخببر غببير ً من الضببروري
ً
نسبة إلى مكان تحريك الفأرة. يظهر التلميح
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 الحداث في:الفصل السادس
166
الفصل السابع:
jQueryومتصفح الويب
7
تعلم jQuery الفصل السابع jQuery :ومتصفح الويب
للفأرة
يمكن باسببتخدام 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 :ومتصفح الويب
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
تستعملها في شيفرات 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.fnبإنشبببباء دوال خاصببببة شبببببيهة بتلببببك
ُ
فستضبمّ ن لنه عنببدما ُنلحِب ق دالببة الضببافة بالكببائن jQuery.fn
الموجودة في أساس .jQueryوذلك ّ
أن الكلم ببة المحج ببوزة thisداخ ببل الدال ببة التابع ببة للض ببافة ُ
ستش ببير إلى الك ببائن jQuery.fnيع ببني ّ
><!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
أن ُت جري عملياتها عليها ،فقد ل تحتاج إلى إلحاق هذه الضافة بالكائن .$.fn
ُ
ستشير إلى كائن 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
;)(jQuery('#counter1').count
></script
></body
></html
من المهم أن تفهم ما الذي ُتشير إليه الكلمة المحجوزة thisداخل دالة الضافة.
مجموعة التغليف.
بة عامب ٌ
بة ُتسببتخ َدم للمببرور يمكننا فعل ذلبك باسببتخدام الدالببة )( 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
السلسببببلة لكي ُت ّ
طبق المزيببببد من الببببدوال على مجموعببببة التغليببببف .سبببب ُنعيد في المثببببال التي كببببائن
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
><!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
كائن وحيببد .تسببمح لنببا الدالببة )( extendبإضببافة خاصببيات )أو قيم( jQueryلدمج ِ
عدة كائنات في
ٍ
ِ
سأمرر جديدة إلى كائن .ويمكننا الن تمرير الخيارات إلى دالة الضافة بعد تغييرنا لشيفرتها .حيث
في المث ببال التي ال ببرقم 500إلى الدال ببة countلكي يُ س ببتخ َدم كنقط ببة بداي ببة للعبب ّداد ،وه ببذا الخي ببار
><!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
لنك ُت ّ
هيئ الضببافة لتعمببل كمببا تشبباء بسبط عمليببات اسببتدعاء الضببافاتّ ،
سي ِ
الضافة .وفعلببك لببذلك ُ
دون أن ُت ِ
عدل شيفرتها )مثال حي(:
><!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
ً
بدل من // startCount: 0 سنستخدم startCount: 200
;)(jQuery('#counter1').count
(jQuery('#counter2').count
{
startCount: 500
تجاوز القيم الفتراضية }); //
></script
></body
></html
برمجيا
ً .9إنشاء العناصر أثناء التنفيذ واستدعاء الضافات
اعتما ًد ا على طبيعة إضافتك ،قد تهتم بإمكانية استدعاء الضافة بشببكل اعتيببادي )عبببر عناصببر
ٌ
أوقات سيظهر فيها مربببع أن لدينا إضافة لنشاء مربع حوار :هنالك
وبرمجيا .تخيل ّ
ً وأحداث (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
برمجي ا عبببر
ًب وتعقيببد ووظيفببة الضببافة .لكن الفكببرة الساسببية هنببا هي إمكانيببة اسببتدعاء الضببافات
ً
مسبقا بالضافة إلى العناصر المُ نشأة أثناء التنفيذ. عناصر DOMالموجودة
188
الفصل التاسع:
9
تعلم jQuery الفصل التاسع :تحسين أداء شيفرات jQuery
من المهم أن تسب ببتعمل دومً ب ب ا آخب ببر إصب ببدار من .jQueryأنصب ببحك –كمطب ب ِبور –jQueryأن تقب ببرأ سب ببجل
حسن من الداء
سي ّ
.2تمرير »سياق« إلى دالة ُ jQuery
بياقا ) (contextإلى دالببة ،jQuery ً
قليل من تنفيذ طلبية jQueryعنببدما ُتمب ِبرر سب ً يمكنك أن ُت ِ
سرع
><!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
يمكن تطبيق هذه الطريقة على الحببالت الببتي تتببوافر فيهببا قيمببة 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سب ب ً
بأداء المُ ِ
حددات بشكل قاطع.
ً
مباشرة بمجموعةٍ مما يلي: ٌ
مرتبط أن أداء المُ ح ّددات
ضع ببالك ّ
نوع المُ ِ
حدد المستخدم. •
ً
مثلgetElementsByTagName() : ِ
ببببببببببببدد.تببببببببببببوفر دالببببببببببببة JavaScriptمرتبطببببببببببببة بالمُ ح •
و )(.querySelectorAll
حبب ِ
بدد عناص ب ببر DOMباسبببببتخدام IDأينم ب ببا اس ب ببتطعت ،فتنفي ب ببذ ذل ب ببك س ب ببريعٌ ل ب ببدعم جميبببببع •
َ
استخدمت اسببم فئببة ،CSSفل تسببتعملها المتصفحات للدالة )( .getElementByIdأما إذا
193
تعلم jQuery الفصل التاسع :تحسين أداء شيفرات jQuery
بمفردهببا؛ وإنمببا اسببتعمل )' $('td.classأو )' .$('#nav.classلكن بعببد هببذا الحببد لن
ً
ضئيل. ِ
تؤثر أنواع المُ ِ
حددات على الداء إل تأثيرًا
بددات ال ببتي ُت ِ
مرره ببا لدال ببة بع ببد معرفت ببك له ببذه المعلوم ببات ،لن يص ببعب علي ببك الموازن ببة بين المُ ح ب ِ
ٌ
دالببة ِ
حببددات أسببرع بكثببير عنببدما تكببون هنالببك jQueryوبين تحسببين أداء الشببيفرة .ستصبببح المُ
ً
مبثببببببببببببل: ) ٌ
موجبببببببببببودة في JavaScriptوالبببببببببببتي يمكن اسبببببببببببتعمالها من jQuery ٌ
مكافئبببببببببببة لهبببببببببببا
)(.(getElementsByClassName
ً
مقارنة في أغلبية الحالت ،توفير سياق إلى دالة jQueryسيزيد الداء كثيرًا
ملحاظة
بكتابة مُ ح ّددات مُ ّ
حسنة.
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
ذلك أفضل.
جليبب ا عنببدما يببأتي المببر إلى التعامببل مببع حلقببات التكببرار ،فببأوّ ل حلقببة في
ً يظهببر هببذا المفهببوم
ً
واحدة فقط. ً
مرة 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وبهذا ستتخطى التعقيدات
.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
تلك المحددات بفاصلة )كما في .(CSSسببيزيد ذلببك من الداء بتقليببل عببدد كائنببات jQueryالمُ نشببأة
ٌ
مثال بطيء// :
;)($('#div1').hide
;)($('#div2').hide
;)($('#div3').hide
ٌ
مثال سريع// :
;)($('#div1, #div2, #div3').hide
نفس الكببببببببائن وسببببببببيزيد ذلببببببببك من كفبببببببباءة الشببببببببيفرة .وبفعلنببببببببا لببببببببذاك سببببببببنزيد من الداء بتقليل
تكرار الشيفرات.
198
تعلم jQuery الفصل التاسع :تحسين أداء شيفرات jQuery
أغلبيبببة الحبببالت هبببو :بكم أسبببرع؟ الزيبببادة في السبببرعة في أغلبيبببة الحبببالت تكبببون ضبببئيلة .فلهبببذا
199
تعلم jQuery الفصل التاسع :تحسين أداء شيفرات jQuery
لغة .JavaScript
قيم ب ً
بة من التحس ببين الض ببئيل في الداء الببذي يببأتي من اس ببتخدام حلق ببات التك ببرار المُ ضببمنة في لغببة
ِ
أجرب الصفحة.
أمببا عنببدما يببأتي المببر إلى حلقببات التكببرار الكبببيرة )أكببثر من 1000تكببرار( فربمببا عليببك أن تبببدأ
مباشرة
ً 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 المؤثرات في:الفصل العاشر
<!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();
205
تعلم jQuery الفصل العاشر :المؤثرات في jQuery
;)})(jQuery
></script
></body
></html
استخدام الحداث الخاصببة 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وهذا
ً ملحاظة
مفعلة )أي تجري سواء كانت
ً سيؤدي إلى إيقاف جميع الحداث المتراكمة
الن( أم ل.
)مثال حي(:
><!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
العناصببر مببع اسببتخدام حركببة عبببر تغيببير خاصببيات CSSالتاليببة height :أو widthأو opacityأو
marginأو .paddingمن الممكن أن نوقف الحركات عند إخفاء أو إظهار العناصر ،وذلببك عنببد عببدم
تمرير أيّ ة وسائط لتلك الدوال ،وهذا سيؤدي إلى تغيير كيفية تعديل تلك الببدوال لظهببور العنصببر؛ إذ
ً
مباشبببرة دون حركبببات ،وذلبببك عب بببر تعبببديل قيمبببة خاصب ببية سب ببتظهر أو سب ببتختفي العناصب ببر المتبببأثرة
><!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
تتعب بباقب خلل فب ببترةٍ من الب ببزمن .افتراضب ب ًبيا ،عنب ببدما ُتسب ببتعمَ ل دوال المب ببؤثرات كسلسب ببلة فسب ببتحدث
><!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');
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
;)})(jQuery
></script
></body
></html
في إص ببدار jQuery 1.2وم ببا بعببده ،يمكن ببك إنشبباء مببؤثرات لخاص ببيات CSSباس ببتخدام em •
214
تعلم jQuery الفصل العاشر :المؤثرات في jQuery
يمكن إنشاء مؤثرات نسبية باسببتخدام »= «+أو »= «-أمبام قيمببة الخاصببية .حيث يمكنببك •
ً
نسبة إلى مكانه الحالي. سلبيا(
ً إيجابيا أو
ً استخدام هذه التقنية لتحريك العنصر )
ً
مببدة للحرك ببة ،فس ببتحدث الحرك ببة َ
حببددت القيمببة 0 في إص ببدار jQuery 1.3وم ببا بعببده ،إذا •
ً
مباشرة وستتحول العناصر إلى التنسيق النهائي دون حركة.
فست َ
عكس حركة التأثير من النهاية إلى البداية. ُ كاختصار ،إذا مُ ِررَ َ
ت القيمة toggle •
جميع خاصيات CSSالمضبوطة عبر دالة )( animateوحيدة ستتحرك في نفس الوقت. •
و )(.fadeTo
ً
وعرضا. ً
طول أن العنصر الذي »سيختفي« يملك
استخدام هذه الدوال ّ
ّ
موضحة في الشيفرة التية )مثال حي(: جميع النقط السابقة
><!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
الدالب ب ببة )( .ajaxالدالب ب ببة )( ajaxلهب ب ببا الكثببببببير من المب ب ببيزات وقابلب ب ببة للتخصببببببيص لنشب ب بباء طلبب ب ببات
XMLHttpRequestتناسب احتياجاتنا.
البيانببات بين المتصببفح والخببادم ،ولن نحتبباج إلى تحببديث الصببفحة عنببد فعببل ذلببك .انتشببر اسببتعمال
الكببائن XMLHttpRequestكثببيرًا في الفببترة الخببيرة ممببا أدى إلى بنبباء تطبيقببات ويب مثل Google
البريد اللكتروني الجديدة دون الحاجة إلى إعادة تحميل كامل الصفحة.
ً
اختلفببا كبببيرًا ،وهببذا لسوء الحظ ،تختلف الواجهة البرمجية للتعامل مع Ajaxبين المتصببفحات
أن على الم بببرمجين أن يأخ ببذوا بالحس بببان جمي ببع الختلف ببات بين المتص ببفحات لض ببمان عم ببل
يع ببني ّ
موح ً
دة الفروقببات بين ِ بدعم لتقنيببة Ajax
بكل سببليم؛ لكن لحسببن الحببظ ،تببأتي jQueryبب
ٍ تقنية Ajaxبشب ٍ
بابقا ،وت ب ِ
بوفر المتص ببفحات في واجه ببة برمجي ببة خاص ببة ب ببه ،وت ب ِ
بوفر الدال ببة )( ajaxال ببتي ذكرناه ببا س ب ً
ً
دوال أخببرى مختصببرة لنببواع ُمحب ّددة من طلبيببات .XMLHttpRequestهببذه الببدوال مببا ً
أيضا jQuery
ٌ
اختصارات للدالة )( ،ajaxوهي: هي إل
)(load •
)(get •
)(getJSON •
218
تعلم jQuery الفصل الحادي عشر :تقنية Ajax
)(getScript •
)(post •
ٌ
مفيدة في بعض الحيببان ،لكنهببا جميعًب ا تسببتخدم أن هذه الختصارات
الفكرة الساسية هنا هي ّ
)( ajaxوراء السببتار .وعنببدما تريببد اسببتخدام جميببع المببيزات والتخصيصببات الببتي توفرهببا jQuery
أشببهر طريقتببان لرسببال الطلبيببات إلى الخببادم همببا GETو ،POSTومن المهم فهم الفببرق بينهمببا
ً
صحيحا. ً
استعمال لستعمالهما
الطريقببة GETتسببتعمل للعمليببات » غببير الهادمببة« ،أي العمليببات الببتي تتضببمن »الحصببول« على
ً
فمثل :نسببتخدم طلبيببة GETعنببد محاولببة الحصببول على نتببائج البيانات من الخببادم ،وليس تعببديلها؛
المتصفحات ،مما قد يؤدي إلى سلوكٍ غير متوقع إذا لم تضع ذلك بالحسبان.
أم ببا الطريق ببة POSTفهي تس ببتعمل للعملي ببات »الهادم ببة« ،أي العملي ببات ال ببتي ت ببؤدي إلى تع ببديل
ً
عبببادة أن طلبيبببات POSTل ُت ّ
خبببزن مؤق ًتبببا اسبببتخدام الطريقبببة POSTلنقبببل البيانبببات؛ يجبببدر بالبببذكر ّ
من المتصفح.
لمزيدٍ من المعلومات والمثلة عن استعمال الدالة )( ،ajaxيرجى مراجعة التوثيق الرسمي.
219
تعلم jQuery الفصل الحادي عشر :تقنية Ajax
ِ
يوفر اسمً ا للدالة الببتي ُ
ستسببتدعى ويُ مببرّ ر كببائن JSONإليهببا كوسببيط. –عندما ُتعاد صيغة –JSONأن
ه ببذه التقني ببة ل تس ببتخدم XHR؛ وإنم ببا تس ببتخدم العنص ببر scriptلكي نتمكن من اس ببتقبال وإرس ببال
أي موق ببع .اله ببدف من ه ببذه التقني ببة ه ببو اللتف بباف على المح ببدوديات الناجم ببة عن
البيان ببات من وإلى ّ
ببببباق
باسبببببتخدام دالبببببة jQueryذات السبببببم )( getJSONيمكننبببببا تحميبببببل بيانبببببات JSONمن نط ٍ
) (domainآخر عندما ُتضاف الدالببة المُ عالِجببة لطلبيببة JSONPإلى رابببط .URLكمثببال ،هببذا هببو رابببط
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
كان الرد ثاب ًت ا والذي سيصلح لفترةٍ من الزمن ،فمن المستحسن تخزينه مؤق ًتا .أما إذا كببان المحتببوى
يُ خ ب ِبزن ال ببرد مؤق ًتببا .أح ببد الحل ببول الممكن ببة ه ببو تمري ببر قيم ببة فري ببدة في عن ببوان URLللطلبي ببة ،وبه ببذا
222
تعلم jQuery الفصل الحادي عشر :تقنية Ajax
طلبيببات Ajaxوهببذا باس ببتخدام الخيببار .cacheسنس ببتخدم هن ببا الدالببة ajaxSetupلضبببط تعطي ببل
{( $.ajaxSetup
القيمة هي trueافتراضي
ًا //
القيمة falseتعني إيقاف التخزين المؤقت //
cache: false
;)}
ٌ
مثبال أجرينببا فيببه طلبيببة XHRباسببتخدام الدالببة )( ajaxمببع cacheباستخدام الدالة )( .ajaxهببذا
{( $.ajaxSetup
cache: false
;)}
(jQuery.ajax
cache: true,
url: 'some.php',
'type:'POST
;)
223
الفصل الثاني عشر:
مواضيع متفرقة
12
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
ً
فمثل ،علينببا تفببادي تخببزين البيانببات في عناصر 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>
ً
. بمفردهاdata() أيضا استخدام الدالة ( لكن من الممكن$('div').data()
ِ
: كل الحالتينjQuery يوضح توثيق
http://api.jquery.com/data •
http://api.jquery.com/jQuery.data •
226
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
عنببد تخببزين البيانببات في عناصببر ،DOMفأفضببل حببل هببو اسببتخدام الدالببة )( dataالموجببودة
في .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($
{
)$.customAlert = function(text
{
تخزين الدالة customAlertفي كائن // jQuery
227
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
;)alert(text
;}
ُ
سأن ِشبئ في المثببال التي الكببائن myDialog لكي تتجنب حدوث فوضى في مجببال أسببماء .jQuery
دوال داخل الكائن myDialogتتعلق به. خزن بدوره في كائن jQuery؛ وسأستضيف ِ
عدة الذي يُ ّ
ٍ
)($.myDialog.initiate
228
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
تمريببر سلسببلة نصببية كثبباني معامببل .وهببذا يسببمح لببك بببالمرور على العناصببر في مجموعببة التغليببف
><!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 الفصل الثاني عشر :مواضيع متفرقة
ِ
أفضب ل اسببتخدام أسببماء الخاصببيات الببتي فيهببا شببرطات لنهببا تماثببل مببا إلى الدالببة )( .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>
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
textIndent text-indent
textTransform text-transform
top top
verticalAlign vertical-align
visibility visibility
width width
zIndex z-index
234
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
)( ($('#myiFrame').contentsيحت ببوي على مس ببتند مُ ستض بباف على نفس النط بباق فسنحص ببل
بزءا
وبالتالي يمكننببا اسببتخدام jQueryلتعببديل عناصببر DOMالتابعببة لعنصببر iframeكمببا لببو كببانت جب ً
ٌ
مخصصة في jQueryللتحميل المسبق للصور.
235
jQuery تعلم مواضيع متفرقة:الفصل الثاني عشر
(function($) {
// preloadImages() تعريف الدالة
// jQuery إضافة دالة خاصأة إلى مجال أسماء
$.preloadImages = function(arrayOfImages) {
$(arrayOfImages).each(function() {
// src وضبط الخاصأيةimg إنشاء عنصر
$('<img/>')[0].src = this;
});
};
إن لم تكن طريقببة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
ذلبببك كثبببيرًا .الفكبببرة هنبببا هي طلب الوسبببائط في الخلفيبببة )أي بعيببب ًدا عن أعين المسبببتخدمين( بعبببد
نس ببتطيع طلب الوس ببائط ) .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
الحالت التي تريد أن يحصل فيها المستخدم على نسخةٍ جديدةٍ من الملف
في كل مرة.
238
تعلم jQuery الفصل الثاني عشر :مواضيع متفرقة
صفحة 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