JS 11
JS 11
مقدمة:
سنتعلم في هذه المحاضرة عدة أفكار في لغة Java Scriptمثل eventوبعض الـ methodsالتي
تساعدنا في البرمجة ،وأيضا ً عن أنواع األخطاء ،و .strict mode
فكرة eventو:target
-ليكن لدينا زر في HTMLله idتساوي ” “myBtnعلى الشكل التالي:
><button id="myBtn">Add</button
-في ملف الـ java scriptنريد أن نُفعل حدث clickعلى هذا الزر ،بحيث عندما اضغط عليه ،يُشغل
تابع ،عمل هذا التابع هي طباعة :event.target
)'var mtBtn = document.getElementById('myBtn
)mtBtn.addEventListener('click', Code
{ )function Code(event
;)console.log(event.target
}
التابع Codeلديه بارامتر " "eventحيث هذا البارامتر يمكن أن نسميه ما نشاء ،مثل " "eوغيرها.
وظيفة هذا التابع هي طباعة event.targetفي الـ.console
ما المقصود بعبارة event.target؟
عبارة event.targetفي JavaScriptتشير إلى العنصر الذي أطلق الحدث فعليًا (أي الذي تم
التفاعل معه) ،وفي مثالنا ،الزر Addالمتمثل بالعنصر buttonهو الذي أطلق الحدث .click
ما هو event؟
عندما يُطلق حدث (مثل ،)clickيقوم المتصفح تلقائيًا بتمرير كائن ( )objectيُمثل هذا الحدث إلى
التابع .هذا الكائن يُعرف بـ ( eventأو أي اسم آخر أمرره إلى بارامتر التابع ،لكن التسمية الشائعة هي
.)event
ما هو event.target؟
هو العنصر HTMLالذي تسبب في الحدث.
1
في مثالنا ،عندما تضغط على الزر Addفإن الخرج سيكون:
باختصار إن تعليمة event.targetتعبر عن العنصر ككل ،وهذه الفكرة سنستخدمها الحقا ً في
المشاريع.
2
فكرة clientو ( offsetاستخدام عملي نادر):
.1فكرة :clientX
clientXهو خاصية موجودة داخل كائن الحدث ( )eventفي جافاسكريبت ،وتُستخدم للحصول على:
المسافة األفقية ( )Xلمؤشر الماوس من الحافة اليسرى لنافذة المتصفح ( ،)viewportعند حدوث حدث
معين (مثل clickأو .)mousemove
مثال:
كود :HTML
><button id="myBtn" style="margin: 120px; padding: 40px;">Add</button
كود :JS
)'var mtBtn = document.getElementById('myBtn
)mtBtn.addEventListener('click', Code
{ )function Code(event
;)console.log(event.cleintX
}
clientXال يهتم بالزر نفسه ،بل يهتم بالمكان الذي ضغطت فيه داخل نافذة العرض (.)viewport
3
.2فكرة :clientY
clientYهو خاصية داخل كائن الحدث eventتُظهر:
كم يبعد مكان ضغطة الماوس (عموديًا) عن الحافة العلوية لنافذة المتصفح (.)viewport
• ← padding: 40pxيُضيف مساحة داخلية بين حد الزر ومحتواه (مثل النص ".)"Add
• محتوى الزر نفسه (الكلمة " — )"Addله ارتفاع معين ،لنفترض مثالً أنه حوالي .px20
4
.3فكرة :offsetX
offsetXهو خاصية ضمن كائن الحدث ( )eventفي ،JavaScriptوتُستخدم لمعرفة:
كم يبعد مؤشر الماوس أفقيًا ( )Xعن الحافة اليسرى للعنصر نفسه الذي تم عليه الحدث (مثل زر أو
صورة أو أي عنصر .)HTML
المهم:
• يقيس داخل العنصر فقط ،أي يبدأ العد من الحافة اليسرى للعنصر ،وليس من نافذة المتصفح.
• إذا ضغطت في منتصف الزر ً
مثال ،فـ offsetXسيكون قريبًا من نصف عرض الزر.
)mtBtn.addEventListener('click', Code
{ )function Code(event
;)console.log(event.offsetX
}
كيف تُحسب؟
الزر فيه ،padding: 40pxأي أن هناك px40فرا ً
غا داخليًا من كل طرف. ◦
فإذا ضغطت داخل الزر عند بداية النص تقريبًا ،ستكون( offsetX ≈ 40 :بسبب )padding ◦
وإذا ضغطت على اليمين أكثر داخل الزر ،ستزيد القيمة. ◦
وإذا ضغطت تما ًما على يسار الزر ،ستكونoffsetX ≈ 0 : ◦
5
.4فكرة :offsetY
offsetYهي خاصية في كائن الحدث ( )eventتُعبر عن:
المسافة العمودية (من األعلى) من العنصر الذي تم النقر عليه إلى مكان الضغطة بالماوس داخل هذا
العنصر.
6
دالة :find
دالة findهي واحدة من دوال المصفوفات في لغة جافاسكريبت ،وتُستخدم للبحث عن أول عنصر في
المصفوفة يحقق شر ً
طا معي ًنا تحدده.
كيفية عمل دالة :find
▪ تأخذ دالة findتابعًا ( )Callback Functionكمعامل.
▪ يتم تطبيق هذا التابع على كل عنصر داخل المصفوفة.
▪ تعيد أول عنصر يحقق الشرط ( )trueالموجود في التابع.
▪ إذا لم يتم العثور على عنصر يحقق الشرط ،تعيد القيمة .undefined
النتيجةconsole.log(found); // 30 :
شرح المثال:
نبحث عن أول رقم أكبر من 25في المصفوفة.
الرقم 30هو أول عنصر يحقق هذا الشرط ،لذا تُرجع الدالة القيمة .30
7
مالحظة:
يمكن كتابة التابع ) (Callbackباستخدام دوال السهم ) (Arrow Functionsلتقليل الكود، •
مثل:
;]const numbers = [10, 20, 30, 40, 50
;)const found = numbers.find(num => num > 25
مثال آخر :بفرض لدينا المصفوفة التالية:
;]} "var arr = [{ id: "a" }, { id: "b" }, { id: "c" }, { id: "d
نريد تطبيق دالة findبحيث أبحث عن العنصر الذي لهُ idتساوي :b
{ >= )const result = arr.find((item
'return item.id === 'b
)}
;)console.log(result
بما أن العنصر موجود في المصفوفة بالتالي يكون الخرج:
مالحظة :الدالة findتبحث عن أول عنصر يحقق الشرط المطلوب ،وعندما تجد هذا العنصر ،تتوقف
عن البحث في باقي المصفوفة.
-الدالة :findIndex
نفس مبدأ عمل الدالة ،findلكن هذه الدالة تقوم بإرجاع رقم الـ indexالخاص بالعنصر
مثال:
;]} "var arr = [{ id: "a" }, { id: "b" }, { id: "c" }, { id: "d
console.log(result); //1
8
نالحظ أن رقم أول عنصر يحقق الشرط يساوي ،1بالتالي الخرج 1
دالة :sort
دالة sortهي دالة مدمجة في جافاسكريبت تُستخدم لترتيب عناصر المصفوفة بترتيب معين.
حيث:
◦ ( compareFunctionاختياري) :تابع يحدد كيفية مقارنة عنصرين.
◦ إذا لم يتم تمرير ،compareFunctionيتم ترتيب العناصر كنصوص.
مثال :1ترتيب أرقام بدون تابع مقارنة
;]const numbers = [40, 100, 1, 5, 25, 10
;)(numbers.sort
;)console.log(numbers
الخرج:
9
لماذا يظهر الخرج بهذه الطريقة؟
السبب في ظهور النتيجة بهذا الشكل هو أن دالة )( sortبدون تابع مقارنة ترتب العناصر كنصوص
( )Stringsوليس كأرقام.
شرح السبب:
◦ عند استدعاء () numbers.sortبدون تحديد دالة مقارنة ،يقوم جافاسكريبت بتحويل كل عنصر
إلى نص (.)string
◦ ثم يقوم بترتيب هذه النصوص حسب الترتيب األبجدي (.)lexicographical order
◦ لذلك ،األرقام تُرتب بنا ًء على أول حرف في النص ثم الثاني وهكذا.
◦ " "10يأتي بعد " "1ألن " "1متساوي ثم يقارن الحرف الثاني "."0
{ )numbers.sort(function(a, b
;return a - b
;)}
;)console.log(numbers
10
الخرج سيكون:
11
:) ترتيب المنتجات حسب السعر (من األرخص إلى األغلى:مثال
:)البيانات (مصفوفة من المنتجات
const products = [
{ name: "Keyboard", price: 250 },
{ name: "Monitor", price: 1200 },
{ name: "Mouse", price: 150 },
{ name: "Laptop", price: 3500 }
];
:الطباعة
console.log(products);
:النتيجة
12
كيف يعمل الترتيب خطوة بخطوة؟
المرحلة األولى :مقارنة أول عنصرين:
◦ )250( a = Keyboard
◦ )1200( b = Monitor
950- = 1200 - 250
النتيجة :ال يتغير الترتيب Keyboard ،يبقى قبل .Monitor
المرحلة الثانية:
◦ )1200( a = Monitor
◦ )150( b = Mouse
1050 = 150 - 1200
النتيجة :يتم تبديل الموضع ← Mouseيأتي قبل Monitor
الترتيب المؤقت اآلن:
][Keyboard, Mouse, Monitor, Laptop
المرحلة الثالثة:
◦ )1200( a = Monitor
◦ )3500( b = Laptop
2300- = 3500 - 1200
النتيجة :ال تغيير في الترتيب.
المرحلة الرابعة:
◦ )250( a = Keyboard
◦ )150( b = Mouse
100 = 150 - 250
Mouseيجب أن يأتي قبل ← Keyboardتبديل الموضع
13
إذا أردت الترتيب تنازليًا (من األغلى إلى األرخص) :فقط بدل ترتيب الطرح:
;)products.sort((a, b) => b.price - a.price
:TypeError .3
محاولة تنفيذ عملية على نوع غير مناسب:
;const num = 5
محاولة استدعاء رقم كدالة num(); //
14
:RangeError .4
عند تجاوز حدود المقبول في عمليات معينة:
;)const arr = new Array(1e309 حجم غير منطقي //
التعامل مع األخطاء:
الكتلة try...catchفي JavaScriptتُستخدم للتعامل مع األخطاء ( )Errorsالتي قد تحدث أثناء تنفيذ
الكودً ،
بدال من أن يتوقف البرنامج بالكامل عند حدوث خطأ.
الفكرة ببساطة:
:tryتضع فيه الكود الذي "قد" يحتوي على خطأ. ◦
:catchتكتب فيه ما تريد أن يحدث إذا وقع خطأ داخل .try ◦
الصيغة العامة:
{ try
كود قد ينتج عنه خطأ ✅ //
{ )} catch (error
التعامل مع الخطأ هنا ❌ //
}
15
مثال عملي:
{ try
غير معرف let result = 10 / y; // y
;)console.log(result
{ )} catch (err
يتم تنفيذ هذا ← :", err.message); //حدث خطأ"(console.log
}
في الخرج:
16
ما هو Strict Mode؟
Strict Modeهو وضع خاص في JavaScriptيجعل المترجم أكثر صرامة في تحليل الكود ،ويمنع
بعض األخطاء الشائعة أو الممارسات السيئة.
كيف أفعّله؟
ببساطة ،تضيف ;" "use strictفي أعلى الكود:
;""use strict
;let x = 5
أو داخل دالة فقط:
{ )(function test
;""use strict
الكود هنا يعمل بصرامة //
}
مثال عملي:
بدون :Strict Mode
تعرف x = 10; //
xيعمل ،حتى لو لم ّ
console.log(x); //10
في الكود السابق ،يعمل المتحول xحتى لو لم نستخدم الكلمات المحجوزة varأو letأو const؛ ألن
لغة جافا سكريبت ليست غبية لهذا الدرجة.
مع :Strict Mode
;""use strict
) إلى50( في هذه الحالة سيتم إسناد القيمة الثانية التي هي، بارامتر بنفس االسم2 هذا التابع لديه
.100 console وسيطبع في الـ،البارامترين
:Strict Mode أما عندما نستخدم
'use strict';
function code(x, x) {
console.log(x + x);
}
code(20, 50)
انتهت المحاضرة
18