<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/page/13/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A; JavaScript</description><language>ar</language><item><title>&#x645;&#x639;&#x627;&#x645;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x648;&#x627;&#x632;&#x646;&#x629;</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-r700/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/11.jpg.877e78cb4a718391ae66f3b5dfe5aa33.jpg" /></p>

<p>
	لا شك أنَّك تعرَّفت مسبقًا على معاملات الموازنة من أحد دروس الرياضيات في المدرسة وهي:
</p>

<ul>
<li>
		أكبر/أصغر من: <code>a &lt; b</code> - <code>a &gt; b</code>.
	</li>
	<li>
		أكبر/أصغر من أو يساوي: <code>a &lt;= b</code> - <code>a &gt;= b</code>.
	</li>
	<li>
		المساواة: <code>a == b</code> (يرجى ملاحظة أنَّ هذا المعامل عبارة عن علامة يساوي مزدوجة <code>=</code>. العلامة المنفردة <code>a = b</code> خاصة بمعامل الإسناد الذي تحدثنا عنه في المقال السابق).
	</li>
	<li>
		عدم المساواة: يُعبر عنه في الرياضيات بالرمز<code>≠</code>، ولكن يُعبِّر عنه برمجيًّا في JavaScript بإشارة يساوي منفردة مع إشارة تعجب قبلها بالشكل: <code>a != b</code>.
	</li>
</ul>
<h2 id="-">
	النتيجة عبارة عن قيمة منطقية
</h2>

<p>
	مثل كل المعاملات الأخرى، تُرجِع معاملات الموازنة قيمة منطقية دومًا.
</p>

<ul>
<li>
		<code>true</code> - تعني «نعم» أو «صواب» أو «الموازنة مُحقَّقة».
	</li>
	<li>
		<code>false</code> - تعني «لا» أو «خطأ» أو «الموازنة غير مُحقَّقة».
	</li>
</ul>
<p>
	إليك أمثلة عن هذه المعاملات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_7" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln">  </span><span class="com">// true (الموازنة صحيحة)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false (الموازنة خطأ)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true (الموازنة صحيحة)</span></pre>

<p>
	يمكن إسناد نتيجة معامل الموازنة لمتغير تمامًا مثل أي قيمة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_9" style="">
<span class="pln">let result </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln"> </span><span class="com">// إسناد الناتج من عملية الموازنة لمتغير</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> result </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<h2 id="-">
	موازنة السلاسل النصية
</h2>

<p>
	لمعرفة ما إذا كانت السلسلة النصية أكبر من الأخرى، تستخدم JavaScript ما يسمى بترتيب القاموس (dictionary) أو ترتيب المعجم (lexicographical). بمعنى آخر، تتم موازنة السلاسل النصية حرفًا تلو الآخر. على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_11" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'Z'</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'A'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'Glow'</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'Glee'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'Bee'</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'Be'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	خوارزمية موازنة سلسلتين نصيتين بسيطة:
</p>

<ol>
<li>
		موازنة الحرف الأول من كلا السلسلتين.
	</li>
	<li>
		إذا كان الحرف الأول من السلسلة النصية الأولى أكبر (أو أقل) من السلسلة النصية الأخرى، حينها تكون الأولى أكبر (أو أقل) من الثانية وبذلك تنتهي عملية الموازنة.
	</li>
	<li>
		لكن إذا كانت الأحرف الأولى في كلا السلسلتين متماثلة، وازن الأحرف الثانية بالطريقة نفسها.
	</li>
	<li>
		كرر حتى نهاية أي سلسلة.
	</li>
	<li>
		إذا انتهت كلا السلسلتين بالطول نفسه، فهما متساويتان. خلاف ذلك يكون السلسلة النصية الأطول هو الأكبر.
	</li>
</ol>
<p>
	في الأمثلة أعلاه، تحصل الموازنة <code>'Z' &gt; 'A'</code> على النتيجة في الخطوة الأولى بينما تُوازن السلسلتين النصيتين <code>"Glow"</code> و <code>"Glee"</code> حرفًا تلو الآخر حتى الحرف الأخير بالتسلسل التالي:
</p>

<ol>
<li>
		<code>G</code> هو نفسه <code>G</code>.
	</li>
	<li>
		<code>l</code> هو نفسه <code>l</code>.
	</li>
	<li>
		<code>o</code> أكبر من <code>e</code>. توقف هنا، السلسلة الأولى أكبر.
	</li>
</ol>
<h3 id="-">
	ليس قاموس حقيقي، ولكنه ترتيب ترميز اليونيكود
</h3>

<p>
	إنَّ خوارزمية الموازنة المذكورة أعلاه تعادل تقريبًا تلك المستخدمة في القواميس ودفاتر الهاتف، ولكن مع اختلاف بسيط يتعلق بحالة الحرف. فالحرف الكبير <code>"A"</code> لا يساوي الحرف الصغير <code>"a"</code> كما تعتقد فأيهما أكبر برأيك؟ الحرف الصغير <code>"a"</code> طبعًا. أسمعك تسأل لماذا؟ لأنَّ الحرف الصغير له رقم تسلسلي أكبر في جدول الترميز المقابل له في جدول اليونيكود المستخدم في JavaScript، حسنًا، سكفي إلى هنا وسنعاود الحديث عن هذا الموضوع والنتائج المترتبة عليه في فصل السلاسل النصية.
</p>

<h2 id="-">
	موازنة بين أنواع البيانات المختلفة
</h2>

<p>
	عند موازنة أنواع بيانات مختلفة، تحوّل JavaScript القيم إلى أعداد. على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_13" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'2'</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true, تُحوَّل السلسلة النصية '2' إلى العدد 2</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'01'</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true, تُحوَّل السلسلة النصية '01' إلى العدد 1</span></pre>

<p>
	بالنسبة للقيم المنطقية، <code>true</code> تصبح <code>1</code> و <code>false</code> تصبح <code>0</code>. على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_15" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	نتيجة مضحكة أليس كذلك؟!
</p>

<p>
	من الممكن في الوقت نفسه أن تكون القيمتان:
</p>

<ul>
<li>
		متساويتين.
	</li>
	<li>
		واحدة منهما <code>true</code> والأخرى <code>false</code>.
	</li>
</ul>
<p>
	إليك مثال عن حالة مماثلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_17" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Boolean</span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">

let b </span><span class="pun">=</span><span class="pln"> </span><span class="str">"0"</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Boolean</span><span class="pun">(</span><span class="pln">b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">a </span><span class="pun">==</span><span class="pln"> b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true!</span></pre>

<p>
	من وجهة نظر JavaScript، هذه النتيجة طبيعية تمامًا. تُحوّل عملية التحقق من المساواة القيم باستخدام التحويل العددي (وبالتالي السلسلة النصية <code>"0"</code> تساوي القيمة <code>0</code>)، بينما يستخدم التحويل الصريح <code>Boolean</code> مجموعة أخرى من القواعد.
</p>

<h2 id="-">
	معامل المساواة الصارمة
</h2>

<p>
	معامل المساواة العادية <code>==</code> لديه مشكلة، وهي عدم قدرته على التمييز بين <code>0</code> و <code>false</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_19" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	يحدث الشيء نفسه مع السلسلة النصية الفارغة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_23" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">''</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	يحدث هذا لأنَّ الأنواع المختلفة من العاملات تُحول إلى أعداد بواسطة معامل المساواة <code>==</code>. السلسلة النصية الفارغة مثل <code>false</code>، تصبح صفرًا.
</p>

<p>
	ماذا نفعل إذا كنا نرغب في التمييز بين <code>0</code> و <code>false</code>؟ معامل المساواة الصارمة <code>===</code> يتحقق من المساواة دون تحويل القيم. بمعنى آخر، إذا كان <code>a</code> و<code>b</code> قيمتين من نوعين مختلفين، فسوف تُرجع المعادلة <code>a === b</code> على الفور <code>false</code> دون محاولة تحويلها، وبذلك يتحقق المعامل <code>===</code> من تساوي النوع أولًا ثم تساوي القيمة.
</p>

<p>
	دعنا نجرب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_25" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false, لأن القيمتين من نوعين مختلفين</span></pre>

<p>
	هناك أيضًا معامل عدم مساواة صارم <code>‎!==‎</code> مماثل للمعامل <code>‎!=‎</code>.
</p>

<p>
	يعد معامل المساواة الصارمة أطول قليلاً في الكتابة، ولكنه أكثر وضوحًا ويترك مساحة أقل للأخطاء.
</p>

<h2 id="-null-undefined-">
	الموازنة مع قيمة فارغة <code>null</code> وغير مُعرّفة <code>undefined</code>
</h2>

<p>
	دعنا نرى المزيد من الحالات الخاصة. تسلك عملية الموازنة سلوكًا غير منطقي عند موازنة قيمة فارغة <code>null</code> أو غير مُعرّفة <code>undefined</code> مع قيم أخرى، إذ هاتان القيمتان من نوعين مختلفين.
</p>

<p>
	تذكر أنَّه للتحقق من المساواة بصرامة، استعمل المعامل <code>===</code> دومًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_27" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	للتحقق من المساواة دون أخذ النوع بالحسبان، استعمل المعامل <code>==</code>. بمعنى أنَّ القيمتين <code>null</code> و <code>undefined</code> متساويتان فقط مع بعضهما ولكن ليستا متساويتان مع أي قيمة أخرى.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_29" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<h3 id="-">
	الرياضيات ومعاملات الموازنة الأخرى <code>‎&lt; &gt; &lt;= &gt;=‎</code>
</h3>

<p>
	القيمة الفارغة وغير المُعرّفة <code>null</code> و <code>undefined</code> يتم تحويلها إلى عدد: <code>null</code> تصبح <code>0</code>، بينما <code>undefined</code> تصبح <code>NaN</code>.
</p>

<p>
	الآن دعنا نرى بعض الأشياء المضحكة التي تحدث عندما نطبق هذه القواعد، والأهم من ذلك هو كيفية تجنب هذا الفخ.
</p>

<h3 id="-null-0">
	نتيجة غريبة: <code>null</code> مقابل 0
</h3>

<p>
	دعنا نوازن <code>null</code> مع 0:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_31" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln">  </span><span class="com">// (1) false</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// (2) false</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// (3) true</span></pre>

<p>
	رياضيًّا، هذا غريب، إذ تشير النتيجة الأخيرة إلى أنَّ «<code>null</code> أكبر من أو تساوي 0»، لذلك يجب في إحدى الموازنات أعلاه أن تكون صحيحة <code>true</code>، لكن كلاهما خطأ.
</p>

<p>
	السبب هو أنَّ التحقق من المساواة <code>==</code> ومعاملات الموازنة <code>‎&gt; &lt; &gt;= &lt;=‎</code> تعمل بشكل مختلف. تحول الموازنات القيمة الفارغة <code>null</code> إلى عدد، وتعاملها على أنها <code>0</code> ولهذا السبب، نتيجة الموازنة في المثال السابق في السطر (3) <code>null &gt;= 0</code> مُحقَّقة أي <code>true</code> وفي السطر (1) خطأ <code>null &gt; 0</code>.
</p>

<p>
	من ناحية أخرى، يتم التحقق من المساواة <code>==</code> على <code>undefined</code>و<code>null</code> بدون أي تحويل، حيث أنه يساوي كل منهما الآخر ولا يساويها أي قيمة أخرى. لهذا السبب، نتيجة الموازنة في المثال السابق في السطر (2) <code>null == 0</code> غير محقَّقة.
</p>

<p>
	القيمة غير المُعرّفة <code>undefined</code> غير قابلة للموازنة أي لا ينبغي موازنتها <code>undefined</code> مع القيم الأخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_33" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false (1)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false (2)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// false (3)</span></pre>

<p>
	لماذا يُكره الصفر كثيرًا؟ دائما خطأ! حصلنا على هذه النتائج لأن:
</p>

<ul>
<li>
		معاملات الموازنة في السطر <code>(1)</code> و<code>(2)</code> في المثال السابق تُرجع <code>false</code>، لأن القيمة <code>undefined</code> تُحوّل إلى <code>NaN</code> وهي عبارة عن قيمة رقمية خاصة تعيد <code>false</code> لكافة الموازنات.
	</li>
	<li>
		تُرجع عملية التحقق من المساواة في السطر<code>(3)</code> القيمة <code>false</code>، لأن القيمة غير المُعرّفة <code>undefined</code> تساوي فقط القيمة <code>null</code> و <code>undefined</code>، ولا تساوي قيم أخرى.
	</li>
</ul>
<h2 id="-">
	تجنب المشاكل
</h2>

<p>
	لماذا ذكرنا هذه الأمثلة؟ هل يجب أن نتذكر هذه الخصائص في كل وقت؟ نعم، ولا فلا توجد إجابة دقيقة. على أي حال، ستصبح هذه الأشياء التي تراها صعبة ومعقدة تدريجيًا مألوفة وبديهية، ومع ذلك هناك طريقة جيدة للتهرب من مثل هذه الأمثلة:
</p>

<ul>
<li>
		تعامل بالصورة المألوفة مع أي موازنة بها <code>undefined/null</code>، باستثناء المساواة الصارمة <code>===</code> فهي تحتاج معاملة استثنائية.
	</li>
	<li>
		لا تستخدم معاملات الموازنة <code>‎&gt;= &gt; &lt; &lt;=‎</code> مع متغير قد يأخذ إحدى القيمتين <code>null/undefined</code>، إلا إذا كنت متأكدًا حقًا مما تفعله. إذا كان المتغير عبارة عن هاتين القيمتين، فتحقق منها بشكل منفصل.
	</li>
</ul>
<h2 id="-">
	الخلاصة
</h2>

<ul>
<li>
		تُرجع معاملات الموازنة قيمة منطقية.
	</li>
	<li>
		تُوازن السلاسل النصية حرفًا تلو الآخر حسب ترتيب القاموس (dictionary).
	</li>
	<li>
		عند موازنة قيم من أنواع بيانات مختلفة، يتم تحويلها إلى أرقام (باستثناء التحقق من المساواة الصارمة).
	</li>
	<li>
		القيم الفارغة <code>null</code> وغير المعرّفة <code>undefined</code> تساوي <code>==</code> بعضها بعضًا، ولا تساوي أي قيمة أخرى.
	</li>
	<li>
		كن حذرًا عند استخدام معاملات موازنة مثل<code>&gt;</code> أو <code>&lt;</code> مع متغيرات يمكن أن تكون فارغة <code>null</code> أو غير معرّفة <code>undefined</code> ويفضل التحقق من ذلك بشكل منفصل.
	</li>
</ul>
<style type="text/css">
.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}
code {
    background-color: rgb(250, 250, 250);
    border-radius: 3px;
}</style>
<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	الموازنات
</h3>

<p class="task__importance">
	الأهمية: 5
</p>

<p>
	ماذا ستكون نتيجة هذه الموازنات
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7916_35" style="">
<span class="lit">5</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pln">
</span><span class="str">"apple"</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">"pineapple"</span><span class="pln">
</span><span class="str">"2"</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">"12"</span><span class="pln">
</span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln">
</span><span class="kwd">undefined</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">null</span><span class="pln">
</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"\n0\n"</span><span class="pln">
</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="pun">+</span><span class="str">"\n0\n"</span></pre>

<p>
	<strong>الحل</strong>
</p>

<div class="task__answer">
	<ol>
<li>
			<code>5 &gt; 4                 ← true</code>
		</li>
		<li>
			<code>"apple" &gt; "pineapple"‏ ← false</code>
		</li>
		<li>
			<code>"2" &gt; "12"            ← true</code>
		</li>
		<li>
			<code>undefined == null‏     ← true</code>
		</li>
		<li>
			<code>undefined === null‏    ← false</code>
		</li>
		<li>
			<code>null == "\n0\n"‏       ← false</code>
		</li>
		<li>
			<code>null === +"\n0\n"‏     ← false</code>
		</li>
	</ol>
<p>
		بعض الأسباب:
	</p>

	<ol>
<li>
			نتيجة الموازنة واضحة، صحيحة.
		</li>
		<li>
			حسب موازنة القاموس، النتيجة خاطئة.
		</li>
		<li>
			حسب موازنة القاموس مرة أُخرى، الحرف الأول من القيمة<code>"2"</code> أكبر من الحرف الأول من القيمة<code>"1"</code>.
		</li>
		<li>
			القيم <code>null</code> و <code>undefined</code> تساويان بعضهما فقط.
		</li>
		<li>
			المساواة الصارمة صارمة فيما يخص نوع المتغير، وعند اختلاف نوع طرفي المعامل فإن النتيجة تصبح خاطئة.
		</li>
		<li>
			انظر للنقطة رقم (4).
		</li>
		<li>
			مساواة صارمة لنوعان مختلفان من القيم.
		</li>
	</ol>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/comparison#strict-equality" rel="external nofollow">comparisons</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A%D8%A9-alert-%D8%8Cprompt-%D8%8Cconfirm-r701/" rel="">الدوال التفاعلية: alert ،prompt ،confirm</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-javascript-r699/" rel="">المعاملات في JavaScript</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">700</guid><pubDate>Thu, 27 Jun 2019 18:08:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x639;&#x627;&#x645;&#x644;&#x627;&#x62A; &#x641;&#x64A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-javascript-r699/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/10.jpg.5a55a27aacdf45af85ac15e6832effc6.jpg" /></p>

<p>
	تعرَّفنا على العديد من المعاملات الحسابية في المدرسة، مثل الجمع <code>+</code>، الضرب <code>*</code>، الطرح <code>–</code> وما إلى ذلك. في هذا المقال، سنشرح معاملات أخرى لم نتعرف عليها في المدرسة بالإضافة إلى تلك المعاملات.
</p>

<p>
	 
</p>

<h2 id="-">
	مصطلحات جديدة: أحادي، ثنائي، عامل
</h2>

<p>
	قبل أن نمضي قدمًا في هذا المقال، دعنا نتعرَّف على بعض المصطلحات الجديدة.
</p>

<ul>
<li>
		<p>
			العوامل (operands): هي العناصر (القيمة) التي تُنفَّذ عملية المعاملات (operators) عليها. على سبيل المثال، في عملية الضرب <code>5 * 2</code>، يوجد عاملان؛ العامل الأيسر هو 2 والأيمن هو 5. يطلق عليها البعض أحيانًا الاسم «وسائط» (arguments) بدلًا من «عوامل» (operands).
		</p>
	</li>
	<li>
		<p>
			المعامل الأحادي: يكون المعامل أحاديًّا (unary) إذا كان لديه عامل (operand) واحد فقط. على سبيل المثال، عملية النفي هي عملية أحادية، إذ تعكس اشارة العدد، فيصبح سالبًا <code>-</code> إذا كان موجبًا <code>+</code> والعكس صحيح:
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_7" style="">
<span class="pln">let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="pln">x</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> x </span><span class="pun">);</span><span class="pln"> </span><span class="com">// -1, تم تطبيق النفي الأحادي</span></pre>

<ul>
<li>
		المعامل الثنائي: يكون المعامل ثنائيًّا (binary) إذا كان لديه عاملان (operands). يوضح المثال التالي إشارة السالب التي في المثال السابق عندما تكون في المعامل الثنائي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_9" style="">
<span class="pln">let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> y </span><span class="pun">-</span><span class="pln"> x </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, معامل الطرح الثنائي يطرح القيم</span></pre>

<p>
	تقنيًّا، نتحدث هنا عن نوعين من المعاملات لإشارة واحدة <code>-</code> هما: النفي الأحادي (العامل الفردي: عكس الإشارة) والطرح الثنائي (عاملان: عملية طرح)، لذا يجب التفريق بينهما.
</p>

<h2 id="-">
	وصل سلاسل نصية عبر المعامل <code>+</code>
</h2>

<p>
	الآن، سنتعرَّف على ميِّزات خاصة بمعاملات JavaScript تتجاوز تلك التي تعلمناها في المدرسة.
</p>

<p>
	المتعارف عليه أنَّ معامل الجمع <code>+</code> يجمع الأرقام. لكن إذا تم تطبيق معامل الجمع <code>+</code> على سلاسل نصية، فإنه يُوصل هذه السلاسل النصية مع بعضها بعضًا ويضعها في سلسلة نصية واحدة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_11" style="">
<span class="pln">let s </span><span class="pun">=</span><span class="pln"> </span><span class="str">"my"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"string"</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln"> </span><span class="com">// mystring</span></pre>

<p>
	لاحظ أنه يتم تحويل العدد إلى سلسلة نصية عن طريق وضعه داخل علامات الاقتباس (<code>""</code>) ويعامل آنذاك معاملة السلسلة النصية. ولاحظ أيضًا إذا كان أحد العاملين (operands) عبارة عن سلسلة نصية، فسيُحوَّل الآخر تلقائيًا إلى سلسلة نصية. إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_13" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// "12"</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// "21"</span></pre>

<p>
	كما رأيت، لا يهم ما إذا كان العامل الأول عبارة عن سلسلة نصية أم الثاني. القاعدة بسيطة: إذا كان أحد العاملين عبارة عن سلسلة نصية، فسيُحوَّل الآخر إلى سلسلة نصية أيضًا.
</p>

<p>
	لكن انتبه! المعاملات تبدأ من اليسار إلى اليمين. فإذا كان هناك عددان متبوعان بسلسلة نصية، فستُجمَع الأعداد قبل تحويلها إلى سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_15" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// "أي أن الناتج "41" وليس "221</span></pre>

<p>
	خاصية وصل السلاسل النصية وجمعها في سلسلة واحدة (String concatenation) ميزة خاصة بمعامل الجمع <code>+</code>، بينما تعمل المعاملات الحسابية الأخرى مع الأعداد فقط. فعلى سبيل المثال، الطرح والقسمة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_17" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">'6'</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="str">'2'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 3</span></pre>

<h2 id="-">
	خاصية التحويل العددي
</h2>

<p>
	يوجد لمعامل الجمع <code>+</code> صيغتان: الأول معامل الجمع الثنائي كما في خاصية دمج السلاسل النصية، والثاني معامل الجمع الأحادي كما في هذه الخاصية.
</p>

<p>
	معامل الجمع الأحادي أو بمعنى آخر، معامل الجمع <code>+</code> المطبق على قيمة واحدة، لا يُحدث تغييرًا على الأعداد. ولكن إذا لم يكن العامل عددًا، فإن عملية الجمع الأحادي تحوّله إلى عدد. اطلع على المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_19" style="">
<span class="com">// لا تأثير على الأعداد</span><span class="pln">
let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+</span><span class="pln">x </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

let y </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+</span><span class="pln">y </span><span class="pun">);</span><span class="pln"> </span><span class="com">// -2</span><span class="pln">

</span><span class="com">// تحويل غير الأعداد</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+</span><span class="kwd">true</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+</span><span class="str">""</span><span class="pln"> </span><span class="pun">);</span><span class="pln">   </span><span class="com">// 0</span></pre>

<p>
	يقوم هذا المعامل هنا مقام الدالة <code>Number‎</code>، لكنه أقصر وأبسط.
</p>

<p>
	تنشأ الحاجة لتحويل السلاسل النصية إلى أعداد في كثير من الأحيان. على سبيل المثال، إذا كنا نحصل على القيم من قالب HTML، فهي غالبًا ما تكون عبارة عن سلاسل نصية. ماذا لو أردنا دمجها؟ معامل الجمع الثنائي سيضيفها كسلاسل نصية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_21" style="">
<span class="pln">let apples </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2"</span><span class="pun">;</span><span class="pln">
let oranges </span><span class="pun">=</span><span class="pln"> </span><span class="str">"3"</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> apples </span><span class="pun">+</span><span class="pln"> oranges </span><span class="pun">);</span><span class="pln"> </span><span class="com">// "23", معامل الجمع الثنائي يدمج السلاسل النصية</span></pre>

<p>
	إذا كنا نريد أن نعاملها كأعداد، نحتاج إلى تحويلها ثم دمجها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_23" style="">
<span class="pln">let apples </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2"</span><span class="pun">;</span><span class="pln">
let oranges </span><span class="pun">=</span><span class="pln"> </span><span class="str">"3"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// كلا القيمتين حُولتا إلى أعداد قبل تطبيق معامل الجمع الثنائي</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+</span><span class="pln">apples </span><span class="pun">+</span><span class="pln"> </span><span class="pun">+</span><span class="pln">oranges </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 5</span><span class="pln">

</span><span class="com">// بصيغة أطول</span><span class="pln">
</span><span class="com">// alert( Number(apples) + Number(oranges) ); // 5</span></pre>

<p>
	من وجهة نظر عالم رياضيات، تبدو كثرة معاملات الجمع غريبة. ولكن من وجهة نظر المبرمج، لا يوجد شيء مميز: يتم تطبيق معاملات الجمع الأحادي أولاً لتحويل السلسلة النصية إلى عدد، ثم يجمع معامل الجمع الثنائي العددين الناتجين.
</p>

<p>
	لماذا يتم تطبيق معاملات الجمع الأحادية على القيم قبل الثنائية؟ هذا يعود للأولوية الأعلى في التنفيذ كما سنرى بعد قليل.
</p>

<h2 id="-">
	ترتيب أولوية المعاملات
</h2>

<p>
	إذا كان في المعادلة أكثر من معامل واحد، يتم تحديد ترتيب التنفيذ حسب أولوية هذه المعاملات. في المدرسة، تعلمنا جميعًا أنه يجب حساب الضرب في المعادلة<code>1 + 2 * 2</code> قبل الجمع، هذا تحديدًا ما يسمى أولوية العملية الرياضية. أي أن عملية الضرب لها أولوية أعلى من الجمع.
</p>

<p>
	تتخطى الأقواس أولوية أي معامل، لذلك إذا لم نكن راضين عن أولوية المعاملات (operations) في المعادلة، يمكننا استخدام الأقواس لتغييرها. على سبيل المثال: <code>(1 + 2) * 2</code>.
</p>

<p>
	هناك العديد من المعاملات في JavaScript. كل معامل لديه رقم في ترتيب الأولوية، والمعامل صاحب الأولوية الأعلى يُنفَّذ أولًا. إذا كانت الأولوية لمجموعة معاملات في نفس الترتيب، يكون التنفيذ من اليسار إلى اليمين.
</p>

<p>
	إليك مقتطف من جدول الأولوية (لست بحاجة إلى حفظ ذلك، لكن لاحظ أن المعاملات الأحادية أعلى أولوية من المعاملات الثنائية المقابلة).
</p>

<table>
<thead><tr>
<th>
				الأولوية
			</th>
			<th>
				اسم المعامل
			</th>
			<th>
				إشارة المعامل
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				...
			</td>
			<td>
				...
			</td>
			<td>
				...
			</td>
		</tr>
<tr>
<td>
				16
			</td>
			<td>
				الجمع الأحادي
			</td>
			<td>
				<code>+</code>
			</td>
		</tr>
<tr>
<td>
				16
			</td>
			<td>
				النفي الأحادي
			</td>
			<td>
				<code>-</code>
			</td>
		</tr>
<tr>
<td>
				14
			</td>
			<td>
				الضرب
			</td>
			<td>
				<code>*</code>
			</td>
		</tr>
<tr>
<td>
				14
			</td>
			<td>
				القسمة
			</td>
			<td>
				<code>/</code>
			</td>
		</tr>
<tr>
<td>
				13
			</td>
			<td>
				الجمع الثنائي
			</td>
			<td>
				<code>+</code>
			</td>
		</tr>
<tr>
<td>
				13
			</td>
			<td>
				الطرح الثنائي
			</td>
			<td>
				<code>-</code>
			</td>
		</tr>
<tr>
<td>
				...
			</td>
			<td>
				...
			</td>
			<td>
				...
			</td>
		</tr>
<tr>
<td>
				3
			</td>
			<td>
				الإسناد
			</td>
			<td>
				<code>=</code>
			</td>
		</tr>
<tr>
<td>
				...
			</td>
			<td>
				...
			</td>
			<td>
				...
			</td>
		</tr>
</tbody>
</table>
<p>
	كما ترى، معامل الجمع الأحادي له الأولوية 16 وهي أعلى من 13 لمعامل الجمع الثنائي. لهذا السبب، يُنفَّذ معامل الجمع الأحادي أولًا في المعادلة <code>+apples + +oranges</code> الذي يمثِّل عملية التحويل قبل عملية الجمع وهذا هو المطلوب.
</p>

<h2 id="-">
	معامل الإسناد <code>=</code>
</h2>

<p>
	لاحظ أنَّ معامل الإسناد = مدرجٌ في جدول الأولوية الخاص بالمعاملات مع أولوية منخفضة للغاية وهي 3. لهذا السبب، عندما نسند قيمة لمتغير، مثل <code>x = 2 * 2 + 1</code>، تُنفَّذ العمليات الحسابية حسب أولويتها ثمَّ تُسنَد القيمة الناتجة (5) إلى المتغيِّر x وتُخزَّن فيه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_25" style="">
<span class="pln">let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> x </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 5</span></pre>

<p>
	من الممكن سَلسَلة معاملات الإسناد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_27" style="">
<span class="pln">let a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">;</span><span class="pln">

a </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> a </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 4</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> b </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 4</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> c </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 4</span></pre>

<p>
	يتم تنفيذ سَلسَلة معاملات الإسناد من اليمين إلى اليسار. أولاً، يُقيَّم التعبير <code>2 + 2</code> الموجود في أقصى اليمين ثم تُسنَد القيمة الناتجة عنه إلى المتغيرات الموجودة على اليسار:<code>c</code>، و<code>b</code> و <code>a</code>. في النهاية، تشترك جميع تلك المتغيرات في القيمة النهائية الناتجة.
</p>

<h3 id="-">
	معامل الإسناد <code>=</code> يُرجع قيمة
</h3>

<p>
	المعامل دائما يرجع قيمة. هذا واضح في معامل الجمع <code>+</code> أو الضرب <code>*</code>، ويتبع معامل الإسناد <code>=</code> أيضًا هذه القاعدة. فالاستدعاء <code>x = Value</code> يُخزِّن القيمة في <code>x</code> ثم يرجعها.
</p>

<p>
	يوضح المثال التالي كيفية الاستفادة من هذه الميزة باستخدام القيمة الناتجة عن عملية الإسناد في معادلة أخرى أكثر تعقيدًا، وبذلك نضرب عصفورين بحجر واحد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_29" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
let b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

let c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> a </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 3</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> c </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span></pre>

<p>
	في المثال أعلاه، تكون نتيجة <code>a = b + 1</code> هي القيمة التي جرى إسنادها إلى<code>a</code> أي <code>3</code>، ثم يتم طرح من هذه القيمة <code>3</code>.
</p>

<p>
	شيفرة مضحكة، أليس كذلك؟! لكن يجب أن نفهم كيف تعمل لأنه في بعض الأحيان نراها في مكتبات خارجية كتبها آخرون، ولا يُفضل إطلاقًا أن نكتب مثل هذه الشيفرات، لأنَّ هذه الحيل لا تجعل من الشيفرة أكثر وضوحًا أو أكثر قابلية للقراءة.
</p>

<h2 id="-">
	معامل باقي القسمة <code>%</code>
</h2>

<p>
	معامل باقي القسمة <code>%</code>، لا يرتبط بالنسب المئوية. الناتج من هذه المعادلة <code>a % b</code> هو العدد المتبقي من قسمة العدد الصحيح <code>a</code> على العدد الصحيح<code>b</code>. إليك مثال عنه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_31" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1 (هو الباقي من قسمة 5 على 2)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">8</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2 (هو الباقي من قسمة 8 على 3)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0 (هو الباقي من قسمة 6 على 3)</span></pre>

<h2 id="-">
	معامل القوة <code>**</code>
</h2>

<p>
	معامل القوة <code>**</code> هو إضافة حديثة لـ JavaScript. ليكن لدينا الرقم الطبيعي <code>b</code>، فيكون ناتج العملية <code>a ** b</code> هو الرقم <code>a</code> مضروبًا في نفسه عدد <code>b</code> من المرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_33" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 4  (2 * 2)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 8  (2 * 2 * 2)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 16 (2 * 2 * 2 * 2)</span></pre>

<p>
	يعمل معامل القوة مع الأعداد غير الصحيحة أيضًا مثل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_35" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2 (معامل القوة ½ هو نفس الجذر التربيعي)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">8</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2 (معامل القوة ⅓ هو نفس الجذر التكعيبي)</span></pre>

<h2 id="-">
	معاملات الزيادة <code>++</code> والنقصان <code>--</code>
</h2>

<p>
	تُعدُّ الزيادة على العدد أو إنقاصه بمقدار 1 من أكثر العمليات العددية شيوعًا. لذلك، هناك معاملات خاصة لهذا الغرض:
</p>

<ul>
<li>
		معامل الزيادة <code>++</code> يزيد على قيمة المتغير مقدار 1:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_37" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
counter</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// ببساطة counter = counter + 1 هو اختصار للعملية</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> counter </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 3</span></pre>

<ul>
<li>
		معامل النقصان <code>--</code> ينقص من قيمة المتغير مقدار 1:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_39" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
counter</span><span class="pun">--;</span><span class="pln">      </span><span class="com">// counter = counter - 1 هو اختصار للعملية</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> counter </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span></pre>

<p>
	تنبيه: معاملات الزيادة / النقصان خاصة بالمتغيرات فقط، ومحاولة تطبيقها على قيم عددية مثل <code>‎5++‎</code> سيعطي خطأ.
</p>

<p>
	يمكن وضع هذين المعاملين <code>++</code>، <code>--</code> قبل المتغير أو بعده.
</p>

<ul>
<li>
		عندما يتبع المعامل المتغير، هذا ما يسمى «النموذج اللاحق» (postfix form) مثل <code>counter++</code>.
	</li>
	<li>
		وبالمثل، «النموذج السابق» (prefix form)، عندما يأتي المعامل قبل المتغير مثل <code>++counter</code>.
	</li>
</ul>
<p>
	كلا النموذجين يقومان بالعمل نفسه وهو الزيادة على قيمة المتغير <code>counter</code> بمقدار 1. إذن، هل هناك فرق؟ نعم، ولكن لا يمكننا رؤيته إلا إذا استخدمنا القيمة المعادة من العملية تلك.
</p>

<p>
	دعني أوضح لك أكثر. كما نعلم، جميع المعاملات ترجع قيمة وكذلك أيضًا معاملات الزيادة/النقصان. يعيد النموذج السابق القيمة الجديدة بينما يعيد النموذج اللاحق القيمة القديمة (قبل الزيادة / النقصان).
</p>

<p>
	إليك مثال على ذلك ليتضح كل الفرق وضوح الشمس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_41" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
let a </span><span class="pun">=</span><span class="pln"> </span><span class="pun">++</span><span class="pln">counter</span><span class="pun">;</span><span class="pln"> </span><span class="com">// (*)</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2</span></pre>

<p>
	في السطر المُميّز بالنجمة (*)، يزيد النموذج السابق <code>++counter</code> قيمة المتغير <code>counter</code> ويعيد القيمة الجديدة الناتجة وهي <code>2</code>. لذا، تُظهر الدالة <code>alert</code> القيمة <code>2</code>.
</p>

<p>
	الآن، دعني استخدم النموذج اللاحق بدلًا من النموذج السابق لمعرفة الفرق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_43" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
let a </span><span class="pun">=</span><span class="pln"> counter</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// (*)</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span></pre>

<p>
	في السطر المُميّز بالنجمة (*)، يزيد النموذج اللاحق <code>counter++</code> قيمة المتغير <code>counter</code> لكنه يعيد القيمة القديمة (قبل الزيادة). لذا، تُظهِر الدالة <code>alert</code> القيمة <code>1</code>.
</p>

<p>
	مختصر القول:
</p>

<ul>
<li>
		إذا لم يتم استخدام القيمة الناتجة من معاملي الزيادة والانقاص، فلا يوجد فرق في النموذج الذي يتم استخدامه سواءً سابق أو لاحق:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_45" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
counter</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">++</span><span class="pln">counter</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> counter </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, كلا السطرين يؤديان نفس الغرض</span></pre>

<ul>
<li>
		أمَّا إذا كنت ترغب في زيادة قيمة المتغير واستخدامها مباشرةً، فأنت بحاجة إلى استعمال النموذج السابق:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_47" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">++</span><span class="pln">counter </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span></pre>

<ul>
<li>
		وإذا كنت ترغب في زيادة قيمة المتغير ولكنك تريد استخدام قيمته السابقة، فاستعمل النموذج اللاحق:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_49" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> counter</span><span class="pun">++</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span></pre>

<h3 id="-">
	معاملات زيادة / نقصان داخل معاملات اخرى:
</h3>

<p>
	يمكن استخدام معاملات زيادة / نقصان (<code>++</code> / <code>--</code>) داخل المعادلات أيضًا، وأولويتها في التنفيذ أعلى من معظم المعاملات الحسابية الأخرى. إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_51" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">++</span><span class="pln">counter </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 4</span></pre>

<p>
	وازنه مع المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_53" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> counter</span><span class="pun">++</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, لأن counter++ يرجع القيمة القديمة</span></pre>

<p>
	رغم أنَّه مقبول من الناحية التقنية، إلا أنَّ هذه الشيفرة عادة ما تجعل الشيفرة الكلية صعبة القراءة. اتباع نموذج «سطر واحد يفعل أشياء متعددة» ليس جيدًا ويولد شيفرة صعبة القراءة والتنقيح.
</p>

<p>
	أثناء تَصفُّح الشيفرة سريعًا يمكن أن لا تنتبه على شيء مثل <code>counter++</code>، أي لن تلاحظ أنَّ قيمة المتغير قد زادت. فتخيل ما سيحصل إن حدث خطأ ما مع وجود مئات مثل تلك الأسطر التي تنجز عدة أشياء سويةً! أنصحك باستخدام أسلوب «سطر واحد - إجراء واحد» (one line – one action):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_55" style="">
<span class="pln">let counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> counter </span><span class="pun">);</span><span class="pln">
counter</span><span class="pun">++;</span></pre>

<h2 id="-">
	المعاملات الثنائية
</h2>

<p>
	تتعامل المعاملات الثنائية (Bitwise operators) مع العوامل كأعداد صحيحة بحجم 32 بت وتعمل على مستوى تمثيلها الثنائي (binary representation). هذه العوامل ليست خاصة بـ JavaScript، وهي مدعومة في معظم لغات البرمجة.
</p>

<p>
	إليك قائمة بالمعاملات الثنائية (Bitwise operators):
</p>

<ul>
<li>
		المعامل AND (<code>&amp;</code>)
	</li>
	<li>
		المعامل OR (<code>|</code>)
	</li>
	<li>
		المعامل XOR (<code>^</code>)
	</li>
	<li>
		المعامل NOT (<code>~</code>)
	</li>
	<li>
		معامل الإزاحة نحو اليسار LEFT SHIFT (<code>&gt;&gt;</code>)
	</li>
	<li>
		معامل الإزاحة نحو اليمين RIGHT SHIFT (<code>&lt;&lt;</code>)
	</li>
	<li>
		معامل الإزاحة نحو اليمين مع إدخال أصفار ZERO-FILL RIGHT SHIFT (<code>&lt;&lt;&lt;</code>)
	</li>
</ul>
<p>
	نادرًا ما تحتاج إلى استخدام مثل هذه المعاملات. وتحتاج لفهمها إلى الخوض في التمثيل الثنائي للأعداد (الصيغة الثنائية المقابلة للصيغة العشرية المفهومة للبشر) وليس من الجيد القيام بذلك الآن، خاصة أننا لسنا بحاجة إلى ذلك في هذا الوقت. إذا كنت فضولي يمكنك قراءة توثيق <a href="https://wiki.hsoub.com/JavaScript/Bitwise_Operators" rel="external">المعاملات الثنائية في JavaScript</a> في <a href="https://wiki.hsoub.com" rel="external">موسوعة حسوب</a>، وهذا كافيًّا الآن. وسنشرحها عمليًّا عندما تنشأ حاجة حقيقية لها في مراحل متقدمة.
</p>

<h2 id="-modify-in-place-">
	معاملات التعديل المباشر على المتغير (Modify-in-place)
</h2>

<p>
	غالبًا ما نحتاج إلى تطبيق معامل على متغير ما وتخزين القيمة الجديدة في المتغير نفسه. انظر مثلًا إلى المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_57" style="">
<span class="pln">let n </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
n </span><span class="pun">=</span><span class="pln"> n </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
n </span><span class="pun">=</span><span class="pln"> n </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span></pre>

<p>
	يمكن اختصار الشيفرة السابقة باستخدام <code>‎+=‎</code> و <code>‎*=‎</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_59" style="">
<span class="pln">let n </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
n </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// (n = n + 5 وهذا يماثل) n = 7 أي تصبح</span><span class="pln">
n </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// (n = n * 2 وهذا يماثل) n = 14 تصبح الآن</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> n </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 14</span></pre>

<p>
	معاملات التعديل والإسناد (modify-and-assign) متاحة لجميع المعاملات الحسابية والثنائية مثل: ‎/=<code>‎</code> و ‎-=<code>‎</code> وتملك هذه المعاملات الأولوية نفسها التي لدى معامل الإسناد العادي <code>=</code>، لذا فهي تُنفَّذ بعد معظم المعاملات الأخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_61" style="">
<span class="pln">let n </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
n </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> n </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 16  (n *= 8 القسم الأيمن يُقيَّم أولًا وهذا يماثل)</span></pre>

<h2 id="-">
	معامل الفاصلة <code>,</code>
</h2>

<p>
	معامل فاصلة (Comma) <code>,</code> هو واحد من أندر المعاملات وأكثرها غرابة. في بعض الأحيان يتم استخدامه لكتابة شيفرة أقصر، لذلك نحن بحاجة إلى التعرف عليه لفهم ذلك.
</p>

<p>
	يتيح لنا معامل الفاصلة تقييم العديد من المعادلات عند فصلها بفاصلة <code>,</code>. يجري تقييم كل قسم منها ولكن يتم إرجاع نتيجة آخر واحد فقط. تفحَّص المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_63" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> a </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 7 (الناتج من جمع 3+4)</span></pre>

<p>
	هنا، يُقيَّم القسم الأول من المعادلة <code>1+2</code> ويُتجاهَل قيمته ثم بعد ذلك يُقيَّم القسم الثاني <code>3+4</code> وتعاد قيمته كنتيجة نهائية.
</p>

<h3 id="-">
	معامل الفاصلة له أولوية منخفضة جدًا
</h3>

<p>
	يرجى ملاحظة أن معامل الفاصلة له أولوية منخفضة للغاية، أقل من معامل الإسناد <code>=</code>، لذلك الأقواس مهمة في المثال أعلاه. بدون الأقواس: <code>a = 1 + 2 ، 3 + 4</code> يُنفَّذ معامل الجمع <code>+</code> أولاً، فتصبح المعادلة <code>a= 3,7</code>، ثم يُنفَّذ معامل الإسناد <code>=</code> فتصبح <code>a=3</code>، وأخيرًا لا يُطبَّق أي معامل على العدد الموجود بعد الفاصلة، أي يُتجاهَل العدد<code>7</code>.
</p>

<p>
	لماذا نحتاج إلى معامل يتجاهل كل القيم باستثناء قيمة الجزء الأخير؟ في بعض الأحيان، يستخدمه المبرمجون في بنيات أكثر تعقيدًا لوضع العديد من الإجراءات في سطر واحد. قد تكون أبسط تلك البنيات المعقدة هي بنية الحلقية التكرارية التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_65" style="">
<span class="com">// ثلاث معاملات في سطر واحد</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">*</span><span class="pln"> b</span><span class="pun">;</span><span class="pln"> a </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> a</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُستخدَم هذه الحيل في العديد من أطر JavaScript. لكنها في العادة لا تحسّن قابلية القراءة للشيفرة، لذلك يجب عليك التفكير جيدًا قبل استخدامها.
</p>
<style type="text/css">
.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}

table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}

code {
    background-color: rgb(250, 250, 250);
    border-radius: 3px;
}</style>
<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	النموذج السابق والنموذج اللاحق
</h3>

<p class="task__importance">
	الأهمية: 5
</p>

<p>
	ما هي القيم النهائية للمتغيرات <code>a</code> ،<code>b</code> ،<code>c</code> ،<code>d</code> بعد تنفيذ الشيفرة التالية؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_73" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
let c </span><span class="pun">=</span><span class="pln"> </span><span class="pun">++</span><span class="pln">a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ?</span><span class="pln">
let d </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// ?</span></pre>

<p>
	<strong>الحل:</strong>
</p>

<div class="task__answer">
	<p>
		الإجابة هي:
	</p>

	<ul>
<li>
			<code>a = 2</code>
		</li>
		<li>
			<code>b = 2</code>
		</li>
		<li>
			<code>c = 2</code>
		</li>
		<li>
			<code>d = 1</code>
		</li>
	</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_71" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> </span><span class="pun">++</span><span class="pln">a </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, النموذج السابق يُرجع القيمة الجديدة</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> b</span><span class="pun">++</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1, النموذج اللاحق يُرجع القيمة القديمة</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln"> a </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, تتم الزيادة مرة واحدة</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln"> b </span><span class="pun">);</span><span class="pln"> </span><span class="com">// 2, تتم الزيادة مرة واحدة</span></pre>
</div>

<h3 id="-">
	نتيجة عملية الإسناد
</h3>

<p class="task__importance">
	الأهمية: 3
</p>

<p>
	ما هي قيم المتغيرين <code>a</code> و <code>x</code> بعد تنفيذ الشيفرة التالية؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9659_69" style="">
<span class="pln">let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	<strong>الحل</strong>
</p>

<div class="task__answer">
	<p>
		الإجابة هي:
	</p>

	<ul>
<li>
			<code>a = 4</code> (مضروبًا في العدد 2)
		</li>
		<li>
			<code>x = 5</code> (عبارة عن مجموع العدد 1 والعدد 4)
		</li>
	</ul>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/operators" rel="external nofollow">operators</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-r700/" rel="">معاملات الموازنة</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-r673/" rel="">التحويل بين الأنواع</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">699</guid><pubDate>Mon, 24 Jun 2019 18:07:00 +0000</pubDate></item><item><title>&#x641;&#x647;&#x645; &#x627;&#x644;&#x623;&#x62D;&#x62F;&#x627;&#x62B; &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r690/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_06/dom(2).png.cce32e60478386c75c5a4755403863d3.png" /></p>

<p>
	في <a href="https://academy.hsoub.com/tags/dom/" rel="">سلسلة فهم شجرة DOM</a>، ناقشنا <a href="https://academy.hsoub.com/programming/%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">شجرة DOM</a> وكيفية <a href="https://academy.hsoub.com/programming/%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-dom-r647/" rel="">الوصول</a> و<a href="https://academy.hsoub.com/programming/%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D8%A8%D9%8A%D9%86-%D8%B9%D9%82%D8%AF-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r648/" rel="">التنقل</a> و<a href="https://academy.hsoub.com/programming/%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%AA%D8%B9%D8%AF%D9%8A%D9%84%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-dom-r667/" rel="">إضافة وإزالة</a> وتعديل العقد والعناصر باستخدام وحدة تحكّم أدوات المطوّر.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}

code {
    background-color: rgb(250, 250, 250);
    border-radius: 3px;
}</style>
<p>
	بإمكاننا إجراء أي تغيير على شجرة DOM حتى هذه اللحظة، من وجهة نظر المستخدم فإنّه ليسَ مفيدًا للغاية لأننا قمنا بتنفيذ التغييرات يدويًّا فقط. سنتعرَّف الآن على الأحداث وربط كل شيء معها لإنشاء مواقع تفاعلية.
</p>

<h2 id="-">
	ما هي الأحداث؟
</h2>

<p>
	<strong>الأحداث</strong> (event) هي الإجراءات التي تحدث في المتصفّح والتي يبدأها المستخدم أو المتصفّح. فيما يلي عدّة أمثلة عن الأحداث الشائعة التي يمكن أن تحدث على موقع الويب:
</p>

<ul>
<li>
		انتهاء الصفحة من التحميل
	</li>
	<li>
		نقر المستخدم على زر
	</li>
	<li>
		تحويم المستخدم سهم الفأرة فوق قائمة منسدلة
	</li>
	<li>
		إرسال المستخدم بياناته
	</li>
	<li>
		ضغط المستخدم على أحد مفاتيح لوحة مفاتيحه.
	</li>
</ul>
<p>
	بإمكان المطورين إظهار رسائل للمستخدم للتحقق من صحة بيانات، والاستجابة إلى ضغط زرٍّ، والعديد من الإجراءات الأخرى وذلك عبر برمجة استجابات جافاسكربت على حدث معيّن.
</p>

<p>
	سنتطرق إلى مُعَالِجَاتَ الأحداث ومُسْتمعي الأحداث وكائنات الأحداث. كما سنعرّج لثلاث طرقٍ مختلفة لكتابة التعليمات البرمجيّة للتعامل مع الأحداث، وبعض الأحداث الأكثر شيوعًا. ستتمكّن من تقديم تجربة ويب أكثر تفاعلية للمستخدمين النهائيين، من خلال التعرف على الأحداث.
</p>

<h2 id="-">
	معالجات الأحداث ومستمعي الأحداث
</h2>

<p>
	عندما ينقر المستخدم على زر أو يضغط المفتاح، يتم قدحُ الحدث، ويُسمّى آنذاك حدث النقر <code>click</code> أو حدث الضغط <code>keypress</code> على التوالي.
</p>

<p>
	<strong>معالج الأحداث</strong> (event handler) هو دالَة جافاسكربت تعمل عند وقوع حدثٍ ما.
</p>

<p>
	يقوم <strong>مستمع الحدث</strong> (event listener) بإرفاق واجهة استجابة لعنصر، ممَّا يسمح لهذا العنصر بالانتظار لإطلاق الحدث المحدّد أو ويكأنه يتنصَّت ويستمع إلى صوت إطلاق ذلك الحدث المتمثِّل بعيار ناري.
</p>

<p>
	هناك ثلاث طرق لإسناد الأحداث إلى العناصر:
</p>

<ul>
<li>
		مُعَالِجَات الأحداث المضمّنة (Inline event handlers).
	</li>
	<li>
		خاصيات معالج الحدث (Event handler properties).
	</li>
	<li>
		مستمعو الأحداث (Event listeners).
	</li>
</ul>
<p>
	سنتعرف على ثلاث الطرق جَمِيعِها للتأكّد من أنك على دراية كاملة بكلِّ طريقة لإطلاق الحدث، ومناقشة إيجابيات وسلبيات كل طريقة.
</p>

<h2 id="-">
	الخصيّات المضمّنة لمعالج الأحدث
</h2>

<p>
	لبدء التعرف على معالجات الأحداث، سننظر أولاً في معالج الحدث المضمَّن (inline event handler9). لنبدأ بمثالٍ بسيط للغاية، يتكون من العنصرين زرٍّ <code>button</code> وفقرة <code>p</code>. ونريد من المستخدم أن يضغط على الزر لتغيير محتوى النص في الفقرة.
</p>

<p>
	لنبدأ بصفحة HTML تحتوي على زرٍ. سنشير إلى ملف جافاسكربت وسنضيف الشيفرة البرمجية فيما بعد:
</p>

<ul>
<li>
		الملف events.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7148_6" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-US"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Events</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

  </span><span class="com">&lt;!-- إضافة زر --&gt;</span><span class="pln">
  </span><span class="tag">&lt;button&gt;</span><span class="pln">Click me</span><span class="tag">&lt;/button&gt;</span><span class="pln">

  </span><span class="tag">&lt;p&gt;</span><span class="pln">Try to change me.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="com">&lt;!-- ملف جافاسكربت --&gt;</span><span class="pln">
</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"js/events.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	سنضيف خاصية على الزر مباشرةً تسمّى <code>onclick</code> ( أي عند النقر، نفِّذ ...). ستكون قيمة خاصيّة هي دالة ننشئها تسمّى <code>changeText()‎</code> تمثِّل معالج الحدث.
</p>

<ul>
<li>
		الملف events.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7148_10" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-US"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Events</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">onclick</span><span class="pun">=</span><span class="atv">"</span><span class="pln">changeText</span><span class="pun">()</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">Click me</span><span class="tag">&lt;/button&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">Try to change me.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"js/events.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	لننشئ الملف <code>events.js</code> ضمن المسار <code>‎‎js/‎‎</code>. سننشئ الدالة <code>changeText()‎</code> التي ستعدّل محتوى النص المتمثِّل بقيمة الخاصية <code>textContent</code> على عنصر الفقرة <code>p</code>.
</p>

<ul>
<li>
		الملف js/events.js:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_14" style="">
<span class="com">// تعديل نصِّ الفقرة عبر هذه الدالّة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> changeText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">

    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I changed because of an inline event handler."</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عند تحميلك الصفحة <code>events.html</code> لأول مرة ستبدو كما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30014" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-1.png.89c16850e1212f9118ef69acdb09167b.png" rel=""><img alt="events-1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30014" data-unique="1bv4w8yc9" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-1.thumb.png.c48c93f97bb8bd1aacbfd6e944f3eb47.png"></a>
</p>

<p>
	حينما يتمُّ النقر على الزر من قبل المستخدم أو غيره، فإن محتوى نصّ الفقرة سيتغيّير من <code>Try to change me.</code> إلى <code>I changed because of an inline event handler.</code>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30015" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-2.png.b524212803ac003bfe1a6ed2dc8dffaf.png" rel=""><img alt="events-2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30015" data-unique="votufaibj" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-2.thumb.png.7a97a854497919e302d2b2b98ff23c7e.png"></a>
</p>

<p>
	تعدُّ معالجات الأحداث المضمّنة طريقةً مباشرةً لبدء فهم الأحداث، ولكن يجب ألا تستخدم بشكل عام خارج نطاق الاختبار والأغراض التعليميّة.
</p>

<p>
	يمكنك مقارنة معالجات الأحداث المضمَّنة بأنماط CSS المضمَّنة في عنصر HTML. من العمليّ للغاية الحفاظ على ورقة أنماط منفصلة للأصناف بدلًا من إنشاء أنماط مضمّنة في كل عنصر، تمامًا كما هو أكثر جدوى للحفاظ على شيفرات جافاسكربت التي تتم معالجتها بالكامل من خلال ملف منفصل بدلًا من إضافتها إلى كل عنصر.
</p>

<h2 id="-">
	خاصيات معالج الأحداث
</h2>

<p>
	الخطوة التالية، هي الانتقال من معالج الأحداث المضمّنة إلى خاصية معالج الأحداث. يعمل هذا بشكل مشابه جدًّا لمعالج مضمَّن، باستثناء أننا نقوم بتعيين خاصية العنصر في الجافاسكربت بدلًا من خاصية HTML.
</p>

<p>
	سيكون الإعداد هو نفسه هنا، باستثناء أننا لم نعد ندرج <code>onclick="changeText()‎"</code>‎ في شيفرة العنصر:
</p>

<ul>
<li>
		الملف events.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7148_16" style="">
<span class="pln">...
</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;button&gt;</span><span class="pln">Click me</span><span class="tag">&lt;/button&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">I will change.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">
...</span></pre>

<p>
	ستظلُّ وظيفتنا متشابهة أيضًا، إلا أننا نحتاج الآن إلى الوصول إلى العنصر <code>button</code> في جافاسكربت. يمكننا ببساطة الوصول إلى الخاصية <code>onclick</code> مثلما نصل إلى الخاصية <code>style</code> أو <code>id</code> أو أي خاصية عنصر أخرى، ثم نقوم بتعيين مرجع للدالة المراد تنفيذها.
</p>

<ul>
<li>
		الملف js/events.js:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_18" style="">
<span class="com">// الدالة المراد تنفيذها عند وقوع الحدث والتي تعدِّل محتوى الفقرة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> changeText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I changed because of an event handler property."</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// button إضافة معالج حدث كخاصية للعنصر </span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> changeText</span><span class="pun">;</span></pre>

<p>
	<strong>ملاحظة:</strong> لا تتبع معالجات الأحداث عُرْفَ سنام الجمل (camelCase) التي تلتزم بها معظم تعليمات جافاسكربت البرمجية. لاحظ أن الرمز هو <code>onclick</code>، وليس <code>onClick</code>.
</p>

<p>
	عند تحميل الصفحة لأول مرة ، سيعرض المتصفح ما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30016" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-3.png.da5878e67854d14c888c621a6a9ec98d.png" rel=""><img alt="events-3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30016" data-unique="ymdipg3du" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-3.thumb.png.c592a93ff6e3fe18dad5ec4ca72c3bdb.png"></a>
</p>

<p>
	الآن عند النقر فوق الزر، سيكون له تأثير مماثل كما كان من قبل:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30017" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-4.png.2ffb550c5c21a09a33fb0cb2b5a80723.png" rel=""><img alt="events-4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30017" data-unique="i7w5ff6vz" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-4.thumb.png.bd1d2103554a13bf4101846ba34628d3.png"></a>
</p>

<p>
	لاحظ بتمريرنا مرجع الدالة المراد تنفيذها إلى الخاصية <code>onclick</code>، فإننا لا نقوم بتضمين الأقواس، حيث أننا لا نستدعي الدالّة في تلك اللحظة، ولكننا نمرّر مرجعًا إليها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_20" style="">
<span class="pln">button</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> changeText</span><span class="pun">;</span></pre>

<p>
	تعدُّ خاصيَّة معالج الأحداث أكثرَ قابليَّةٍ للصيانة من المعالج المضمَّن، إلَّا أنها تعاني عقباتً مماثلة. فمثلاً، محاولةُ تعييِّن عدّة خصائص <code>onclick</code> منفصلة سيطبق التأثير على آخر محاولة. كما هو موضَّح أدناه.
</p>

<ul>
<li>
		الملف js/events.js:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_22" style="">
<span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> changeText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Will I change?"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> alertText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    alert</span><span class="pun">(</span><span class="str">'Will I alert?'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// يمكن تعديل الأحداث</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> changeText</span><span class="pun">;</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">onclick </span><span class="pun">=</span><span class="pln"> alertText</span><span class="pun">;</span></pre>

<p>
	في المثال أعلاه، لن تعرض النقرة على الـ <code>button</code> سوى تنبيه، ولن تغيّر النصّ <code>p</code>، لأن <code>alert()‎</code> هو آخر تعليمة برمجية أضيفت إلى الخاصية.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30018" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-5.png.e068fbd4b1d6ae45edc995a310bf438f.png" rel=""><img alt="events-5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30018" data-unique="6c9s43ddn" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-5.thumb.png.23fbe422bd3ca516fc79962180ccf556.png"></a>
</p>

<p>
	من خلال فهم كل من معالجات الأحداث المضمّنة وخصائص معالج الأحداث، دعنا ننتقل إلى مستمعي الأحداث.
</p>

<h2 id="-">
	مستمعي الأحداث
</h2>

<p>
	أحدث إضافة إلى معالجات الأحداث في جافاسكربت هي مستمعي الحدث. يراقب <strong>مستمع الحدث</strong> حدثًا على عنصر. بدلاً من إسناد الحدث مباشرةً إلى خاصيّة في العنصر، سنستخدم التابع <code>addEventListener()‎</code> للاستماع للحدث.
</p>

<p>
	يأخذ <code>addEventListener()‎</code> معاملين إلزاميين - الحدث الذي يجب الاستماع إليه، ودالَّة ردِّ نداء لتنفيذها عند اطلاق الحدث.
</p>

<p>
	ملف الـ HTML لمستمع الأحداث الخاص بنا هو نفسه في المثال السابق.
</p>

<ul>
<li>
		الملف events.html:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_7148_24">
...
    &lt;button&gt;Click me&lt;/button&gt;
    &lt;p&gt;I will change.&lt;/p&gt;
...
</pre>

<p>
	سنظلّ نستخدم نفس الدالّة <code>changeText()‎</code> كما سابقًا ولكن سنربطها مع التابع <code>addEventListener()‎</code> على الزر.
</p>

<ul>
<li>
		الملف js/events.js:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_26" style="">
<span class="com">// الدالة المراد تنفيذها عند وقوع الحدث والتي تعدِّل محتوى الفقرة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> changeText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I changed because of an event listener."</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// الاستماع لحدث النقر</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> changeText</span><span class="pun">);</span></pre>

<p>
	لاحظ أنه مع أوّل طريقتين، تمّت الإشارة إلى حدث النقر باسم <code>onclick</code>، ولكن مع مستمعي الأحداث يشار إليه باسم <code>click</code>. تُسْقَطُ <code>on</code> من الكلمة لكل مُسْتَمِع حدث. في القسم التالي، سنأخذ المزيد من الأمثلة على أنواع الأحداث الأخرى.
</p>

<p>
	عند إعادة تحميل الصفحة بشيفرة جافاسكربت أعلاه، ستتلقى الخَرْج التالي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30019" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-6.png.011a64910ae1d4181f47c0575dc47430.png" rel=""><img alt="events-6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30019" data-unique="s7yo2lv6s" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-6.thumb.png.29af7dd57a2b3ecdf2bd2a9f03817544.png"></a>
</p>

<p>
	للوهلة الأولى، يبدو مستمعو الأحداث متشابهين جدًا مع خصائص معالج الأحداث، لكن لديهم بعض المزايا. يمكننا تعيين عدّة مستمعين على نفس العنصر، كما هو موضَّح في المثال أدناه.
</p>

<ul>
<li>
		الملف js/events.js:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_28" style="">
<span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> changeText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Will I change?"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> alertText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    alert</span><span class="pun">(</span><span class="str">'Will I alert?'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// يمكن إضافة عدة مستمعات إلى الحدث نفسه والعنصر نفسه أيضًا</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> changeText</span><span class="pun">);</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> alertText</span><span class="pun">);</span></pre>

<p>
	سيتمُّ إطلاق الحدثين في المثال أعلاه، ممّا يوفِّر للمستخدم كلًّ من التنبيه والنصِّ المعدّل بعد النقر فوق التنبيه. ستستخدام غالباً دالّات مجهولة (Anonymous functions) بدلاً من مرجع دالّة على مُسْتَمع الحدث. الدالّات المجهولة هي دالّات غير مُسَمَّاة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_30" style="">
<span class="com">// دالة مجهولة يراد تنفيذها عند إطلاق الحدث</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    p</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Will I change?"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	من المُمْكِن أيضًا استخدام دالّة <code>removeEventListener()‎</code> لإزالة حدث واحد أو جميع الأحداث من عنصر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_32" style="">
<span class="com">// button من العنصر alert حذف الدالة</span><span class="pln">
button</span><span class="pun">.</span><span class="pln">removeEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> alertText</span><span class="pun">);</span></pre>

<p>
	يمكنك استخدام <code>addEventListener()‎</code>على الكائنين <code>document</code> و <code>window</code>.
</p>

<p>
	يُعَدُّ مُسْتَمِعُو الأحداث حاليًا الطريقةَ الأكثرَ شيوعًا والمفضَّلة للتعامل مع الأحداث في جافاسكربت.
</p>

<h2 id="-">
	الأحداث المشتركة
</h2>

<p>
	تعلمّنا عن معالجات الأحداث المضمّنة، وخصائص معالج الأحداث، ومستمعي الأحداث باستخدام حدث النقرات، ولكن هناك العديد من الأحداث في جافاسكربت. سنتطرق لأكثر الأحداث شيوعًا أدناه.
</p>

<h3 id="-">
	أحداث الفأرة
</h3>

<p>
	أحداث الفأرة هي من بين الأحداث الأكثر استخدامًا. تشير إلى الأحداث التي تنطوي على نقر زر الفأرة أو تحريك المؤشر وتحويمه (hovering). تتوافق هذه الأحداث أيضًا مع الإجراء المماثل على جهاز يعمل باللمس.
</p>

<table>
<thead><tr>
<th>
				<strong>الحدث</strong>
			</th>
			<th>
				<strong>الوصف</strong>
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>click</code>
			</td>
			<td>
				يُطلَق عند الضغط بزر الفأرة أو عند الإفلات على العنصر
			</td>
		</tr>
<tr>
<td>
				<code>dblclick</code>
			</td>
			<td>
				يُطلَق عندما يتم النقر فوق عنصر مرتين
			</td>
		</tr>
<tr>
<td>
				<code>mouseenter</code>
			</td>
			<td>
				يُطلَق عندما يدخل المؤشر داخل عنصر
			</td>
		</tr>
<tr>
<td>
				<code>mouseleave</code>
			</td>
			<td>
				يُطلَق عندما يترك المؤشر عنصرًا
			</td>
		</tr>
<tr>
<td>
				<code>mousemove</code>
			</td>
			<td>
				يُطلَق في كل مرة يتحرك فيها المؤشر داخل عنصر ما``
			</td>
		</tr>
</tbody>
</table>
<p>
	إن حدث النقر <code>click</code> هو حدثٌ مركَّب يتألف من الجمع بين حدثين هما <code>mousedown</code> و <code>mouseup</code>، ويُطلَق حينَ الضغط على زر الفأرة لأسفل أو رفعه، على التوالي. يؤدي استخدام الحدثين <code>mouseenter</code> و <code>mouseleave</code> بالترادف إلى إعادة إنشاء تأثير التحويم الذي يستمر ما دام مؤشر الفأرة على العنصر.
</p>

<h3 id="-form-">
	أحداث النموذج
</h3>

<p>
	أحداث <a href="https://wiki.hsoub.com/HTML/form" rel="external">النموذج</a> <code>form</code> هي إجراءات تتعلق بالنماذج، مثل <a href="https://wiki.hsoub.com/HTML/input" rel="external">عناصر الإدخال</a> <code>input</code> التي يتم تحديدها أو غير المحددة، والنماذج التي يتم إرسالها.
</p>

<table>
<thead><tr>
<th>
				<strong>الحدث</strong>
			</th>
			<th>
				<strong>وصف</strong>
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>submit</code>
			</td>
			<td>
				يُطلَق عند إرسال النموذج
			</td>
		</tr>
<tr>
<td>
				<code>focus</code>
			</td>
			<td>
				يُطلَق عند تلقِي عنصر (مثل المدخلات) التركيز
			</td>
		</tr>
<tr>
<td>
				<code>blur</code>
			</td>
			<td>
				يُطلَق حينَ يفقد العنصر التركيز
			</td>
		</tr>
</tbody>
</table>
<p>
	يتحقق التركيز<em>foucus</em> عند تحديد عنصر، على سبيل المثال، من خلال النقر بالفأرة أو الانتقال إليه عبر المفتاح <code>TAB</code> غالبًا ما تستخدم جافاسكربت لإرسال النماذج وإرسال القيم إلى لغة الواجهة الخلفية. تتمثّلُ ميزة استخدام جافاسكربت لإرسال النماذج بأنه لا يتطلب إعادة تحميل الصفحة لإرسال النموذج، ويمكن استخدام جافاسكربت للتحقق من حقول الإدخال المطلوبة.
</p>

<h2 id="-">
	أحداث لوحة المفاتيح
</h2>

<p>
	تُستخدم أحداث لوحة المفاتيح لمعالجة إجراءات لوحة المفاتيح، مثل الضغط على مفتاح ما، ورفع الضغط عن مفتاح، واستمرار ضغط مفتاح.
</p>

<table>
<thead><tr>
<th>
				<strong>الحدث</strong>
			</th>
			<th>
				<strong>وصف</strong>
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>keydown</code>
			</td>
			<td>
				يُطلَق مرة واحدة عند الضغط على أي مفتاح
			</td>
		</tr>
<tr>
<td>
				<code>keyup</code>
			</td>
			<td>
				يُطلَق مرة واحدة عندما يتم تحرير (إفلات الضغط) المفتاح المضغوط
			</td>
		</tr>
<tr>
<td>
				<code>keypress</code>
			</td>
			<td>
				يُطلَق بشكل مستمر أثناء الضغط على المفتاح
			</td>
		</tr>
</tbody>
</table>
<p>
	قد يبدو الحدثين <code>keydown</code> و <code>keypress</code> متشابهين إلا أنهما لا يتيحان الوصول إلى جميع المفاتيح بالضبط. في حين أنَّ <code>keydown</code> يقرّ بكل ضغطَة (أي الضغط على أي مفتاح)، يستثني الحدث <code>keypress</code> المفاتيح التي لا يولد الضغط عليها حرفًا، مثل المفاتيح <code>SHIFT</code> و <code>DELETE</code> و <code>ALT</code> وغيرها.
</p>

<p>
	أحداث لوحة المفاتيح لها خصائص محددة للوصول إلى المفاتيح الفردية.
</p>

<p>
	إذا مُرِّرَ المعامل الأول (الكائن <code>event</code>) عبر مستمع الحدث، فيمكننا الوصول إلى مزيد من المعلومات حول الإجراء الذي حدث أهمها ثلاثة خصائص تتعلق بكائنات لوحة المفاتيح هي: <code>keycode</code> و <code>key</code> و <code>code</code>.
</p>

<p>
	إذا ضغط المستخدم على المفتاح <code>a</code> على لوحة المفاتيح، فستظهر الخصائص التالية المتعلقة بهذا المفتاح:
</p>

<table>
<thead><tr>
<th>
				<strong>خاصية</strong>
			</th>
			<th>
				<strong>وصف</strong>
			</th>
			<th>
				<strong>مثال</strong>
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>keyCode</code>
			</td>
			<td>
				عدد يتعلق بالمفتاح
			</td>
			<td>
				65
			</td>
		</tr>
<tr>
<td>
				<code>key</code>
			</td>
			<td>
				يمثل اسم الحرف
			</td>
			<td>
				a
			</td>
		</tr>
<tr>
<td>
				<code>code</code>
			</td>
			<td>
				يمثل المفتاح الفعلي الذي يتم الضغط عليه
			</td>
			<td>
				keyA
			</td>
		</tr>
</tbody>
</table>
<p>
	لإظهار كيفية جمع هذه المعلومات عبر وحدة التحكم جافاسكربت، يمكننا كتابة سطور التعليمات البرمجيّة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_34" style="">
<span class="com">// keyCode و key و code التحقق من الخاصيات</span><span class="pln">
document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'keydown'</span><span class="pun">,</span><span class="pln"> event </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'key: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">keyCode</span><span class="pun">);</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'key: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">key</span><span class="pun">);</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'code: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">code</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	بمجرد ضغط <code>ENTER</code> في الطرفية، يمكننا آنذاك الضغط على أي مفتاح من لوحة المفاتيح، في هذا المثال، سنضغط <code>a</code>.
</p>

<pre class="ipsCode" id="ips_uid_7148_36">
Output
keyCode: 65
key: a
`code: KeyA`
</pre>

<p>
	إنَّ الخاصيَّةَ <code>keyCode</code> هي عدد يمثلُّ قيمة المفتاح الذي ضُغِطَ بينما تمثِّل خاصيَّةَ <code>key</code> اسم الحرف، التي يمكن أن تتغيّر - على سبيل المثال، ضغط المفتاح <code>a</code> مع <code>SHIFT</code> سيؤدي <code>A</code>. وتمثِّلُ الخاصيِّةُ <code>code</code> المفتاح الفيزيائي على لوحة المفاتيح.
</p>

<p>
	لاحظ أنَّ <code>keyCode</code> في طريقها إلى الزوال ويفضل استخدام <code>code</code> في مشاريع جديدة.
</p>

<p>
	لمعرفة المزيد، يمكنك عرض <strong><a href="https://developer.mozilla.org/en-US/docs/Web/Events" rel="external nofollow">القائمة الكاملة للأحداث على شبكة مطوري Mozilla</a>.</strong>
</p>

<h2 id="-">
	كائنات الحدث
</h2>

<p>
	يتكون الكائن <code>Event</code> من الخاصيّات والتوابع التي يمكن لجميع الأحداث الوصول إليها. بالإضافة إلى <code>Event</code> الكائن العام، كل نوع من أنواع الأحداث له امتدادات خاصة به، مثل <code>KeyboardEvent</code> و <code>MouseEvent</code>. سيمرَّر الكائن <code>Event</code> من خلال دالّة المستمع كمعامل. وعادة ما يكتب باسم <code>event</code> أو <code>e</code>. يمكننا الوصول إلى الخاصية <code>code</code> التابعة للـحدث <code>keydown</code> لتكرار عناصر تحكم لوحة المفاتيح في لعبة مثلًا.
</p>

<p>
	قم بإنشاء ملف HTML يحوي العنصر <code>&lt;p&gt;</code> وحملّه في المتصفح.
</p>

<ul>
<li>
		الملف event-test-p.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7148_38" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-US"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Events</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">
</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	ثم اكتب شفرة جافاسكربت التالية في طرفية أدوات المطور .
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_40" style="">
<span class="com">// تمرير حدث إلى مستمع</span><span class="pln">
document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'keydown'</span><span class="pun">,</span><span class="pln"> event </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> element </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">

    </span><span class="com">// إسناد قيمة رموز المفاتيح المراد الضغط عليها إلى متغيرات</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="str">'KeyA'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> </span><span class="str">'KeyS'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="str">'KeyD'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> w </span><span class="pun">=</span><span class="pln"> </span><span class="str">'KeyW'</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// تحديد الاتجاه لكل مفتاح</span><span class="pln">
    </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">code</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> a</span><span class="pun">:</span><span class="pln">
            element</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Left'</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> s</span><span class="pun">:</span><span class="pln">
            element</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Down'</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> d</span><span class="pun">:</span><span class="pln">
            element</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Right'</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> w</span><span class="pun">:</span><span class="pln">
            element</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Up'</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	عند الضغط على أحد المفاتيح - <code>a</code>، أو <code>s</code>، أو <code>d</code>، أو <code>w</code> سترى خرجًا مشابهًا لما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30020" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-7.png.9d1ac899b7a1eb21424b7df7656cee97.png" rel=""><img alt="events-7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30020" data-unique="o16p91jah" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-7.thumb.png.982f13c2039d7d0ff00f48973bab05ee.png"></a>
</p>

<p>
	يمكنك الاستمرار في تطوير كيفية استجابة المتصفح للمستخدم حينَ الضغط على هذه المفاتيح، ويمكن إنشاء موقع ويب أكثر ديناميكية.
</p>

<p>
	سنتطرق إلى إحدى خصائص الأحداث الأكثر استخدامًا: الخاصيِّةُ <code>target</code>. في المثال التالي ، لدينا ثلاثة عناصر <code>div</code> ضمن قسم واحد <code>section</code>.
</p>

<ul>
<li>
		الملف event-test-div.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7148_42" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-US"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Events</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">
</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;section&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"one"</span><span class="tag">&gt;</span><span class="pln">One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"two"</span><span class="tag">&gt;</span><span class="pln">Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"three"</span><span class="tag">&gt;</span><span class="pln">Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/section&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	باستخدام <code>event.target</code> في جافاسكربت ضمن طرفيّة أدوات المطور (Developer Console)، يمكننا وضع مستمع حدث واحد على العنصر <code>section</code> الخارجي والحصول على العنصر الأكثر تداخلًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7148_44" style="">
<span class="kwd">const</span><span class="pln"> section </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'section'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// طباعة الهدف المحدَّد</span><span class="pln">
section</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> event </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	يؤدي النقر فوق أي عنصر من هذه العناصر إلى إعادة إخراج العنصر المحدد ذي الصلة إلى الطرفية باسـتخدام <code>event.target</code>. إتاحة وضع مُسْتَمع حَدَث واحد فقط، يُمَكِّنُ من الوصول إلى العديد من العناصر المتداخلة، وهذا في غاية الأهمية.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30021" href="https://academy.hsoub.com/uploads/monthly_2019_06/events-8.png.b5905b9dfea3a538c4003db3d8789e02.png" rel=""><img alt="events-8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30021" data-unique="h9shpcfxd" src="https://academy.hsoub.com/uploads/monthly_2019_06/events-8.thumb.png.27afc5f8b0ff345031cac5f2fd7ba3db.png"></a>
</p>

<p>
	باستخدام الكائن <code>Event</code>، يمكننا إعداد استجابات متعلقة بجميع الأحداث، بما في ذلك الأحداث العامة والإضافات الأكثر تحديدًا.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	الأحداث هي الإجراءات التي تحدث على موقع ويب، مثل النقر فوق الفأرة أو تحويم المؤشر أو إرسال نموذج أو تحميل صفحة أو الضغط على مفتاح في لوحة المفاتيح. تصبح جافاسكربت تفاعليًا وديناميكيًا حقًا عندما نتمكن من جعل مواقع الويب تستجيب للإجراءات التي اتخذها المستخدم.
</p>

<p>
	تعلمنا -في هذا الدليل ما هي الأحداث، وأمثلة عن الأحداث الشائعة، والفرق بين معالجات الأحداث ومستمعي الأحداث، وكيفية الوصول إلى الكائن <code>Event</code>. ستتمكن من إنشاء مواقع وتطبيقات ديناميكية، باستخدام هذه المعلومات. ترجمة - وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/understanding-events-in-javascript" rel="external nofollow">Understanding Events in JavaScript</a> لصاحبته Tania Rascia
</p>
]]></description><guid isPermaLink="false">690</guid><pubDate>Sun, 23 Jun 2019 08:06:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x62F;&#x64A;&#x644; &#x627;&#x644;&#x62E;&#x627;&#x635;&#x64A;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; &#x648;&#x627;&#x644;&#x623;&#x646;&#x645;&#x627;&#x637; &#x641;&#x64A; &#x634;&#x62C;&#x631;&#x629; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%81%D9%8A-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r689/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_06/dom(1).png.b1696169ffb94927981d6d0564adb11c.png" /></p>

<p>
	تعلمنا فيما سبق في هذه السلسلة "<a href="https://academy.hsoub.com/tags/dom/" rel="">كيف تجري تغيرات على شجرة DOM</a>" والتعامل مع شجرة DOM من إنشاء، وإدراج، واستبدال وإزالة عناصر من المستند بتوابع مضمنة. أصبحت الآن مؤهلًا لاستخدام قدرات JavaScript التفاعلية وتعديل عناصر الويب لبزيادة كفاءتك في التعامل مع شجرة DOM.
</p>
<style type="text/css">
table {
    width: 100%;
}
td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<p>
	سنكمل في هذا المقال موضوع إجراء التعديل على شجرة DOM بتعديل الأنماط والأصناف والخاصيات الأخرى لعقد عناصر HTML. وهذا سيعطيك فهمًا أكبر للتعامل مع العناصر الأساسية لشجرة DOM.
</p>

<h2 id="-">
	استعراض تحديد العناصر
</h2>

<p>
	استخدمت مكتبة شائعة ضمن الجافاسكربت تسمى <a href="https://academy.hsoub.com/programming/javascript/jquery/" rel="">jQuery</a> لتحديد وتعديل عناصر شجرة DOM. سهَّلت هذه المكتبة من اختيار عنصر أو أكثر ضمن المستند وتعديلها وتغييرها في آن معًا. راجعنا في مقال "<a href="https://www.google.com/url?q=https://academy.hsoub.com/programming/javascript/%25D8%25B7%25D8%25B1%25D9%258A%25D9%2582%25D8%25A9-%25D8%25A7%25D9%2584%25D9%2588%25D8%25B5%25D9%2588%25D9%2584-%25D9%2584%25D9%2584%25D8%25B9%25D9%2586%25D8%25A7%25D8%25B5%25D8%25B1-%25D9%2581%25D9%258A-dom-r647/&amp;sa=D&amp;ust=1558782759380000&amp;usg=AFQjCNEJXLn0loD3plOt2ukM13mg-u8wdQ" rel="external nofollow">الوصول إلى العناصر في شجرة DOM</a>" التوابع الخاصة بـ DOM التي تحدد العقد وتعدل عليها عبر جافاسكربت الصرفة فقط.
</p>

<p>
	لنتذكر أن التابعين <code>document.querySelector()‎</code> و <code>document.getElementById()‎</code> يستخدمان للوصول إلى عنصر واحد. نستطيع الوصول العنصر باستخدام العنصر <code>div</code> أو عبر الخاصية <code>id</code>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9237_6" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo-id"</span><span class="tag">&gt;</span><span class="pln">Demo ID</span><span class="tag">&lt;/div&gt;</span><span class="pln">
 </span></pre>

<p>
	بالإمكان اختيار أي عنصر في الصفحة بأي نوع من المحدِّدات باستخدام التابع <code>querySelector()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_8" style="">
<span class="com">// كلا التابعين سيعيد عنصرًا واحدًا</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoId </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'#demo-id'</span><span class="pun">);</span></pre>

<p>
	بإمكاننا تحديث جزء من العنصر كالنص داخله بسهولة، حينما نصل إلى العنصر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_10" style="">
<span class="com">// تغيير النصّ لعنصر واحد</span><span class="pln">
demoId</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Demo ID text updated.'</span><span class="pun">;</span></pre>

<p>
	حينما نصل إلى عدة عناصر باستخدام محدد مشترك، مثل صنف محدد، يمكننا إجراء تعديل على جميع العناصر داخل حلقة تكرارية. لدينا عنصرين من <code>div</code> ذوي صنف مشترك.
</p>

<pre class="ipsCode" id="ips_uid_9237_12">
&lt;div class="demo-class"&gt;Demo Class 1&lt;/div&gt;
&lt;div class="demo-class"&gt;Demo Class 2&lt;/div&gt;
</pre>

<p>
	للإمساك بجميع العناصر ذات الصنف <code>demo-class</code> مثلًا، سنستخدم <code>querySelectorAll()‎</code>، وسنستخدم <code>forEach()‎</code> للوصول إلى العنصر وتطبيق التغيير. كما بالإمكان الوصول إلى عنصر محدد بـ <code>querySelectorAll()‎</code> بنفس الطريقة التي تستخدمها مع مصفوفة، باستخدام الأقواس المربعة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_16" style="">
<span class="com">// demo الحصول على قائمة بجميع العناصر ذات الصنف </span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoClasses </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'.demo-class'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// تغيير النصّ لعدّة عناصر باستخدام حلقة تكراريّة</span><span class="pln">
demoClasses</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">element </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  element</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'All demo classes updated.'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// الوصول للعنصر الأول ضمن القائمة</span><span class="pln">
demoClasses</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span></pre>

<p>
	هذا هو أحد أهم الاختلافات التي يجب معرفتها عند الانتقال من jQuery إلى JavaScript الصرفة. لن تشرح العديد من الأمثلة على تعديل العناصرعملية تطبيق هذه التوابع والخصائص على عناصر متعددة.
</p>

<p>
	غالبًا ما يتم إرفاق الخاصيات والتوابع الواردة في هذه المقالة بـ «مسمتعي الأحداث» (event listener) من أجل الاستجابة للنقرات، التحويم (hover)، ومشغلات (triggers) أخرى.
</p>

<p>
	ملاحظة: سيعيد التابعان <code>getElementsByClassName()‎</code> و <code>getElementsByTagName()‎</code> مجموعة عناصر HTML لا يمكنها استعمال <code>forEach()‎</code> على عكس العناصر التي يعيدها التابع<code>querySelectorAll()‎</code>. في هذه الحالات، ستحتاج إلى استخدام حلقة for الاعتيادية للتكرار عبر مجموعة العناصر تلك.
</p>

<h2 id="-">
	تعديل الخاصيات
</h2>

<p>
	تحتوي الخاصيات (التي هي قيم) على معلومات إضافية عن عناصر HTML. تأتي عادةً في ثنائيات الاسم/القيمة، وقد تكون أساسية اعتمادًا على العنصر.
</p>

<p>
	إن الخاصية src التابعة للعنصر<code>img</code>، والخاصية <code>href</code> التابعة للعنصر <code>a</code>، وكذلك الخاصيات <code>class</code> و <code>id</code>، و <code>style</code> هي أحد أكثر الخاصيات شيوعًا. للحصول على قائمة كاملة بخاصيات HTML، قم بعرض قائمة <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes" rel="external nofollow">الخاصيات</a> على شبكة مطوري Mozilla. ستُسبَق العناصر المخصصة التي ليست جزءًا من معيار HTML بـالبادئة <code>data-</code>.
</p>

<p>
	لدينا أربع توابع لتعديل خاصيات العنصر في جافاسكربت:
</p>

<table>
<thead><tr>
<th>
				<strong>التابع</strong>
			</th>
			<th>
				<strong>الوصف</strong>
			</th>
			<th>
				<strong>مثال</strong>
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>hasAttribute()‎</code>
			</td>
			<td>
				يعيد القيمة <code>true</code> أو <code>false</code> إن كان العنصر يملك خاصية محدَّدة أم لا.
			</td>
			<td>
				<code>element.hasAttribute('href');‎</code>
			</td>
		</tr>
<tr>
<td>
				<code>getAttribute()‎</code>
			</td>
			<td>
				يعيد قيمة الخاصية المحددة أو null.
			</td>
			<td>
				<code>element.getAttribute('href');‎</code>
			</td>
		</tr>
<tr>
<td>
				<code>setAttribute()‎</code>
			</td>
			<td>
				يضيف أو يحدّث قيمة لخاصية محددة.
			</td>
			<td>
				<code>element.setAttribute('href', 'index.html');‎</code>
			</td>
		</tr>
<tr>
<td>
				<code>removeAttribute()‎</code>
			</td>
			<td>
				يزيل خاصية محدَّدة من عنصر.
			</td>
			<td>
				<code>element.removeAttribute('href');‎</code>
			</td>
		</tr>
</tbody>
</table>
<p>
	لننشئ ملف HTML جديد يحوي العنصر <code>img</code> مع خاصية واحدة. سنربط العنصر بصورة عامة عبر رابط، إلا أنه من الممكن ربط الوسم بصورة محلية في حال عدم توفر اتصال بالإنترنت.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9237_20" style="">
<span class="pln">attributes.html
</span><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	افتح الملف السابق على متصفح متطور، وافتح الطرفية في وحدة تحكم المطور (Developer Console)، وستشاهد ما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30011" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-shark.png.8e900d6d940cab08daf23d5b317bf72e.png" rel=""><img alt="attributes-shark.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30011" data-unique="qakhacys8" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-shark.thumb.png.35d79d0a35ca49f9b63e74bf6e7122cd.png"></a>
</p>

<p>
	سنختبر طرق الخاصية (دالات) عبر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_24" style="">
<span class="com">// إسناد عنصر صورة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> img </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'img'</span><span class="pun">);</span><span class="pln">

img</span><span class="pun">.</span><span class="pln">hasAttribute</span><span class="pun">(</span><span class="str">'src'</span><span class="pun">);</span><span class="pln">                </span><span class="com">// يعيد القيمة المنطقية صح</span><span class="pln">
img</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">'src'</span><span class="pun">);</span><span class="pln">                </span><span class="com">// "...shark.png" يعيد </span><span class="pln">
img</span><span class="pun">.</span><span class="pln">removeAttribute</span><span class="pun">(</span><span class="str">'src'</span><span class="pun">);</span><span class="pln">             </span><span class="com">// وقيمتها src يحذف الخاصية </span></pre>

<p>
	أزلت الخاصية <code>src</code> والقيمة المرتبطة بها الموجودة العنصر <code>img</code> بعد المثال السابق، ولكن بإمكانك إعادة تعيين تلك الخاصية وإسناد القيمة لصورة بديلة باستخدام <code>img.setAttribute()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_26" style="">
<span class="pln">img</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">'src'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'https://js-tutorials.nyc3.digitaloceanspaces.com/octopus.png'</span><span class="pun">);</span><span class="pln"> </span></pre>

<p>
	يمكننا تعديل الخاصية مباشرةً بإسناد قيمة جديدة إليها كخاصية للعنصر، وإعادة تعيين <code>src</code> للصورة shark.png بالشكل التالي:
</p>

<pre class="ipsCode" id="ips_uid_9237_28">
img.src = 'https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png';</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30010" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-octopus.png.5b68130e14fe40837a475caf6dfaf777.png" rel=""><img alt="attributes-octopus.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30010" data-unique="twtnmteb3" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-octopus.thumb.png.b7e3957faf1beb8b82d0b0aebfe5fa9d.png"></a>
</p>

<p>
	يمكن تحرير أي خاصيّة بهذا التابع وكذلك مع التوابع المذكورة أعلاه.
</p>

<p>
	إن التابعين<code>hasAttribute()‎</code> و <code>getAttribute()‎</code> عادةً ما يُستخدمان مع عبارات شرطية، بينما تُستخدَم <code>setAttribute()‎</code> و <code>removeAttribute()‎</code> مباشرةً لتعديل شجرة DOM.
</p>

<h2 id="-">
	تعديل الأصناف
</h2>

<p>
	تتوافق الخاصية "class" مع محددات الصنف في CSS. لا يجب الخلط مع أصناف ES6، وهو نوع خاص من دالات جافاسكربت.
</p>

<p>
	تُسْتخدمُ أصناف CSS لتطبيق الأنماط على عناصر متعددة، على عكس المعرفات التي لا يمكن أن توجد إلا مرة واحدة في كل صفحة. في جافاسكربت، لدينا الخاصيتين <code>className</code> و <code>classList</code> للعمل مع الخاصية <code>class</code>.
</p>

<table>
<thead><tr>
<th>
				التابع / الخاصية
			</th>
			<th>
				الوصف
			</th>
			<th>
				مثال
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>className</code>
			</td>
			<td>
				قراءة أو كتابة قيمة الخاصية <code>class</code>.
			</td>
			<td>
				<code>element.className;</code>
			</td>
		</tr>
<tr>
<td>
				<code>classList.add()</code>‎
			</td>
			<td>
				إضافة قيمة صنف أو أكثر.
			</td>
			<td>
				<code>element.classList.add('active');</code>
			</td>
		</tr>
<tr>
<td>
				<code>classList.toggle()</code>‎
			</td>
			<td>
				تبديل صنف محدَّد أي إضافة إن لم يكن موجودًا أو إزالته إن كان موجودًا.
			</td>
			<td>
				<code>element.classList.toggle('active');</code>
			</td>
		</tr>
<tr>
<td>
				<code>classList.contains()</code>‎
			</td>
			<td>
				تحقق إذا كانت قيمة الصنف موجود.
			</td>
			<td>
				<code>element.classList.contains('active');</code>
			</td>
		</tr>
<tr>
<td>
				<code>classList.replace()</code>‎
			</td>
			<td>
				استبدال قيمة صنف موجود بقيمة صنف جديد.
			</td>
			<td>
				<code>element.classList.replace('old', 'new');</code>
			</td>
		</tr>
<tr>
<td>
				<code>classList</code>
			</td>
			<td>
				إزالة قيمة صنف.
			</td>
			<td>
				<code>element.classList.remove('active');</code>
			</td>
		</tr>
</tbody>
</table>
<p>
	سنقوم بإنشاء ملف HTML آخر يحوي عنصرين بعدة أصناف للعمل مع توابع الصنف.
</p>

<ul>
<li>
		الملف classes.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9237_30" style="">
<span class="pln"> </span><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;style&gt;</span><span class="pln">
    body </span><span class="pun">{</span><span class="pln">
        max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">;</span><span class="pln">
        margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
        font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
        border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid blue</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">.</span><span class="pln">warning </span><span class="pun">{</span><span class="pln">
        border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">.</span><span class="pln">hidden </span><span class="pun">{</span><span class="pln">
        display</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
 
    div </span><span class="pun">{</span><span class="pln">
        border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> dashed lightgray</span><span class="pun">;</span><span class="pln">
        padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">15px</span><span class="pun">;</span><span class="pln">
        margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;div&gt;</span><span class="pln">Div 1</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"active"</span><span class="tag">&gt;</span><span class="pln">Div 2</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	عند فتح الملف classes.html في متصفح الويب، يجب أن تتلقى عرضًا مماثلاً لما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30007" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-1.png.e94919bae03f9cb79f5e984372952a57.png" rel=""><img alt="attributes-classes-1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30007" data-unique="d1q50qshu" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-1.thumb.png.c9de9c6d7a5a4a4c581a37cb7509e5e3.png"></a>
</p>

<p>
	عُرِّفت الخاصيِّة <code>className</code> بهذا الاسم لمنع التعارض مع الكلمة المحجوزة <code>class</code> الموجودة في جافاسكربت وغيرها من اللغات التي لديها إمكانية الوصول إلى شجرة DOM. بإمكانك استخدام <code>className</code> لإسناد قيمة مباشرة إلى الصنف.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_34" style="">
<span class="com">// div اختيار أول عنصر</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> div </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'div'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// الأول div للعنصر warning إسناد الصنف </span><span class="pln">
div</span><span class="pun">.</span><span class="pln">className </span><span class="pun">=</span><span class="pln"> </span><span class="str">'warning'</span><span class="pun">;</span></pre>

<p>
	أسندنا الصنف <code>warning</code> (تحذير) المعرف في قيم CSS للملف classes.html للعنصر <code>div</code> الأول. ستتلقى المُخْرَجَ التالي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30008" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-2.png.0812d5566bd8ead603df9cd5625943ff.png" rel=""><img alt="attributes-classes-2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30008" data-unique="p1griow4v" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-2.thumb.png.9e21ee47ec018d1a25aded2defb5548a.png"></a>
</p>

<p>
	لاحظ أنه في حال وجود أصناف مسبقًا على العنصر، فإن هذا سيؤدي إلى تجاوزها. يمكنك إضافة عدة أصناف بفصلها بمسافة فارغة باستخدام الخاصية <code>className</code>، أو استخدامها دون معاملات الإسناد للحصول على قيمة الصنف في العنصر.
</p>

<p>
	الطريقة الأخرى لتعديل الأصناف هي عن طريق الخاصية <code>classList</code>، والتي تأتي مع بعض الدالات التوابع المفيدة. هذه التوابع مشابهة للتوابع <code>addClass</code>، و <code>removeClass</code>، و <code>toggleClass</code> الموجودة في jQuery.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_36" style="">
<span class="com">// الثاني عن طريق اسم الصنف div اختيار العنصر</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> activeDiv </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'.active'</span><span class="pun">);</span><span class="pln">

activeDiv</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'hidden'</span><span class="pun">);</span><span class="pln">                </span><span class="com">// hidden إضافة الصنف</span><span class="pln">
activeDiv</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="str">'hidden'</span><span class="pun">);</span><span class="pln">             </span><span class="com">// hidden إزالة الصنف</span><span class="pln">
activeDiv</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">toggle</span><span class="pun">(</span><span class="str">'hidden'</span><span class="pun">);</span><span class="pln">             </span><span class="com">// hidden إضافة أو إزالة الصنف</span><span class="pln">
activeDiv</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">'active'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'warning'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// active مكان الصنف warning تبديل الصنف</span></pre>

<p>
	بعد تنفيذ التوابع أعلاه، ستبدو صحفة الويب الخاصة بك كما يلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30009" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-3.png.64ab0ebce493322dedb482c1b8f969b4.png" rel=""><img alt="attributes-classes-3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30009" data-unique="kkk9f7hbf" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-classes-3.thumb.png.d9b89a194e55d8c9b8bc5089597454c6.png"></a>
</p>

<p>
	إن استخدام التابع <code>classList.add()‎</code> سيضيف صنفًا جديدًا إلى قائمة الأصناف الموجودة، على عكس استخدام <code>className</code>. يمكنك أن تضيف عدة أصناف مفصولة بالفاصلة. من الممكن أيضًا استخدام <code>setAttribute</code> لتعديل صنف العنصر.
</p>

<h2 id="-">
	تعديل الأنماط
</h2>

<p>
	تعتبر الخاصية <code>style</code> من الأنماط المضمنة على عنصر HTML. سيتم تطبيق الأنماط على العناصر عبر ورقة أنماط غالبًا، كما فعلنا سابقًا في هذه المقالة، ولكن في بعض الأحيان يتعين علينا إضافة أو تعديل نمط مضمَّن مباشرة.
</p>

<p>
	سنقدِّمُ مثالًا قصيرًا لشرح كيفية تعديل الأنماط باستخدام جافاسكربت. يوجد ملف HTML جديد أدناه بعنصر <code>div</code> يحتوي على بعض الأنماط المضمَّنة فيه مباشرةً.
</p>

<ul>
<li>
		الملف styles.html:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9237_38" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
                width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
                border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid black</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">Div</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">
 
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	عند فتح الملف styles.html في المتصفح، سيبدو على الشكل التالي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30012" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-style-1.png.a68e9a8c8bdbe70372d40e30f0d726b8.png" rel=""><img alt="attributes-style-1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30012" data-unique="446j0cnxs" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-style-1.thumb.png.62579939e8ebddad9f2682553d440f0a.png"></a>
</p>

<p>
	إحدى طرق تعديل الأنماط هي باستعمال التابع <code>setAttribute()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_40" style="">
<span class="com">// div إمساك العنصر</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> div </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'div'</span><span class="pun">);</span><span class="pln">
 
</span><span class="com">// div تطبيق النمط على العنصر </span><span class="pln">
div</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">'style'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'text-align: center'</span><span class="pun">);</span></pre>

<p>
	ومع ذلك، سيؤدي إلى إزالة جميع الأنماط الضمنية من العنصر (أي حذف العنصر style السابق بما يحويه وإضافة العنصر الجديد مع القيمة المعطاة). وبما أن هذا ليس هو التأثير المطلوب، فمن الأفضل استخدام الخاصية <code>style</code> مباشرةً بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_42" style="">
<span class="pln">div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">height </span><span class="pun">=</span><span class="pln"> </span><span class="str">'100px'</span><span class="pun">;</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">width </span><span class="pun">=</span><span class="pln"> </span><span class="str">'100px'</span><span class="pun">;</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'2px solid black'</span><span class="pun">;</span></pre>

<p>
	تُكْتَبُ خاصيات الـ CSS في حالة أسياخ الشواء (kebab-case)، وهي كلمات بأحرف صغيرة مفصولة بشرطة. لاحظ أنه من المهم معرفة أن حالة أسياخ الشواء لخاصيات الـ CSS لا يمكن استخدامها مع الخاصية <code>style</code> جافاسكربت. بدلاً من ذلك، ستستبدل بمكافئها من حالة سنام الجمل (الحرف الأول صغير وباقي الكلمات متصلة بأحرف كبيرة). بعبارة أخرى، سنستخدم <code>textAlign</code> بدلًا من <code>text-glign</code> في الخاصية <code>style</code> للجافاسكربت.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9237_44" style="">
<span class="com">// إلى دائرة وتوسيط النصِّ عاموديًا div تحويل العنصر</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">borderRadius </span><span class="pun">=</span><span class="pln"> </span><span class="str">'50%'</span><span class="pun">;</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">display </span><span class="pun">=</span><span class="pln"> </span><span class="str">'flex'</span><span class="pun">;</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">justifyContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'center'</span><span class="pun">;</span><span class="pln">
div</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">alignItems </span><span class="pun">=</span><span class="pln"> </span><span class="str">'center'</span><span class="pun">;</span></pre>

<p>
	بعد الانتهاء من تعديلات النمط أعلاه، سيظهر الملف styles.html دائرة على الشكل التالي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30013" href="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-style-2.png.4e02102bd0c3dd1a7d6573c6d37e3ff5.png" rel=""><img alt="attributes-style-2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30013" data-unique="45gzgr90l" src="https://academy.hsoub.com/uploads/monthly_2019_06/attributes-style-2.thumb.png.eadfacf00760bde7e1e0502654aa6ddf.png"></a>
</p>

<p>
	إذا تم تطبيق العديد من التغييرات المتعلقة بالنمط على عنصر ما، فإن أفضل مسار للعمل هو تطبيق الأنماط على صنف جديد. ومع ذلك، هناك بعض الحالات التي يكون فيها تعديل خاصية النمط المضمن ضروريًا أو أكثر وضوحًا.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تحتوي عناصر HTML غالبًا على معلومات إضافية مسندة إليها عبر الخاصيات. قد تتكون الخاصيات من ثنائية الاسم/القيمة، وعدد قليل من الخاصيات الأكثر شيوعًا هي <code>class</code> و <code>style</code>.
</p>

<p>
	تعلمنا في هذا الدليل كيفية الوصول إلى خاصيات عنصر HTML ضمن شجرة DOM وتعديلها وحذفها باستخدام جافاسكربت. كما تعلمنا إضافة أصناف CSS وإزالتها وتبديلها واستبدالها في عنصر، وكيفية تحرير أنماط CSS.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-modify-attributes-classes-and-styles-in-the-dom" rel="external nofollow">Understanding the DOM — Document Object Model</a> لصاحبته Lisa Tagliaferri
</p>
]]></description><guid isPermaLink="false">689</guid><pubDate>Mon, 10 Jun 2019 14:34:51 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x648;&#x64A;&#x644; &#x628;&#x64A;&#x646; &#x627;&#x644;&#x623;&#x646;&#x648;&#x627;&#x639;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-r673/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/9.jpg.088230894794d3e28c6a5cb8e7f3464b.jpg" /></p>

<p>
	تُحوِّل الدوال والمعاملات، في أغلب الأحيان، القيم التي تصلها إلى النوع الذي يناسبها وهذا ما يسمى «تحويل النوع». تُحوِّل الدالة <code>alert</code> مثلًا أي قيمة إلى سلسلة نصية تلقائيًا لإظهارها، وتُحوِّل والعمليات الرياضية القيم التي تستعملها إلى أعداد. كما توجد العديد من الحالات التي نكون فيها بحاجة لتحويل قيمة بصريح العبارة إلى النوع المطلوب.
</p>

<p>
	لاحظ أنَّ هذا الفصل لا يتحدث عن الكائنات. سندرس الأنواع الأساسية أولًا، وبعدها ننتقل إلى الكائنات، ثم سنتعلم طريقة تحويل الكائن في فصل التحويل من كائن إلى أساسي.
</p>

<p>
	 
</p>

<h2 id="-">
	التحويل إلى سلسلة نصية
</h2>

<p>
	يحدث التحويل إلى سلسلة نصية عندما نحتاج إلى الشكل النصي لقيمة ما. مثلًا، تُحوِّل الدالة <code>alert(value)‎</code> القيمة <code>value</code> المُمرَّرة إليها إلى سلسلة نصية لإظهارها. ويمكن أيضًا استدعاء الدالة <code>String(value)‎</code> لتحويل أي قيمة <code>value</code> إلى سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_7" style="">
<span class="pln">let value</span><span class="pun">=</span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="kwd">typeof</span><span class="pln"> value</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Boolean</span><span class="pln">

value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">String</span><span class="pun">(</span><span class="pln">value</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "true" أصبحت الآن سلسلة نصية قيمتها</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">tyoeof value</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string</span></pre>

<p>
	يكون ناتج التحويل إلى سلسلة نصية عادةً واضحًا، فالقيمة المنطقية <code>false</code> تصبح <code>"false"</code>، والقيمة الخالية <code>null</code> تصبح <code>"null"</code> وهكذا.
</p>

<h2 id="-">
	التحويل إلى عدد
</h2>

<p>
	يحدث التحويل العددي في الدوال والتعابير الرياضية تلقائيًا. كما في حالة تطبيق عملية القسمة <code>/</code> على قيمتين غير عدديتين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_9" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"6"</span><span class="pun">/</span><span class="str">"2"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج: 3، إذ تحول السلاسل النصية إلى أعداد</span></pre>

<p>
	بإمكاننا استخدام الدالة ‎Number(value)<code>‎</code> لتحويل القيمة <code>value</code> المُمرَّرة إليها بشكل صريح إلى عدد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_11" style="">
<span class="pln">let str </span><span class="pun">=</span><span class="pln"> </span><span class="str">"123"</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="kwd">typeof</span><span class="pln"> str</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string</span><span class="pln">

let num </span><span class="pun">=</span><span class="pln">  </span><span class="typ">Number</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 123 يتحول إلى العدد</span><span class="pln">

alert</span><span class="pun">(</span><span class="kwd">typeof</span><span class="pln"> num</span><span class="pun">);</span><span class="pln"> </span><span class="com">// number</span></pre>

<p>
	يكون التحويل الصريح ضروريًّا عندما نقرأ القيمة من مصدر نصي مثل العنصر text في النموذج <a href="https://wiki.hsoub.com/HTML/form" rel="external">&lt;form&gt;</a> ويكون المطلوب إدخال عدد.
</p>

<p>
	ويكون ناتج التحويل <code>NaN</code> (اختصارًا للعبارة Not a Number)، إذا كان من غير الممكن تشكيل عدد من السلسلة النصية. إليك مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_13" style="">
<span class="pln">let age </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Number</span><span class="pun">(</span><span class="str">"an arbitrary string instead of a number"</span><span class="pun">);</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">age</span><span class="pun">);</span><span class="pln"> </span><span class="com">// NaN, فشلت عملية التحويل</span></pre>
<style type="text/css">
table {
    width: 100%;
}
td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
}
tr:nth-child(even) {
    background-color: #dddddd;
}

.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}
code {
    background-color: rgb(250, 250, 250);
    border-radius: 3px;
}</style>
<p>
	قواعد التحويل العددي:
</p>

<table><tbody>
<tr>
<td>
				<strong>القيمة</strong>
			</td>
			<td>
				<strong>ناتج التحويل</strong>
			</td>
		</tr>
<tr>
<td>
				Undefined
			</td>
			<td>
				NaN
			</td>
		</tr>
<tr>
<td>
				null
			</td>
			<td>
				0
			</td>
		</tr>
<tr>
<td>
				false و true
			</td>
			<td>
				0 و 1
			</td>
		</tr>
<tr>
<td>
				string (سلسلة نصية)
			</td>
			<td>
				يتم إزالة المسافات الفارغة من البداية والنهاية. إذا كانت السلسلة النصية المتبقية فارغة، تكون النتيجة 0، أو تتم قراءة العدد من السلسلة النصية. والخطأ يعطي النتيجة NaN.
			</td>
		</tr>
</tbody></table>
<p>
	أمثلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_15" style="">
<span class="pln">alert </span><span class="pun">(</span><span class="typ">Number</span><span class="pun">(</span><span class="str">"    123    "</span><span class="pun">));</span><span class="pln"> </span><span class="com">// 123</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Number</span><span class="pun">(</span><span class="str">"123z"</span><span class="pun">));</span><span class="pln"> </span><span class="com">// NaN (error reading a number at "z")</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Number</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Number</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">));</span><span class="pln"> </span><span class="com">//0</span></pre>

<p>
	لاحظ أنَّ القيمتين <code>null</code> و <code>undefined</code> لهما خرج مختلف هنا: قيمة <code>null</code> تصبح 0، بينما <code>undefined</code> تصبح <code>NaN</code>.
</p>

<h3 id="-">
	جمع السلاسل النصية عبر المعامل <code>+</code>
</h3>

<p>
	تُحوَّل أغلب العمليات الرياضية القيم إلى أعداد. ولكن هناك استثناء وحيد يحدث عن الجمع عبر المعامل "+" وكون إحدى القيم المطلوب جمعها سلسلة نصية. يجري آنذاك تحويل القيمة الأخرى إلى سلسلة نصية أيضًا ثمَّ تُضاف إلى القيمة الآخرى وتُجمعان معًا في سلسلة نصية واحدة. إليك المثال التالي الذي يوضح ما سبق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_17" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="lit">1</span><span class="pun">+</span><span class="str">'2'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// '12' (سلسلة نصية على اليمين)</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'1'</span><span class="pun">+</span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// '12' (سلسلة نصية على اليسار)</span></pre>

<p>
	يحدث هذا فقط عندما يكون أحد المعاملات على الأقل سلسلة نصية. أمَّا في الحالات الأخرى، تُحوَّل القيم إلى أعداد.
</p>

<h2 id="-">
	التحويل إلى قيمة منطقية
</h2>

<p>
	التحويل المنطقي وهو الأسهل من بين جميع عمليات التحويل. يحدث في العمليات المنطقية (لاحقًا سنتعرف على التحقق من الشروط وغيرها من العمليات المماثلة)، ولكن من الممكن تطبيقه أيضًا بشكل صريح عن طريق استدعاء Boolean(value)‎.
</p>

<p>
	قاعدة التحويل:
</p>

<ul>
<li>
		القيم التي تكون فارغة، مثل 0، والسلسلة النصية الفارغة، والقيمة <code>undefined</code>، والقيمة <code>NaN</code> تُحوَّل جميعها إلى <code>false</code>.
	</li>
	<li>
		أما ما تبقى، فيُحوَّل إلى القيمة <code>true</code>.
	</li>
</ul>
<p>
	مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_19" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">(</span><span class="lit">1</span><span class="pun">));</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">(</span><span class="lit">0</span><span class="pun">));</span><span class="pln"> </span><span class="com">// false</span><span class="pln">

alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">(</span><span class="str">"hello"</span><span class="pun">));</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pln"> </span><span class="pun">(</span><span class="str">""</span><span class="pun">));</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	لاحظ أنَّ السلسلة العددية التي تحتوي على 0 تصبح <code>true</code>. ولكن هناك بعض اللغات البرمجية (مثل PHP) تحول "0" إلى القيمة <code>false</code>. ولكن في لغة JavaScript، تُحوَّل السلسلة النصية الغير فارغة دائمًا إلى القيمة <code>true</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_21" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">(</span><span class="str">"0"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
alert</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true تحول المسافات (وأي سلسلة نصية غير فارغة) إلى</span></pre>

<h2 id="-">
	الخلاصة
</h2>

<p>
	التحويلات الثلاث الأكثر انتشارًا للأنواع هي التحويل إلى سلسلة نصية، أو عدد، أو قيمة منطقية.
</p>

<ul>
<li>
		التحويل إلى سلسلة نصية: يحدث عندما نريد إظهار خرج معين ويمكن تنفيذه عن طريق String(value)<code>‎</code>. ويكون خرج التحويل إلى سلسلة نصية واضحًا بالنسبة للأنواع الأساسية.
	</li>
	<li>
		التحويل إلى عدد: يحدث في العمليات الرياضية ومن الممكن تنفيذه باستخدام <code>Number(value)‎</code>. ويتبع هذا التحويل القواعد التالية:
		<table><tbody>
<tr>
<td>
						<strong>القيمة</strong>
					</td>
					<td>
						<strong>ناتج التحويل</strong>
					</td>
				</tr>
<tr>
<td>
						Undefined
					</td>
					<td>
						NaN
					</td>
				</tr>
<tr>
<td>
						null
					</td>
					<td>
						0
					</td>
				</tr>
<tr>
<td>
						false و true
					</td>
					<td>
						0 و 1
					</td>
				</tr>
<tr>
<td>
						string
					</td>
					<td>
						يتم قراءة السلسلة النصية كما هي، وتجاهل الفراغات من البداية والنهاية. السلسلة النصية الفارغة تصبح 0. وعند وجود خطأ في نتيجة التحويل تكون النتيجة NaN.
					</td>
				</tr>
</tbody></table>
</li>
</ul>
<ul>
<li>
		التحويل إلى قيم منطقية: يحدث في العمليات المنطقية ويمكن تنفيذه باستخدام Boolean(value)<code>‎</code>. ويتبع هذا التحويل القواعد التالية:

		<table><tbody>
<tr>
<td>
						القيمة
					</td>
					<td>
						ناتج التحويل
					</td>
				</tr>
<tr>
<td>
						0, null, undefined, NaN, ""
					</td>
					<td>
						false
					</td>
				</tr>
<tr>
<td>
						القيم الأخرى
					</td>
					<td>
						true
					</td>
				</tr>
</tbody></table>
</li>
</ul>
<p>
	معظم هذه القواعد سهلة الفهم والحفظ. ولكن هناك بعض الاستثناءات أو الأخطاء الشائعة مثل:
</p>

<ul>
<li>
		القيمة <code>undefined</code> كعدد هي NaN وليست 0.
	</li>
	<li>
		"0" والسلاسل النصية المحتوي على فراغات فقط مثل <code>" "</code> تُحوَّل إلى القيمة المنطقية <code>true</code>.
	</li>
</ul>
<p>
	تذكر أننا لم ندرس الكائنات بعد. سنعود إليها لاحقًا في فصل التحويل من الكائنات إلى الأنواع الأساسية المخصص للكائنات ولكن بعد تعلم المزيد من مبادئ JavaScript.
</p>

<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	1. تحويلات الأنواع
</h3>

<p class="task__importance" id="-5">
	الأهمية: 5
</p>

<p>
	ما هي نتيجة التعابير التالية؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_25" style="">
<span class="str">""</span><span class="pun">+</span><span class="lit">1</span><span class="pun">+</span><span class="lit">0</span><span class="pln">
</span><span class="str">""</span><span class="pun">-</span><span class="lit">1</span><span class="pun">+</span><span class="lit">0</span><span class="pln">
</span><span class="kwd">true</span><span class="pun">+</span><span class="kwd">false</span><span class="pln">
</span><span class="lit">6</span><span class="pun">/</span><span class="str">"3"</span><span class="pln">
</span><span class="str">"2"</span><span class="pun">*</span><span class="str">"3"</span><span class="pln">
</span><span class="lit">4</span><span class="pun">+</span><span class="lit">5</span><span class="pun">+</span><span class="str">"px"</span><span class="pln">
</span><span class="str">"$"</span><span class="pun">+</span><span class="lit">4</span><span class="pun">+</span><span class="lit">5</span><span class="pln">
</span><span class="str">"4"</span><span class="pun">-</span><span class="lit">2</span><span class="pln">
</span><span class="str">"4px"</span><span class="pun">-</span><span class="lit">2</span><span class="pln">
</span><span class="lit">7</span><span class="pun">/</span><span class="lit">0</span><span class="pln">
</span><span class="str">"   -9   "</span><span class="pun">+</span><span class="lit">5</span><span class="pln">
</span><span class="str">"   -9   "</span><span class="pun">-</span><span class="lit">5</span><span class="pln">
</span><span class="kwd">null</span><span class="pun">+</span><span class="lit">1</span><span class="pln">
</span><span class="kwd">undefined</span><span class="pun">+</span><span class="lit">1</span></pre>

<p>
	فكر جيدًا، ثم اكتب حلك وقارنه مع الإجابة.
</p>

<p>
	<strong>الحل:</strong>
</p>

<div class="task__answer">
	<ol>
<li>
			الجمع مع سلسلة نصية مثل <code>‎""+ 1</code> يحول العدد 1 إلى سلسلة نصية: <code>‎""+1="1"‎</code>، ثم لدينا <code>"1"+0</code> التي تنطبق عليها القاعدة نفسها.
		</li>
		<li>
			الطرح <code>-</code> (مثل معظم العمليات الرياضية) يعمل فقط مع القيم العددية، وبالتالي يحول السلسلة النصية الفارغة "" إلى 0.
		</li>
		<li>
			الجمع مع سلسلة نصية يضم العدد 5 إلى السلسلة النصية.
		</li>
		<li>
			تحول عملية الطرح دائمًا القيم إلى أعداد. لذلك يحول القيمة <code>" ‎-9 "</code> إلى <code>‎-9</code> ( ويتجاهل الفراغات حولها).
		</li>
		<li>
			تصبح قيمة null هي 0 بعد تحويلها إلى عدد.
		</li>
		<li>
			القيمة الغير معرفة undefined تصبح NaN بعد تحويلها إلى عدد.
		</li>
	</ol>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9881_23" style="">
<span class="str">""</span><span class="pun">+</span><span class="lit">1</span><span class="pun">+</span><span class="lit">0</span><span class="pln">  </span><span class="pun">=</span><span class="str">"10"</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
</span><span class="str">""</span><span class="pun">-</span><span class="lit">1</span><span class="pun">+</span><span class="lit">0</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="com">//(2)</span><span class="pln">
</span><span class="kwd">true</span><span class="pun">+</span><span class="kwd">false</span><span class="pln">
</span><span class="lit">6</span><span class="pun">/</span><span class="str">"3"</span><span class="pln"> </span><span class="pun">=</span><span class="lit">2</span><span class="pln">
</span><span class="str">"2"</span><span class="pun">*</span><span class="str">"3"</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pln">
</span><span class="lit">4</span><span class="pun">+</span><span class="lit">5</span><span class="pun">+</span><span class="str">"px"</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"9px"</span><span class="pln">
</span><span class="str">"$"</span><span class="pun">+</span><span class="lit">4</span><span class="pun">+</span><span class="lit">5</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"$45"</span><span class="pln">
</span><span class="str">"4"</span><span class="pun">-</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="str">"4px"</span><span class="pun">-</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">NaN</span><span class="pln">
</span><span class="lit">7</span><span class="pun">/</span><span class="lit">0</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">Infinity</span><span class="pln">
</span><span class="str">"   -9   "</span><span class="pun">+</span><span class="lit">5</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"   -9   5"</span><span class="pln"> </span><span class="com">//(3)</span><span class="pln">
</span><span class="str">"   -9   "</span><span class="pun">-</span><span class="lit">5</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">14</span><span class="pln"> </span><span class="com">//(4)</span><span class="pln">
</span><span class="kwd">null</span><span class="pun">+</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="com">//(5)</span><span class="pln">
</span><span class="kwd">undefined</span><span class="pun">+</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">NaN</span><span class="pln"> </span><span class="com">//(6)</span></pre>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/type-conversions" rel="external nofollow">Type conversions</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-javascript-r699/" rel="">المعاملات في JavaScript</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r672/" rel="">أنواع البيانات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">673</guid><pubDate>Mon, 03 Jun 2019 13:05:00 +0000</pubDate></item><item><title>&#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r672/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/8.jpg.168cc8ca522a808c165c43a75752cf75.jpg" /></p>

<p>
	يمكن أن يحتوي المتغير على أي نوع من <a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">أنواع البيانات</a> في JavaScript. أي من الممكن أن يكون متغير من نوع سلسلة نصية في وقت ما، ثم يتغير محتواه إلى قيمة عددية وهكذا دواليك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_6" style="">
<span class="com">// لا يوجد أي خطأ</span><span class="pln">
let message </span><span class="pun">=</span><span class="pln"> </span><span class="str">"hello"</span><span class="pun">;</span><span class="pln">
message </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123456</span><span class="pun">;</span></pre>

<p>
	تسمى اللغات البرمجية التي تسمح بتغيير نوع القيم المسندة إلى المتغير بلغات برمجة «ديناميكية النوع» (dynamically typed)، ومعنى ذلك أنه توجد أنواع للبيانات ولكن لا يتم ربط المتغير بنوع معين منها.
</p>

<p>
	هنالك سبعة أنواع أساسية في لغة JavaScript. سنذكرها الآن بشكل عام، وسنتحدث في الفصول القادمة عن كل نوع منها بالتفصيل.
</p>

<h2 id="-">
	الأعداد
</h2>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_8" style="">
<span class="pln">let n</span><span class="pun">=</span><span class="lit">123</span><span class="pun">;</span><span class="pln">
n</span><span class="pun">=</span><span class="lit">12.345</span><span class="pun">;</span></pre>

<p>
	يمكن تمثيل الأعداد، بما فيها الأعداد الصحيحة (integers) والعشرية (floating point)، في JavaScript عبر النوع <code>number</code>.
</p>

<p>
	هنالك العديد من العمليات التي يمكن تنفيذها على المتغيرات العددية، مثل، الضرب <code>*</code>، والقسمة <code>/</code>، والجمع <code>+</code>، والطرح <code>-</code>، وغيرها من العمليات الرياضية.
</p>

<p>
	كما أن هناك «قيم عددية خاصة»، بالإضافة إلى الأعداد العادية، والتي تنتمي أيضًا إلى هذا النوع من البيانات مثل: <code>Infinity</code>، و <code>‎-Infinity</code>، و <code>NaN</code>. وهاك شرحها:
</p>

<ul>
<li>
		<code>Infinity</code>: وتمثل قيمة <a href="https://en.wikipedia.org/wiki/Infinity" rel="external nofollow">اللانهاية الرياضية</a>، وهي قيمة خاصة أكبر من أي عدد موجب آخر. ومن الممكن أن نحصل عليها في عدة حالات منها قسمة عدد على الصفر:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_10" style="">
<span class="pln">alert </span><span class="pun">(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Infinity</span></pre>

<p>
	أو بالإمكان الإشارة إليها بشكل مباشر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_12" style="">
<span class="pln">alert </span><span class="pun">(</span><span class="kwd">Infinity</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Infinity</span></pre>

<ul>
<li>
		<code>NaN</code>: هذه القيمة ناتجة عن اختصارالعبارة "Not a Number" (ليس عددًا) وتمثل خطأً حسابيًّا، أو حالة عدم تعيين. وهي نتيجة عملية رياضية خاطئة أو غير معروفة. إليك المثال التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_16" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="pln"> </span><span class="str">"not a number"</span><span class="pun">/</span><span class="lit">2</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// NaN, لا يمكن إجراء مثل عملية القسمة هذه</span></pre>

<p>
	وتتصف القيمة <code>NaN</code> بأنها «لاصقة» (sticky)، أي بمعنى عندما ُتنفَّذ أي عملية على <code>NaN</code>، فالقيمة الناتجة هي <code>NaN</code> أيضًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_18" style="">
<span class="pln">alert </span><span class="pun">(</span><span class="str">"not a number"</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">+</span><span class="lit">5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// NaN</span></pre>

<p>
	لذلك عند وجود القيمة <code>NaN</code> في أي مكان من التعابير الرياضية، فستطغى على كامل النتيحة.
</p>

<p>
	وتنتمي القيم العددية الخاصة شكليًا فقط إلى نوع القيم العددية، لأنها في واقع الأمر لا تعبر عن أعداد بمفهومها الشائع. سنتكلم لاحقًا عن التعامل مع الأعداد في فصل (الأعداد).
</p>

<h3 id="-">
	العمليات الرياضية «آمنة»
</h3>

<p>
	ممارسة الرياضيات آمنة في JavaScript، وبإمكانك القيام بأي عملية حسابية، مثل: القسمة على صفر، والتعامل مع السلاسل الغير عددية كأعداد، وغيرها من العمليات. ثق تمامًا أن السكربت لن ينتهي بخطأ فادح (أو يتوقف عن العمل). أسوأ ما في الأمر أنك ستحصل على النتيجة <code>NaN</code>.
</p>

<h2 id="-">
	السلاسل النصية (النصوص)
</h2>

<p>
	تمثَّل النصوص (سنطلق عليها «سلاسل نصية» من الآن وصاعدًا) عبر النوع <code>string</code>. يجب أن تُحاط السلسلة النصية في JavaScript بإشارتي تنصيص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_20" style="">
<span class="pln">let str </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pun">;</span><span class="pln">
let str2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Single quotes are ok too'</span><span class="pun">;</span><span class="pln">
let phrase </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">can embed $</span><span class="pun">{</span><span class="pln">str</span><span class="pun">}`;</span></pre>

<p>
	يوجد في لغة JavaScript ثلاثة أنواع من إشارات التنصيص وهي:
</p>

<ol>
<li>
		المزدوجة: مثل "Hello".
	</li>
	<li>
		المفردة: مثل 'Hello'.
	</li>
	<li>
		المائلة: مثل Hello (إضافة الإشارة).
	</li>
</ol>
<p>
	إشارتي التنصيص المفرد والمزدوج هما عبارة عن إشارات تنصيص تتصف بأنها «بسيطة» ولا يوجد أي فرق بينها في JavaScript.
</p>

<p>
	أما إشارة التنصيص المائلة، فهي عبارة عن إشارات تنصيص لها «وظيفة إضافية»، إذ تسمح لك بإضافة متغيرات وتعابير إلى السلسلة النصية بعد إحاطتها بـ <code>‎${...}‎</code>. فمثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_22" style="">
<span class="pln">let name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"أحمد"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تضمين متغير</span><span class="pln">
alert </span><span class="pun">(`مرحبًا،</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">name</span><span class="pun">}!`);</span><span class="pln"> </span><span class="com">// مرحبًا، أحمد!</span><span class="pln">

</span><span class="com">// تضمين تعبير</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">the result is $</span><span class="pun">{</span><span class="lit">1</span><span class="pun">+</span><span class="lit">2</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">// النتيجة هي 3</span></pre>

<p>
	يُحسب التعبير داخل <code>‎${...}‎</code> وتصبح نتيجته جزءًا من السلسلة النصية. بإمكاننا وضع أي شيء هناك مثل: المتغير <code>name</code> أو التعبير الرياضي <code>1 + 2</code> أو حتى تعابير برمجية أخرى أكثر تعقيدًا.
</p>

<p>
	ولكن أبقِ في ذهنك أن هذا مقتصر فقط على إشارات التنصيص المائلة. ولا تستطيع إشارات التنصيص الأخرى القيام بمثل هذا العمل!
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_24" style="">
<span class="pln">alert </span><span class="pun">(</span><span class="str">" the result is ${1+2}"</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// ${1+2} النتيجة هي</span><span class="pln">
                              </span><span class="com">// فلا تفعل إشارات التنصيص المزدوجة أي شيء</span></pre>

<p>
	إذا كنت تشعر بصعوبة الأمر، لا تقلق. سنتحدث عنه لاحقًا بشكل موسع في فصل السلاسل النصية.
</p>

<h3 id="-">
	المحارف ليس لها نوع مخصص للأسف
</h3>

<p>
	يوجد في بعض اللغات البرمجية نوعًا خاصًّا من البيانات للمحرف المفرد (character) ويسمى <code>char</code> في لغة C و Java مثلًا.
</p>

<p>
	لا يوجد مثل هذا النوع في JavaScript. ويوجد فقط نوع واحد وهو <code>string</code> (سلسلة نصية) الذي من الممكن أن يحتوي على محرف واحد أو أكثر.
</p>

<h2 id="-">
	النوع المنطقي (البولياني)
</h2>

<p>
	يأخذ النوع <code>boolean</code> إحدى القيمتين: <code>true</code> (صح) أو <code>false</code> (خطأ) وتدعى هاتان القيمتان بالقيم المنطقية.
</p>

<p>
	من الشائع استخدام هذا النوع لحفظ البيانات التي لها القيم (نعم / لا): <code>true</code> تعني "نعم، صحيح"، و <code>false</code> تعني "لا، خطأ". إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_26" style="">
<span class="pln">let nameFieldChecked </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln"> </span><span class="com">// name نعم، جرى تحديد الحقل</span><span class="pln">
let ageFieldChecked </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// غير محدَّد age لا، الحقل</span></pre>

<p>
	أضف إلى ذلك أن القيم المنطقية تعبِّر عن ناتج عمليات الموازنة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_28" style="">
<span class="pln">let isGraeter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">&gt;</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">isGreater</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true إذ نتيجة الموازنة محقَّقة أي</span></pre>

<h2 id="-null">
	القيمة الخالية: null
</h2>

<p>
	لا تنتمي القيمة الخالية <code>null</code> إلى أي نوع من أنواع البيانات المذكورة سابقًا ولكن لها نوع خاص. يملك هذا النوع الخاص قيمة واحدة هي <code>null</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_30" style="">
<span class="pln">let age </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span></pre>

<p>
	في لغة JavaScript، لا يعبِّر النوع <code>null</code> عن مرجع لكائن غير موجود أو مؤشر خالي كما في لغات برمجية أخرى. ولكنه عبارة عن قيمة خاصة تمثِّل "لا شيء"، أو "فارغ"، أو "قيمة غير معلومة". فمثلًا، الشيفرة البرمجية السابقة تعدُّ المتغير <code>age</code> غير معلوم أو فارغ لسبب ما.
</p>

<h2 id="-undefined">
	القيمة الغير معرفة: undefined
</h2>

<p>
	يمكن تمييز نوع آخر أيضًا للبيانات وهو «غير مُعرَّف» الذي يمثله النوع <code>undefined</code>. ويشكل هذا النوع نوعًا خاصًّا قائمًا بنفسه تمامًا مثل النوع <code>null</code>. أما معنى «غير معرّف» أي أنه لم تُسنَد أية قيمة للمتغير بعد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_32" style="">
<span class="pln">let x</span><span class="pun">;</span><span class="pln">
alert </span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "undefined" تُعرَض القيمة</span></pre>

<p>
	تقنيًا، من الممكن إسناد القيمة <code>undefined</code> لأي متغير:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_34" style="">
<span class="pln">let x</span><span class="pun">=</span><span class="lit">123</span><span class="pun">;</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "undefined"</span></pre>

<p>
	ولكن لا أنصحك بالقيام بذلك. نستخدم عادةً القيمة <code>null</code> لإسناد القيمة الخالية أو غير المعروفة لمتغير، ونستخدم <code>undefined</code> للتحقق من أن إذا كان للمتغير قيمة أو لا.
</p>

<h2 id="-">
	الكائنات والرموز
</h2>

<p>
	النوع <code>object</code> (كائن) هو نوعٌ خاصٌّ. تسمى جميع الأنواع السابقة بالأنواع «الأساسية» (primitive) لأن قيمها تحتوي على شيء واحد فقط (سلسلة نصية أو عدد أو أي شيء آخر). ولكن تُستخدَم الكائنات لتخزين مجموعة من البيانات والكيانات (entity) الأكثر تعقيدًا. سنتعامل معها في فصل الكائنات بعد الانتهاء من دراسة الأنواع الأساسية.
</p>

<p>
	يستخدم النوع <code>symbol</code> (رمز) لتشكيل معرّف (identifier) مُميَّز للكائنات. يُفضَّل دراسة هذا النوع بعد الانتهاء من الكائنات ولكن ذكره هنا ضروري لاستكمال جميع أنواع البيانات.
</p>

<h2 id="-typeof-">
	المعامل <code>typeof</code>
</h2>

<p>
	يُحدِّد المعامل <code>typeof</code> نوع الشيء المُمرَّر إليه. ويكون مفيدًا عندما تحتاج إلى معالجة القيم بطرق مختلفة حسب نوعها، أو فقط القيام بفحص سريع لنوع البيانات. ويمكن كتابة الصياغة بطريقتين:
</p>

<ol>
<li>
		معامل: <code>typeof x</code>.
	</li>
	<li>
		تابع: <code>typeof(x)‎</code>.
	</li>
</ol>
<p>
	بمعنى آخر، من الممكن استخدامه مع أو بدون الأقواس، وتكون النتيجة واحدة. نتيجة استدعاء <code>typeof x</code> هو سلسلة نصية تمثل اسم النوع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_36" style="">
<span class="kwd">typeof</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pln">    </span><span class="com">// "undefined"</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="lit">0</span><span class="pln">            </span><span class="com">// "number"</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">         </span><span class="com">// "boolean"</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="str">"foo"</span><span class="pln">        </span><span class="com">// "string"</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="typ">Symbol</span><span class="pun">(</span><span class="str">"id"</span><span class="pun">)</span><span class="pln"> </span><span class="com">// "symbol"</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="typ">Math</span><span class="pln">         </span><span class="com">// "object" (1)</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> </span><span class="kwd">null</span><span class="pln">         </span><span class="com">// "object" (2)</span><span class="pln">
</span><span class="kwd">typeof</span><span class="pln"> alert        </span><span class="com">// "function" (3)</span></pre>

<p>
	قد تحتاج لتوضيح نتائج الأسطر الثلاث الأخيرة:
</p>

<ol>
<li>
		<code>Math</code> هو كائن مضمّن في JavaScript ويوفر العمليات الرياضية. سنتحدث عنه لاحقًا في فصل الأعداد، وذكرناه هنا فقط كمثال عن نوع الكائن.
	</li>
	<li>
		نتيجة <code>typeof null</code> هي "object" أي كائن. أليس هذا خطأ؟! بالتأكيد. وقد تم الاعتراف بذلك رسميًا، ولكن بقيت هذه النتيجة من أجل المحافظة على التوافقية. القيمة "null" ليست كائنًا بل هي قيمة لنوع منفصل بحد ذاته. لذلك، مرةً أخرى، نؤكد أنّ هذا خطأ من اللغة نفسها.
	</li>
	<li>
		نتيجة <code>typeof alert</code> هي "function" (دالة)، لأن <code>alert</code> هو دالة في لغة JavaScript. سنتحدث لاحقًا عن التوابع في الفصول القادمة وستلاحظ أنه لا يوجد نوع خاص اسمه "function" في لغة JavaScript. تنتمي التوابع إلى نوع الكائنات ولكن لها معاملة خاصة في <code>typeof</code>. شكليًا، هذا خطأ، ولكنه مفيد جدًا عند التطبيق العملي.
	</li>
</ol>
<h2 id="-">
	الخلاصة
</h2>

<p>
	هناك سبعة أنواع أساسية من أنواع البيانات في JavaScript هي:
</p>

<ul>
<li>
		<code>number</code>: يمثِّل الأعداد بكل أنوعها: الصحيحة والعشرية.
	</li>
	<li>
		<code>string</code>: يمثِّل السلاسل النصية. ويمكن أن تحتوي السلسلة النصية على محرف واحد أو أكثر، ولكن لا يوجد نوع خاص من أجل المحرف الواحد.
	</li>
	<li>
		<code>boolean</code>: يمثِّل القيم المنطقية (صح / خطأ).
	</li>
	<li>
		<code>null</code>: يمثِّل القيم الخاوية. وهو نوع خاص يملك قيمة وحيدة وهي القيمة <code>null</code>.
	</li>
	<li>
		<code>undefined</code>: قيمة غير معرَّفة تكون قيمةً للمتغيرات التي لم تسند قيمة محدَّدة لها بعد. وهو نوع خاص يملك قيمة وحيدة وهي <code>undefined</code>.
	</li>
	<li>
		<code>object</code>: كائن من أجل بنى البيانات الأكثر تعقيدًا.
	</li>
	<li>
		<code>symbol</code>: رمز للمعرفات الخاصة.
	</li>
</ul>
<p>
	ويسمح المعامل <code>typeof</code> بمعرفة أنوع القيم المخزنة في المتغيرات:
</p>

<ul>
<li>
		له شكلين: <code>typeof x</code> أو <code>typeof(x)‎</code>.
	</li>
	<li>
		يعيد سلسلة نصية تحوي اسم النوع، مثل "string".
	</li>
	<li>
		من أجل <code>null</code> يعطي القيمة "object" وهذا خطأ في اللغة، فالقيمة الخالية ليست من نوع الكائن.
	</li>
</ul>
<p>
	سنركز في الفصل القادم على القيم الأساسية ثم ننتقل إلى الحديث عن الكائنات.
</p>
<style type="text/css">
.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}
code {
    background-color: rgb(250, 250, 250);
    border-radius: 3px;
}</style>
<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	1. إشارات تنصيص السلاسل النصية
</h3>

<p class="task__importance">
	الأهمية: 5
</p>

<p>
	ما هو خرج هذا السكربت؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_38" style="">
<span class="pln">let name </span><span class="str">" Ilya"</span><span class="pun">;</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="lit">1</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">//?</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="str">"name"</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">//?</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="pln">name</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">//?</span></pre>

<p>
	<strong>الحل</strong>
</p>

<div class="task__answer">
	<p>
		تُضمن الفاصلة العليا الخلفية التعابير الموجودة داخل <code>‎${…}‎</code> في السلسلة النصية:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7503_40" style="">
<span class="pln">let name </span><span class="str">" Ilya"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// قيمة التعبير هو 1</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="lit">1</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">// hello1</span><span class="pln">

</span><span class="com">// "name" قيمة التعبير هي السلسلة النصية</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="str">"name"</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">// hello name</span><span class="pln">

</span><span class="com">// name قيمة التعبير هو ما ضُمِّن بالمتغير</span><span class="pln">
alert </span><span class="pun">(`</span><span class="pln">hello $</span><span class="pun">{</span><span class="pln">name</span><span class="pun">}`);</span><span class="pln"> </span><span class="com">// hello Ilya</span></pre>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/types" rel="external nofollow">Data types</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%AD%D9%88%D9%8A%D9%84-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-r673/" rel="">التحويل بين الأنواع</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-r671/" rel="">المتغيرات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">672</guid><pubDate>Thu, 30 May 2019 13:05:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-r671/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/7.jpg.c46c2d8f570f42798dcb7b0f9f25bdc2.jpg" /></p>

<p>
	سوف تحتاج، بالتأكيد، في مرحلة ما من عملك على تطوير التطبيقات في لغة JavaScript للتعامل مع المعلومات. فمثلًا، بإمكانك تخيل العمل على التطبيقين التاليين:
</p>

<ol>
<li>
		متجر إلكتروني – يمكن أن تتضمن المعلومات البضائع التي تباع وسلة التسوق.
	</li>
	<li>
		تطبيق محادثة فورية – يمكن أن تتضمن المعلومات، والمستخدمين، والرسائل وغيرها.
	</li>
</ol>
<p>
	إن أردنا تخزين هذه المعلومات، نحتاج إلى شيء يُخزِّنها ويحفظها لنا، وهذا ما تمثله المتغيرات تمامًا. فمثل المتغيرات كمثل الأوعية والآنية التي تحفظ وتُخزِّن كل ما يوضع فيها.
</p>

<h2 id="-">
	المتغير
</h2>

<p>
	المتغير هو «مَخزَن مُسمَى» (named storage) للبيانات، وهذا المخزن يقع في الذاكرة. بإمكانك استخدام المتغيرات لتخزين البضائع، والزوار وغيرها من البيانات.
</p>

<p>
	إن أردت إنشاء متغير جديد في لغة JavaScript، استخدم الكلمة المفتاحية <code>let</code>. تنشئ العبارة البرمجية التالية (أو بمعنى آخر تصرّح عن، أو تُعرِّف) متغيرًا جديدًا باسم "message":
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_7" style="">
<span class="pln">let message</span><span class="pun">;</span></pre>

<p>
	الآن، نستطيع وضع بعض البيانات فيه باستخدام معامل الإسناد <code>=</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_9" style="">
<span class="pln">let message</span><span class="pun">;</span><span class="pln">
message</span><span class="pun">=</span><span class="str">'Hello'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'Hello' خزِّن السلسلة النصية</span></pre>

<p>
	بعد تنفيذ هذه الشيفرة، تُحفَظ السلسلة النصية السابقة في منطقة من الذاكرة مرتبطة بهذا المتغير. ويمكننا الوصول إليها باستخدام اسم المتغير:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_11" style="">
<span class="pln">let message
mesaage </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello!'</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln"> </span><span class="com">// اظهار محتوى المتغير</span></pre>

<p>
	وللاختصار، من الممكن الدمج بين التصريح عن المتغير وإسناد قيمة معينة له في نفس السطر بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_13" style="">
<span class="pln">let message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello!'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// التصريح عن المتغير وإسناد قيمة له</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Hello!</span></pre>

<p>
	كما من الممكن أيضًا التصريح عن عدة متغيرات في نفس السطر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_15" style="">
<span class="pln">let user </span><span class="pun">=</span><span class="pln"> </span><span class="str">'John'</span><span class="pun">,</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln"> message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span></pre>

<p>
	يبدو هذا أقصر، ولكن لا أنصحك باستخدام هذه الطريقة. استخدم سطرًا مستقلًا لكل متغير لتسهيل قراءة الشيفرة البرمجية.
</p>

<p>
	تبدو المتغيرات المتعددة الأسطر (المكتوبة على أسطر منفصلة) أطول قليلًا، ولكنها أسهل عند القراءة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_17" style="">
<span class="pln">let user </span><span class="pun">=</span><span class="pln"> </span><span class="str">'John'</span><span class="pun">;</span><span class="pln">
let age </span><span class="pun">=</span><span class="lit">25</span><span class="pun">;</span><span class="pln">
let message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span></pre>

<p>
	يصرِّح بعض المبرمجين عن عدة متغيرات بأسلوب الأسطر المتعددة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_19" style="">
<span class="pln">let user </span><span class="pun">=</span><span class="pln"> </span><span class="str">'John'</span><span class="pun">,</span><span class="pln">
   age </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln">
   message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span></pre>

<p>
	أو حتى من الممكن استخدام أسلوب «الفاصلة أولًا» (comma-first):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_21" style="">
<span class="pln">let user </span><span class="pun">=</span><span class="pln"> </span><span class="str">'John'</span><span class="pln">
   </span><span class="pun">,</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25</span><span class="pln">
   </span><span class="pun">,</span><span class="pln"> message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span></pre>

<p>
	برمجيًا، جميع هذه الحالات متماثلة وظيفيًّا. لذلك، يعود الأمر لك لتختار الأنسب والأفضل.
</p>

<p>
	ملاحظة حول استخدام <code>var</code> بدلًا من <code>let</code>: في السكربتات القديمة، من الممكن أن تلاحظ استخدام الكلمة المفتاحية <code>var</code> بدلًا من <code>let</code> للتصريح عن المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_23" style="">
<span class="kwd">var</span><span class="pln"> message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span></pre>

<p>
	وللكلمة المفتاحية <code>var</code> نفس عمل <code>let</code> تقريبًا. فهي تصرح أيضًا عن المتغيرات ولكنها تختلف عنها قليلًا، ومن الممكن أن تعتبرها، الطريقة «التقليدية» (old-school) للتصريح عن المتغيرات.
</p>

<p>
	هناك فروق دقيقة بين <code>let</code> و <code>var</code>، لكنها حاليًا غير مهمة بالنسبة لك. سندرس هذه الفروق بالتفصيل في فصل المتغير القديم.
</p>

<h2 id="-">
	مثال واقعي للمتغيرات
</h2>

<p>
	إن أردت فهم مبدأ عمل المتغيرات فهمًا جيدًا، فتخيل «صندوقًا»، وعليه لُصاقة باسم مميز. فمثلًا، بإمكانك تخيل المتغير message بصندوق مسمى بالاسم <code>"message"</code>، وداخل هذا الصندوق القيمة "Hello!‎"<pic01></pic01></p>

<p style="text-align: center;">
	<img alt="pic01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29502" data-unique="np6heo04n" src="https://academy.hsoub.com/uploads/monthly_2019_05/pic01.png.76f73ff923e33b7681d68e8a66229c2c.png"></p>

<p>
	<pic01>بإمكانك وضع أي قيمة في الصندوق، كما بإمكانك تغيير هذه القيمة مرارًا وتكرارًا:</pic01></p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_25" style="">
<span class="pln">let message</span><span class="pun">;</span><span class="pln">
message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello!'</span><span class="pun">;</span><span class="pln">
message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'World!'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// value changed</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span></pre>

<p>
	ولكن لاحظ أنه عندما تتغير القيمة، تُحذَف البيانات السابقة من المتغير.
</p>

<p style="text-align: center;">
	<img alt="pic02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29503" data-unique="pe4fqe74j" src="https://academy.hsoub.com/uploads/monthly_2019_05/pic02.png.e2698c89bc0c98e639d1547ee6820b7f.png"></p>

<p>
	بإمكانك أيضًا التصريح عن متغيرين ونسخ البيانات من أحدهما إلى الآخر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_31" style="">
<span class="pln">let hello </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello world!'</span><span class="pun">;</span><span class="pln">
let message</span><span class="pun">;</span><span class="pln">
</span><span class="com">// message إلى المتغير hello من المتغير 'Hello world' نسخ القيمة</span><span class="pln">
message </span><span class="pun">=</span><span class="pln"> hello</span><span class="pun">;</span><span class="pln">

</span><span class="com">// يملك المتغيران الآن البيانات نفسها</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">hello</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Hello world!</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Hello world!</span></pre>

<h3 id="-">
	اللغات الوظيفية
</h3>

<p>
	من الأمور التي تجدر ملاحظتها أيضًا أن اللغات البرمجية الوظيفية، مثل Scala أو Erlang، تمنع تغيير قيم المتغيرات بعد إسنادها إليها. أي عندما تخزن القيمة في الصندوق، في مثل تلك اللغات، فإنها تبقى فيه للأبد. وعند الحاجة إلى تخزين بيانات أخرى، تجبرك اللغة على خلق صندوق آخر (التصريح عن متغير جديد)، ولا يمكنك آنذاك إعادة استخدام الصندوق السابق ولا حتى إعادة الصندوق الحالي الذي أنشأته. هل يمكنك تخيل كومة الصناديق التي ستتراكم بعد فترة من الزمن؟!
</p>

<p>
	يبدو الأمر غريبًا وصعبًا قليلًا، ولكن فعليًا هذه اللغات قادرة على إجراء تطويرات جادة ومهمة. كما أنَ بعض المجالات تستغل هذه المحدودية وتعتبرها فائدة كما في <a href="https://itwadi.com/Introduction_to_Parallel_Computing" rel="external nofollow">الحوسبة المتوازية</a> مثلًا. دراسة مثل هذه اللغات جيد لتوسيع مداركك وآفاقك (حتى لو كنت لا تخطط لاستخدامها قريبًا).
</p>

<h2 id="-">
	تسمية المتغيرات
</h2>

<p>
	هنالك شرطان لأسماء المتغيرات في JavaScript:
</p>

<ol>
<li>
		يجب ألا يحتوي اسم المتغير إلا على حروف، و أرقام، و الرمزين <code>$</code> و <code>_</code> فقط.
	</li>
	<li>
		يمنع استخدام رقم في أول حرف من الاسم، أي يجب ألا يبدأ اسم المتغير برقم.
	</li>
</ol>
<p>
	أمثلة عن التسمية الصحيحة للمتغيرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_35" style="">
<span class="pln">let userName</span><span class="pun">;</span><span class="pln">
let test123</span><span class="pun">;</span></pre>

<p>
	عندما يتألف الاسم من عدة كلمات، يستخدم عادةً أسلوب «سنام الجمل» (camelCase). حيث تكتب الكلمات متتالية دون أي فاصل، وتبدأ كل كلمة بحرف كبير: myVeryLongName.
</p>

<p>
	الأمر المميز الآخر هو أنه من الممكن استخدام رمز الدولار <code>$</code> والشرطة التحتية <code>_</code> في أسماء المتغيرات. وهما عبارة عن رمزين عاديين، كأي حرف آخر، وليس لهما معنًى خاص.
</p>

<p>
	أمثلة عن بعض الأسماء المسموحة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_37" style="">
<span class="pln">let $</span><span class="pun">=</span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// "$" التصريح عن متغير اسمه</span><span class="pln">
let _</span><span class="pun">=</span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// "_" والتصريح عن متغير آخر اسمه</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">$ </span><span class="pun">+</span><span class="pln"> _</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 3</span></pre>

<p>
	وأمثلة عن بعض أسماء المتغيرات المكتوبة خطأً:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_39" style="">
<span class="pln">let </span><span class="lit">1a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// لا يمكن بدء اسم المتغير برقم</span><span class="pln">
let my</span><span class="pun">-</span><span class="pln">name</span><span class="pun">;</span><span class="pln"> </span><span class="com">//  لا يسمح باستعمال الشرطة '-' في أسماء المتغيرات</span></pre>

<p>
	<strong>ملاحظة: حالة الأحرف مهمة</strong><br>
	فالمتغير الذي اسمه apple مختلفٌ تمامًا عن المتغير الذي اسمه AppLE.
</p>

<p>
	<strong>ملاحظة: استخدام أحرف من لغات أخرى غير الإنجليزية</strong><br>
	من الممكن استخدام أحرف من أي لغة غير الإنجليزية وحتى الأحرف العربية أو السيريلية أو الهيروغليفية، ولكن لا ننصحك بذلك. فمثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_41" style="">
<span class="pln">let </span><span class="pun">имя</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'…'</span><span class="pun">;</span><span class="pln">
let </span><span class="pun">我</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'…'</span><span class="pun">;</span><span class="pln">
let </span><span class="pun">رسالة</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'…'</span><span class="pun">;</span></pre>

<p>
	برمجيًا، لا توجد أية أخطاء هنا، ومثل هذه الأسماء ممكنة، ولكن هناك تقليد عالمي باستخدام أسماء متغيرات إنجليزية. فحتى لو كنت تكتب سكربتًا صغيرًا ولكن من الممكن أن يبقى فترة طويلة ويصل إلى مبرمجين من بلدان أخرى في وقت ما.
</p>

<h3 id="-">
	الأسماء المحجوزة
</h3>

<p>
	هناك قائمة من <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords" rel="external nofollow">الكلمات المحجوزة</a>، والتي ليس ممكنًا استخدامها كأسماء للمتغيرات لأنها مستخدمة من قبل اللغة نفسها.
</p>

<p>
	مثلًا، الكلمات التالية: <code>let</code>، و <code>class</code>، و <code>return</code>، و <code>function</code> محجوزة. والشيفرة البرمجية التالية سينتج عنها خطأ في الصياغة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_43" style="">
<span class="pln">let let </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// "let" خطأ! لا يمكن تسمية المتغير بالاسم</span><span class="pln">
let </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// أيضًا "return" خطأ! لا يمكن تسمية المتغير بالاسم</span></pre>

<h3 id="-">
	الإسناد بعيدًا عن الوضع الصارم
</h3>

<p>
	نحتاج عادةً إلى التصريح عن متغير قبل استخدامه. ولكن سابقًا، كان من المسموح برمجيًا خلق المتغير فقط بإسناد قيمة له دون استخدام <code>let</code> أو أي كلمة مفتاحية أخرى. ما زال هذا ممكنًا، ولكن بشرط عدم استخدام الموجه <code>"use strict"</code> في السكربت وذلك لضمان استمرارية التوافق مع السكربتات السابقة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_45" style="">
<span class="com">// هنا "use strict" انتبه إلى عدم استخدام الموجه</span><span class="pln">
num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// إن لم يكن موجودًا "num" سيُنشَأ المتغير</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">num</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 5</span></pre>

<p>
	ولكن أبقِ في ذهنك أنها طريقة سيئة، وسينتج عنها خطأ عند عملك ضمن الوضع الصارم (strict mode):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_47" style="">
<span class="str">"use strict"</span><span class="pln">
num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// error: num is not defined</span></pre>

<h2 id="-">
	الثوابت
</h2>

<p>
	للتصريح عن ثابت، وهو المتغير الذي لا تتبدل قيمته، استخدم <code>const</code> بدلًا من <code>let</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_49" style="">
<span class="kwd">const</span><span class="pln"> myBirthday </span><span class="pun">=</span><span class="pln"> </span><span class="str">'18.04.1982'</span><span class="pun">;</span></pre>

<p>
	المتغيرات التي يُصرَّح عنها باستخدام <code>const</code> تُسمَّى «الثوابت» ولا يمكن أن تتغير قيمتها؛ وأي محاولة للقيام بذلك ينتج عنها خطأ عند تنفيذ الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_51" style="">
<span class="kwd">const</span><span class="pln"> myBirthday </span><span class="pun">=</span><span class="pln"> </span><span class="str">'18.0401982'</span><span class="pun">;</span><span class="pln">
myBirthday </span><span class="pun">=</span><span class="pln"> </span><span class="str">'01.01.2001'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// خطأ! لا يمكن إعادة إسناد قيمة لثابت</span></pre>

<p>
	يستخدم المبرمج الثابت عندما يكون متأكدًا أن قيمة المتغير لن تتبدل أو لا يجب أن تتبدل ضمن البرنامج، ويصرح عنه باستخدام <code>const</code>. أما الفائدة من ذلك فهي ضمان والتحقق من وصول هذه الحقيقة إلى الجميع.
</p>

<h3 id="-">
	متى تستخدم الأحرف الكبيرة في تسمية الثوابت؟
</h3>

<p>
	هنالك عرف منتشر في استخدام الثوابت كأسماء مستعارة أو مرادفات للقيم صعبة الحفظ أو القيم العددية الثابتة المعروفة قبل التنفيذ. تسمى مثل هذه الثوابت باستخدام الأحرف الكبيرة والشرطة السفلية (_). كما في هذا المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_53" style="">
<span class="kwd">const</span><span class="pln"> COLOR_RED </span><span class="pun">=</span><span class="pln"> </span><span class="str">"#F00"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> COLOR_GREEN </span><span class="pun">=</span><span class="pln"> </span><span class="str">'#</span><span class="lit">0F0</span><span class="str">";</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> COLOR_BLUE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'#</span><span class="lit">00F</span><span class="str">";</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> COLOR_ORANGE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'#</span><span class="pln">FF7F00</span><span class="str">";</span><span class="pln">

</span><span class="com">// .. عندما نريد انتقاء لون</span><span class="pln">
let color </span><span class="pun">=</span><span class="pln"> COLOR_ORANGE</span><span class="pun">;</span><span class="pln">
alert</span><span class="pun">(</span><span class="pln">color</span><span class="pun">);</span><span class="pln"> </span><span class="com">// #FF7F00</span></pre>

<p>
	والفائدة من ذلك:
</p>

<ul>
<li>
		حفظ وتَذكُّر COLOR_ORANGE أسهل بكثير من "‎#FF7F00".
	</li>
	<li>
		احتمال ارتكاب خطأ بكتابة "‎#FF7F00" أكبر بكثير من كتابة COLOR_ORANGE.
	</li>
	<li>
		قراءة الاسم COLOR_ORANGE في الشيفرة البرمجية له معنًى جلي خلافًا لقراءة ‎#FF7F00.
	</li>
</ul>
<p>
	ربما تتساءل الآن وأنت في حيرة، متى تستخدم الأحرف الكبيرة لتسمية الثوابت ومتى نسميها بالشكل الاعتيادي؟ حسنًا، سنوضح ذلك الآن.
</p>

<p>
	عندما تصرِّح عن ثابت، فهذا يعني أن قيمة هذا المتغير لن تتبدل أبدًا. ولكن ميز بين نوعين من الثوابت: الأول هو الثوابت التي تكون قيمتها معروفة قبل التنفيذ (كما في المثال السابق، فالقيمة الست عشرية للون الأحمر معروفة سابقًا وثابتة). أما النوع الثاني، فهو الثوابت التي تحسب قيمتها أثناء عمل السكربت، وخلال التنفيذ، ولكنها لا تتغير بعد إسناد قيمة لها.
</p>

<p>
	مثال على ذلك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_55" style="">
<span class="kwd">const</span><span class="pln"> pageLoadTime </span><span class="pun">=</span><span class="pln"> </span><span class="com">/* الوقت الذي تستغرقه الصفحة للتحميل */</span><span class="pun">;</span></pre>

<p>
	قيمة الثابت <code>pageLoadTime</code> تكون غير معروفة قبل تحميل الصفحة، لذلك يتم تسمية الثابت بشكل عادي. ولكنه ثابت لأنَّ قيمته لا تتغير بعد إسنادها له.
</p>

<p>
	بمعنًى آخر، الثوابت المسماة بأحرف كبيرة تُستخدَم فقط كمرادفات للقيم صعبة الكتابة في الشيفرة البرمجية (hard-coded).
</p>

<h2 id="-">
	تسمية الأشياء تسميةً صحيحةً
</h2>

<p>
	بما أننا نتكلم عن المتغيرات، لابدّ أن نذكر أمرًا مهمًّا للغاية متعلق بتسمية المتغيرات. أرجوك أن تختار أسماء منطقية للمتغيرات، وأن تأخذ الوقت الكافي للتفكير بالأسماء المناسبة لها.
</p>

<p>
	لا تُعدُّ مهمة تسمية المتغيرات مهمةً بسيطةً، فهي واحدة من المهارات الأكثر أهمية وتعقيدًا في البرمجة. و بإمكانك بنظرة سريعة على أسماء المتغيرات المستخدمة في الشيفرة البرمجية معرفة مدى خبرة المطور الذي كتبه.
</p>

<p>
	في الواقع، وعند العمل على أي مشروع، فإن أغلب الوقت يمضي في تعديل وتوسيع الشيفرة البرمجية الموجودة بدلًا من كتابة شيفرة برمجية جديدة من الصفر. لذلك، عندما تعود إلى شيفرتك البرمجية بعد القيام بأشياء أخرى لفترة، يكون سهلًا بالنسبة إليك إيجاد المعلومات المسماة بشكل جيد. أو بمعنى آخر، عندما تملك المتغيرات أسماء جيدة.
</p>

<p>
	رجائي لك، مرةً أخرى، أن تمضي بعض الوقت في التفكير في الأسماء الصحيحة للمتغيرات قبل التصريح عنها. القيام بذلك سيعود عليك بالنفع بشكل رائع.
</p>

<p>
	وإليك بعض النصائح الجيدة لاتباعها في تسمية المتغيرات:
</p>

<ul>
<li>
		استخدم أسماء يمكن للآخرين قرائتها وفهمها مثل userName أو shoppingCart.
	</li>
	<li>
		ابتعد عن الاختصارات أو الأسماء القصيرة مثل a، أو b، أو c إلا إذا كان العمل واضحًا لك بشكل جيد.
	</li>
	<li>
		اجعل أسماء المتغيرات تصف محتواها ولكن لا تبالغ كثيرًا، بل حاول أن تكون مختصرة أيضًا. وكمثال عن الأسماء السيئة data و value. مثل هذه الأسماء لا تعبر عن أي شيء. ومن الممكن استخدامها فقط إذا كان سياق الشيفرة البرمجية، يوضح بشكل بديهي واستثنائي، أي بيانات أو قيم يشير إليها المتغير.
	</li>
	<li>
		اتفق على شروط معينة ضمن فريقك أو حتى مع نفسك في تسمية المتغيرات. فإذا كان اسم زائر الموقع هو user، فإن اسم المتغيرات المرتبطة به تكون أسماؤها currentUser أو newUser عوضًا عن currentVisitor أو NewManInTown.
	</li>
</ul>
<p>
	يبدو ذلك بسيطًا، أليس كذلك؟ بالتأكيد، إنها عملية بسيطة. ولكن اختيار أسماء جيدة ومختصرة ليس بالأمر السهل في الحياة العملية، ولكن ننصحك بإيلاء أسماء المتغيرات أهمية كبيرة واختيارها بعناية مطلقة.
</p>

<h2 id="-">
	هل تعيد استخدام المتغير أم تخلق متغيرًا جديدًا؟
</h2>

<p>
	أخيرًا وليس آخرًا، هناك بعض المبرمجين الكسالى الذين يفضلون إعادة استخدام المتغيرات الموجودة عوضًا عن خلق متغيرات جديدة. وبالنتيجة، تصبح متغيراتهم مثل الصناديق التي يرمي فيها الناس أشياء مختلفة من دون تغيير مسمياتهم. ماذا يوجد الآن داخل الصندوق؟ لا أحد يعلم. نحتاج إلى الاقتراب والتحقق من محتواه.
</p>

<p>
	قد يوفر هؤلاء المبرمجون بعض الوقت لعدم تصريحهم عن متغيرات جديدة. ولكنهم يخسرون عشرة أضعاف هذا الوقت عند استكشاف الأخطاء.
</p>

<p>
	المتغير الإضافي هو أمر جيد وليس سيء. وتعمل «مصغرات» (minifiers) لغة JavaScript الحالية والمتصفح على تحسين الشيفرة البرمجية بشكل جيد، وذلك لتفادي أية مشاكل في أدائها. كما أن استخدام المتغيرات المختلفة للقيم المختلفة يساعد المحرك أيضًا في تحسين شيفرتك البرمجية.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	بإمكاننا التصريح عن المتغيرات لتخزين البيانات باستخدام الكلمات المفتاحية <code>var</code>، أو <code>let</code>، أو <code>const</code>.
</p>

<ul>
<li>
		<code>let</code>: تستخدم للتصريح عن المتغيرات في النسخة الحالية. كما يجب استخدام الوضع الصارم (strict mode) لاستخدام <code>let</code> في V8.
	</li>
	<li>
		<code>var</code>: هي الطريقة التقليدية للتصريح عن المتغيرات. عادةً، لا نستخدم هذه الطريقة على الإطلاق، ولكن سنتعرف على الفروقات الدقيقة بينها وبين <code>let</code> في مقال <a href="https://academy.hsoub.com/programming/javascript/%D8%A5%D9%81%D8%A7%D8%AF%D8%A9-var-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r873/" rel="">إفادة var القديمة</a> وهذا أمر ضروري في حال اضطررت لاستخدامها.
	</li>
	<li>
		<code>const</code>: مثل <code>let</code>، ولكن قيمة المتغير لا يمكن تعديلها. كما يجب تسمية المتغيرات بطريقة تسمح لنا بفهم القيم المسندة إليها بسهولة.
	</li>
</ul>
<style type="text/css">
.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}</style>
<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	1. العمل مع المتغيرات
</h3>

<p class="task__importance">
	الأهمية: 2
</p>

<ol>
<li>
		صرّح عن المتغيرين: <code>admin</code> و <code>name</code>.
	</li>
	<li>
		أسند القيمة "John" إلى المتغير <code>name</code>.
	</li>
	<li>
		انسخ قيمة <code>name</code> إلى المتغير <code>admin</code>.
	</li>
	<li>
		اعرض قيمة المتغير <code>admin</code> باستخدام التنبيه alert (يجب أن يكون الخرج "John").
	</li>
</ol>
<p>
	<strong>الحل:</strong>
</p>

<div class="task__answer">
	<p>
		في الشيفرة البرمجية التالية، كل سطر يمثل أحد الأمور المطلوبة في قائمة المهام:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_69" style="">
<span class="pln">let admin</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">;</span><span class="pln"> </span><span class="com">// يمكننا التصريح عن متغيرين في الوقت نفسه</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mohammad"</span><span class="pun">;</span><span class="pln">
admin</span><span class="pun">=</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
alert </span><span class="pun">(</span><span class="pln">admin</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "Mohammad"</span></pre>
</div>

<h3 id="-">
	2. اختيار الأسماء المناسبة
</h3>

<p class="task__importance">
	الأهمية: 3
</p>

<ol>
<li>
		أنشئ متغيرًا وليكن اسمه كوكبنا (our planet). كيف يمكنك تسمية هذا المتغير؟
	</li>
	<li>
		أنشئ متغيرًا لتخزين اسم الزائر الحالي للموقع. كيف بإمكانك اختيار اسم هذا المتغير؟
	</li>
</ol>
<p>
	<strong>الحل</strong>:
</p>

<div class="task__answer">
	<p>
		أولًا: المتغير باسم كوكبنا، هذا أمر سهل:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_65" style="">
<span class="pln">let ourPlanetName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Earth"</span><span class="pun">;</span></pre>

	<p>
		لاحظ أنه بالإمكان استخدام اسم أقصر من ذلك مثل planet، ولكن ذلك قد لا يكون واضحًا بالشكل الكافي، أي كوكب نقصد؟ لذلك من الجيد أن تكون أكثر تفصيلًا. على الأقل عندما يكون اسم المتغير ليس طويلًا <code>isNotTooLong</code>.
	</p>

	<p>
		ثانيًا: اسم المتغير الذي يحوي بيانات الزائر الحالي للموقع:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_63" style="">
<span class="pln">let currnetUserName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">;</span></pre>

	<p>
		مرةً أخرى، بالإمكان اختصار هذا الاسم إلى username، إذا كنت متأكدًا أن هذا الزائر هو الزائر الحالي. المحررات الحالية فيها ميزة الإكمال التلقائي والتي تجعل من السهل كتابة أسماء المتغيرات الطويلة. لا تختصر في اختيار أسماء المتغيرات، فأي اسم يتألف من 3 كلمات هو أمر عادي ومقبول. وإذا كانت ميزة الإكمال التلقائي في محررك سيئة أو غير مناسبة، لا تتردد في تغييره.
	</p>
</div>

<h3 id="-">
	3. الثوابت بالأحرف الكبيرة؟
</h3>

<p class="task__importance">
	الأهمية: 4
</p>

<p>
	تفحص الشيفرة البرمجية التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_61" style="">
<span class="kwd">const</span><span class="pln"> birthday </span><span class="pun">=</span><span class="pln"> </span><span class="str">'18.04.1982'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> someCode</span><span class="pun">(</span><span class="pln">birthday</span><span class="pun">);</span></pre>

<p>
	هنا لدينا الثابت <code>birthday</code> الذي يحوي تاريخًا والثابت <code>age</code> الذي سيُحسَب من <code>birthday</code> عن طريق الشيفرة البرمجية <code>someCode</code> (لم يتم كتابتها للاختصار، ولأن هذه التفاصيل غير مهمة الآن).
</p>

<p>
	هل يكون صحيحًا استخدام الأحرف الكبيرة لتسمية الثابت <code>birthday</code> أو الثابت <code>age</code> أو كلاهما؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8826_59" style="">
<span class="kwd">const</span><span class="pln"> BIRTHDAY   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'18.04.1982'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// هل يُكتَب اسم المتغير بالأحرف الكبيرة؟</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> AGE </span><span class="pun">=</span><span class="pln"> someCode</span><span class="pun">(</span><span class="pln">BIRTHDAY</span><span class="pun">);</span><span class="pln"> </span><span class="com">// هل يُكتَب اسم المتغير بالأحرف الكبيرة؟</span></pre>

<p>
	<strong>الحل</strong>:
</p>

<div class="task__answer">
	<p>
		نستخدم عادةً الأحرف الكبيرة لتسمية الثوابت كمرادفات للقيم صعبة الكتابة في الشيفرة البرمجية (hard-coded). أو بمعنى آخر، عندما تكون قيمة الثابت معروفة قبل التنفيذ ومكتوبة بشكل مباشر في الشيفرة البرمجية.
	</p>

	<p>
		في هذه الشيفرة البرمجية، يمثل الثابت <code>birthday</code> هذه الحالة تمامًا. لذلك نستطيع تسميته بأحرف كبيرة. وبشكل معاكس، فإن الثابت <code>age</code> يُحسَب أثناء عمل السكربت، اليوم يكون لنا عمر معين ولكن يختلف عمرنا في السنة القادمة، هو ثابت من ناحية عدم تغير قيمته أثناء تنفيذ الشيفرة البرمجية ولكنه أقل ثباتًا من الثابت <code>birthday</code>. وبما أننا نقوم بحسابه، لذلك يفضل إبقاء اسمه بالأحرف الصغيرة.
	</p>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/variables" rel="external nofollow">Variables</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r672/" rel="">أنواع البيانات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B5%D8%A7%D8%B1%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%B7-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-r670/" rel="">الوضع الصارم: النمط الحديث لكتابة الشيفرات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">671</guid><pubDate>Mon, 27 May 2019 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x648;&#x636;&#x639; &#x627;&#x644;&#x635;&#x627;&#x631;&#x645;: &#x627;&#x644;&#x646;&#x645;&#x637; &#x627;&#x644;&#x62D;&#x62F;&#x64A;&#x62B; &#x644;&#x643;&#x62A;&#x627;&#x628;&#x629; &#x634;&#x64A;&#x641;&#x631;&#x627;&#x62A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B5%D8%A7%D8%B1%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%B7-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r670/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/6.jpg.3fbccd3c43b0deda9eae22398748180c.jpg" /></p>

<p>
	تطورت لغة JavaScript خلال فترة طويلة دون أي مشاكل في التوافق. وجرى التحقق من استمرار عمل جميع وظائفها في كل مرة تضاف إليها خصائص جديدة.
</p>

<p>
	وكان لذلك فائدة كبيرة في استمرار عمل الشيفرات البرمجية الموجودة دون تعطلها. ولكن كان له ناحية سلبية أيضًا، هي أنّ الأخطاء والخصائص التي أضافها مطورو اللغة بقيت مع اللغة إلى الأبد.
</p>

<p>
	واستمرت هذا الحال حتى ظهور ECMAScript 5 (اختصارًا ES5) في عام 2009. التي أضافت خصائص جديدة إلى اللغة وعدّلت على بعض الخصائص الموجودة سابقًا. ولضمان استمرار عمل الشيفرات البرمجية السابقة، فإنّ معظم هذه التعديلات كانت غير فعّالة بشكل افتراضي؛ ولاستخدامها، عليك تفعيلها بشكل صريح باستخدام الموجه الخاص: <code>"use strict"</code>.
</p>

<h2 id="-use-strict-">
	الموجه "use strict"
</h2>

<p>
	يبدو الموجه كسلسلة نصية: <code>"use-strict"</code> أو <code>'use strict'</code>. وعندما يوضع في بداية السكربت، يُنفَّذ السكربت وفق الطريقة والمعايير الحديثة.
</p>

<p>
	إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1563_6" style="">
<span class="str">"use strict"</span><span class="pun">;</span><span class="pln">
</span><span class="com">//هذه الشيفرة البرمجية تعمل في الوضع الصارم</span><span class="pln">
</span><span class="pun">…</span></pre>

<p>
	قريبًا، سندرس الدوال (طريقة لجمع الأوامر). ولكن في نطرة استباقية للموضوع، لاحظ أنه بالإمكان وضع <code>"use strict"</code> في بداية معظم أنواع الدوال عوضًا عن كامل السكربت. وبذلك يتم تفعيل الوضع الصارم (strict mode) ضمن الدوال فقط. لكن عادةً يستخدم المبرمجون هذا الوضع لكامل السكربت.
</p>

<p>
	تأكد من وضع <code>"use script"</code> في بداية السكربتات، وإلا فإنه من الممكن ألا يُفعَّل الوضع الصارم. فمثلًا، الوضع الصارم غير مفعّل في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1563_8" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"some code"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// إن لم يُستعمَل في أول سطر "use strict" سيجري تجاهل الموجه</span><span class="pln">
</span><span class="str">"use strict"</span><span class="pln">
</span><span class="com">// الوضع الصارم غير مُفعَّل</span></pre>

<p>
	بإمكانك كتابة التعليقات فقط قبل استخدام الموجه <code>"use strict"</code>. لاحظ أيضًا أنه ليس هناك طريقة لإلغاء <code>"use strict"</code>، أي لا يوجد موجه آخر مثل <code>"no use strict"</code> والذي يثني المحرك عن عمله ويلغي تفعيل الوضع الصارم. لذلك عند بدء استخدام الوضع الصارم، لا توجد طريقة لإلغائه والعودة إلى الوضع الافتراضي.
</p>

<h2 id="-">
	طرفية المتصفح
</h2>

<p>
	أبقِ في ذهنك أن طرفية المتصفح (console) لا تستخدم الوضع الصارم لاختبار وتنفيذ الشيفرات المكتوبة فيها؛ أي أنها لا تستخدم <code>"use strict"</code> افتراضيًا.
</p>

<p>
	عندما يوجد هناك اختلاف بين <code>"use strict"</code> والنمط الافتراضي في بعض الأحيان، قد تحصل على ناتج خطأ. ولن تنجح محاولتك في تفعيل الوضع الصارم (strict) بالضغط على الاختصار Shift+Enter لإدخال عدة أسطر، ثم استخدام <code>"use strict"</code> في البداية وذلك بسبب طريقة معالجة الطرفية للشيفرة البرمجية داخليًا.
</p>

<p>
	الطريقة الأفضل للتأكد من عمل <code>"use strict"</code> هو كتابة الشيفرة البرمجية ضمن الطرفية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1563_10" style="">
<span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="str">'use strict'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// … ضع شيفرتك هنا …</span><span class="pln">
</span><span class="pun">})()</span></pre>

<h2 id="-use-strict-">
	استخدم "use strict" دومًا
</h2>

<p>
	سنتعلم لاحقًا الاختلافات بين الوضع الصارم والوضع الافتراضي الذي تعمل ضمنه الشيفرات. ففي الفصل القادم، ستلاحظ الاختلافات بين هذين الوضعين أثناء تعلمك للخصائص الجديدة. من الجيد أنه لا يوجد الكثير من هذه الاختلافات، وفي حال وجودها فهي لتحسين عمل الشيفرة البرمجية. ولكن في الوقت الحالي تكفي معرفتك بهذه الأمور العامة:
</p>

<ol>
<li>
		الموجه <code>"use strict"</code> يحول المحرك إلى النمط الحديث (modern)، مما يغير من طريقة تعامله مع بعض الخصائص الموجودة سابقًا. سندرس ذلك بالتفصيل في الأجزاء القادمة من هذه السلسلة التعليمية.
	</li>
	<li>
		يتم تفعيل الوضع الصارم بوضع الموجه <code>"use strict"</code> في بداية السكربت أو الدالة. العديد من خصائص اللغة، مثل الأصناف (classes) والوحدات (modules)، ُتفعِّل الوضع الصارم (strict) تلقائيًا.
	</li>
	<li>
		الوضع الصارم (strict) مدعوم من قبل جميع المتصفحات الحالية.
	</li>
	<li>
		أنصحك دائمًا بوضع <code>"use strict"</code> في بداية السكربت. جميع الأمثلة في هذه السلسلة التعليمية تفترض العمل ضمن الوضع الصارم إلا إذا ذُكر غير ذلك وهذا في بعض الحالات النادرة.
	</li>
</ol>
<p>
	ترجمة -وبتصرف- للفصل <a data-ss1625560004="1" data-ss1625560446="1" data-ss1625560490="1" href="https://javascript.info/use-strict" rel="external nofollow">"Modern mode, "use strict</a> من كتاب <a data-ss1625560004="1" data-ss1625560446="1" data-ss1625560490="1" href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a data-ss1625560004="1" data-ss1625560446="1" data-ss1625560490="1" href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-r671/" rel="">المتغيرات</a>
	</li>
	<li>
		المقال السابق: <a data-ss1625560004="1" data-ss1625560446="1" data-ss1625560490="1" href="https://academy.hsoub.com/programming/javascript/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r669/" rel="">بنية الشيفرة البرمجية</a>
	</li>
	<li>
		<a data-ss1625560004="1" data-ss1625560446="1" data-ss1625560490="1" href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">670</guid><pubDate>Thu, 23 May 2019 13:04:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x634;&#x64A;&#x641;&#x631;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r669/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5.jpg.f11739689246986af5dfb1aa6f6f14e2.jpg" /></p>

<p>
	في هذا المقال، سنبدأ بتعلم أساسيات كتابة الشيفرة البرمجية في لغة JavaScript. هل أنت مستعد؟ لننطلق!
</p>

<p>
	 
</p>

<h2 id="-">
	التعابير البرمجية
</h2>

<p>
	التعابير البرمجية هي صياغة التراكيب والأوامر التي تنفذ الأعمال في السكربت. رأيت سابقًا التعبير البرمجي <code>alert('Hello, world!')‎</code> الذي يُظهر الرسالة "Hello, world!‎".
</p>

<p>
	بإمكانك استخدام تعابير بقدر ما تريد في شيفرتك البرمجية. ويمكن فصل التعابير البرمجية عن بعضها بالفاصلة المنقوطة (<code>;</code>).
</p>

<p>
	مثلًا، بإمكاننا فصل "Hello World" إلى تنبيهين منفصلين بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_6" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">'Hello'</span><span class="pun">);</span><span class="pln"> alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span></pre>

<p>
	تُكتَب التعابير البرمجية عادةً على أسطر منفصلة لتسهيل قراءة الشيفرة البرمجية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_8" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">'Hello'</span><span class="pun">);</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span></pre>

<h2>
	الفاصلة المنقوطة
</h2>

<p>
	يمكن حذف الفاصلة المنقوطة من آخر التعابير البرمجية في معظم الحالات عند الانتقال إلى سطر جديد. أي أن الشيفرة البرمجية التالية ستعمل أيضًا بشكل صحيح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_10" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">'Hello'</span><span class="pun">)</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">)</span></pre>

<p>
	تُفسِّر لغة JavaScript الانتقال إلى سطر جديد بفاصلة منقوطة (ضمنيًا). وهذا ما يُسمى (الاضافة التلقائية للفاصلة المنقوطة [Automatic semicolon insertion]).
</p>

<p>
	<strong>في معظم الحالات، يتضمن السطر جديد فاصلةً منقوطةً افتراضية في آخره ولكن هذا لا يشمل جميع الحالات.</strong> هناك حالات لا يحوي فيها السطر الجديد بالضرورة فاصلةً منقوطةً افتراضية. إليك مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_12" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="lit">3</span><span class="pun">+</span><span class="pln">
</span><span class="lit">1</span><span class="pln">
</span><span class="pun">+</span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	خرج الشيفرة البرمجية السابقة هو 6 لأنَّ لغة JavaScript لا تضيف الفاصلة المنقوطة في هذه الحالة. فمن البديهي أنه عند انتهاء السطر بإشارة "+" يكون التعبير ناقصًا (incomplete expression)، وبالتالي لا يتطلب وجود فاصلة منقوطة. لذلك، تعمل الشيفرة البرمجية كما هو مطلوب.
</p>

<p>
	لا تعتمد دائمًا على JavaScript لإضافة الفاصلة المنقوطة لأنه <strong>توجد حالات تفشل فيها لغة JavaScript بإضافة الفاصلة المنقوطة عندما تكون مطلوبة</strong>. والأخطاء التي تحدث نتيجة هذه الحالات صعبة الإيجاد والإصلاح (ستكتشف ذلك قريبًا خلال الشيفرات التي ستكتبها).
</p>

<p>
	إذا كنت ترغب في الاطلاع على مثال واقعي عن هذه الحالة، إليك الشيفرة البرمجية التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_14" style="">
<span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">].</span><span class="pln">foreach</span><span class="pun">(</span><span class="pln">alert</span><span class="pun">)</span></pre>

<p>
	لا تقلق إن كانت هذه الشيفرة صعبة الفهم عليك، فليس هناك حاجة الآن لفهم معنى الأقواس المعقوفة <code>[]</code> أو التعبير البرمجي <code>forEach</code>، فسندرسهم لاحقًا. ولكن أبقِ في ذهنك أن خرج هذه الشيفرة البرمجية هو إظهار 1 ثم 2.
</p>

<p>
	سنضيف الآن تنبيهًا (alert) قبل الشيفرة البرمجية السابقة دون وضع الفاصلة المنقوطة في نهاية العبارة البرمجية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_16" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"There will be an error"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">,</span><span class="lit">2</span><span class="pun">].</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">alert</span><span class="pun">)</span></pre>

<p>
	عند تنفيذ الشيفرة البرمجية آنذاك، سيتم إظهار التنبيه الأول فقط ثم سنحصل على خطأ. تعود الشيفرة البرمجية للعمل بشكل صحيح مرة أخرى عند إضافة الفاصلة المنقوطة بعد التنبيه الأول:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_18" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"All fine now"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">,</span><span class="lit">2</span><span class="pun">].</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">alert</span><span class="pun">)</span></pre>

<p>
	تظهر لدينا الآن الرسالة "All fine now"، ثم 1 و 2. الخطأ الذي حدث في الحالة الأولى (حالة عدم إضافة الفاصلة المنقوطة) سببه أنَّ لغة JavaScript لا تضيف الفاصلة المنقوطة تلقائيًا عند الانتقال إلى سطر جديد في حال وجود الأقواس المعقوفة <code>[…]</code> في بداية هذا السطر. وبالتالي لن تُضاف الفاصلة المنقوطة تلقائيًا في الحالة الأولى وسيتم التعامل مع الشيفرة البرمجية كعبارة برمجية واحدة. أي سيراها المحرك بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_20" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"There will be an error"</span><span class="pun">)[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">].</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">alert</span><span class="pun">)</span></pre>

<p>
	ولكنهما عبارتين برمجيتين منفصلتين وليستا عبارة واحدة، وبالتالي عملية الدمج في هذه الحالة خطأ. من الممكن أن تتكرر هذه الحالة ضمن شروط أخرى.
</p>

<p>
	بناءً على ما سبق، ننصحك بإضافة الفاصلة المنقوطة بين التعابير البرمجيَّة حتى لو قمت بفصلها بأسطر جديدة. وهذه هي القاعدة الأكثر اتباعًا بين مستخدمي JavaScript. لنراجع سويةً ما ذُكر سابقًا، من الممكن الاستغناء عن الفاصلة المنقوطة في معظم الحالات، ولكن من الأفضل إضافتها في آخر العبارة البرمجية - وخاصةً بالنسبة للمبتدئين - تجنبًا للوقوع في أخطاء عصية التنقيح والتصحيح أنت بغنًى عنها.
</p>

<h2 id="-">
	التعليقات
</h2>

<p>
	تصبح البرامج أكثر تعقيدًا مع مرور الوقت. ويكون ضروريًا إضافة التعليقات لشرح عمل الشيفرة البرمجية. يمكن وضع التعليقات في أي مكان ضمن السكربت دون أن تؤثر على تنفيذه، لأنَّ المحرك ببساطة يتجاهل جميع التعليقات.
</p>

<p>
	<strong>التعليقات المكتوبة على سطر واحد تبدأ بخطين مائلين (forward slash) بالشكل <code>//</code></strong>. ويكون الجزء التالي للخطين المائلين على نفس السطر تعليقًا. ومن الممكن أن يشغل التعليق سطرًا كاملًا أو يأتي التعليق بعد العبارة البرمجية.
</p>

<p>
	إليك المثال التالي الذي يشرح ما سبق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_22" style="">
<span class="com">// يمتد هذا التعليق على كامل السطر فقط</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'Hello'</span><span class="pun">);</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// هذا تعليق يلي تعبيرًا برمجيًّا</span></pre>

<p>
	<strong>وإن أردت كتابة تعليقات تمتد على عدَّة أسطر، فابدأ التعليق متعدد الأسطر بخط مائل يليه رمز النجمة (أي <code>‎/*‎</code>) ، وأنهِ التعليق برمز النجمة ثم الخط المائل (أي <code>‎*/‎</code>) </strong>. إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_24" style="">
<span class="com">/* يُظهر هذا المثال تنبيهين
وهذا التعليق متعدد
الأسطر
*/</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'Hello'</span><span class="pun">);</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span></pre>

<p>
	يجري تجاهل كل ما يقع داخل التعليق متعدد الأسطر، وبالتالي لا تُنفَّذ أية شيفرة برمجية موجودة داخل <code>/*…*/</code>.
</p>

<p>
	أحيانًا، يكون من المفيد إلغاء تفعيل جزء من الشيفرة البرمجية مؤقتًا أثناء تنقيح الأخطاء:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_26" style="">
<span class="com">/* تعليق جزء من الشيفرة
alert('Hello');
*/</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span></pre>

<h3 id="-">
	استخدام الاختصارات
</h3>

<p>
	من الممكن تعليق سطر واحد من الشيفرة البرمجية بالضغط على الاختصار Ctrl+/‎ في معظم المُحرِّرات وبيئات التطوير. ومن أجل التعليقات متعددة الأسطر من الممكن استخدام الاختصار Ctrl+Shift+/، (عليك أن تحدد جزءًا من الشيفرة البرمجية ثم الضغط على الاختصار). في الأجهزة التي تعمل على الماك، جرّب Cmd عوضًا عن Ctrl.
</p>

<p>
	<strong>تحذير:</strong> التعليقات المتداخلة متعددة الأسطر غير مدعومة. أي لا يمكنك وضع <code>/*…*/</code> داخل <code>/*…*/</code> آخر، إذ ستنتهي هذه الشيفرة البرمجية بخطأ:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4479_28" style="">
<span class="com">/*
التعليق الخارجي
            /*تعليق متشعب*/</span><span class="pln">
</span><span class="pun">لاحظ</span><span class="pln"> </span><span class="pun">لوني</span><span class="pln"> </span><span class="pun">الأسود</span><span class="pln">
</span><span class="pun">*/</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'World'</span><span class="pun">);</span></pre>

<p>
	لا تتردد أبدًا في وضع التعليقات ضمن شيفرتك البرمجية وشرح ما الذي يجري فيها لأنك عندما تعود إليها لاحقًا، ستجد غالبًا أنك نسيت وظيفة كل جزء من شيفرتك.
</p>

<p>
	قد تزيد التعليقات من حجم الشيفرة ولكن هذه ليست بمشكلة. هناك العديد من الأدوات التي تُقلِّص الشيفرة البرمجية قبل نشرها على خادم الإنتاج، إذ تَحذِف التعليقات من السكربت نهائيًّا ولا يبقَ لها بذلك أي أثر. في تلك الحالة، لا يكون للتعليقات أي آثار سلبية عند الإنتاج. لا تقلق مرة أخرى إن لم تتضح لك الصورة ولم تفهم بعض المصطلحات (مثل ما الذي يقصد بالإنتاج) فكل شيء سيتضح تدريجيًّا.
</p>

<p>
	لاحقًا في هذه السلسلة التعليمية، سيكون هناك فصل عن جودة الشيفرة البرمجية والذي يشرح طريقة كتابة التعليقات بشكل أفضل.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/structure" rel="external nofollow">Code structure</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B5%D8%A7%D8%B1%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%B7-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-r670/" rel="">الوضع الصارم: النمط الحديث لكتابة الشيفرات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A3%D9%87%D9%84%D9%8B%D8%A7-%D8%A8%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85-r668/" rel="">المثال الأول: أهلًا بالعالم!</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">669</guid><pubDate>Mon, 20 May 2019 18:01:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62B;&#x627;&#x644; &#x627;&#x644;&#x623;&#x648;&#x644;: &#x623;&#x647;&#x644;&#x64B;&#x627; &#x628;&#x627;&#x644;&#x639;&#x627;&#x644;&#x645;!</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A3%D9%87%D9%84%D9%8B%D8%A7-%D8%A8%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85-r668/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/4.jpg.556fd1d9f508d6e1bbaaee7dce8b2d52.jpg" /></p>

<p>
	أبقِ في ذهنك أنَ هذه السلسلة التعليمية هي عن أساس لغة جافاسكربت (core JavaScript) المستقلة عن أي منصة. سنتعرف لاحقًا على <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.JS</a> والمنصات التي تستخدمها.
</p>

<p>
	الآن، نحن بحاجة إلى بيئة للعمل وتشغيل السكربتات التي سنكتبها، ويبدو المتصفح خيارًا جيدًا بما أنك تتابع هذه السلسلة التعليمية عبر الإنترنت. سنقلل من استعمال التعليمات التي تعمل فقط على المتصفح (مثل alert) لكي لا يضيع مجهودك بالتركيز عليها خاصةً إن كنت تنوي العمل في بيئة أخرى (مثل <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.JS</a>). وسنركِّز على لغة JavaScript ضمن المتصفح في الجزء القادم من هذه السلسلة التعليمية.
</p>

<p>
	في البداية، سنتعرَّف على طريقة إضافة السكربت إلى صفحة الويب. من أجل البيئات التي تعمل على الخادم (مثل <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.JS</a>)، بإمكانك تنفيذ السكربت عن طريق أمرٍ مثل <code>node my.js</code>.
</p>

<p>
	 
</p>

<h2 id="-script-">
	الوسم <code>&lt;script&gt;</code>
</h2>

<p>
	من الممكن تضمين برامج لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> في أي جزء من مستند <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> باستخدام الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a>.</code> على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_7" style="">
<span class="dec">&lt;!DOCTYPE HTML&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Before the script… </span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
    alert</span><span class="pun">(‘</span><span class="typ">Hello</span><span class="pun">,</span><span class="pln"> world</span><span class="pun">!’);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">...After the script.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	يحتوي الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> على شيفرة <a href="https://wiki.hsoub.com/HTML" rel="external">JavaScript</a> تُنفَّذ تلقائيًا عندما يعالج المتصفح الوسم.
</p>

<h2 id="-">
	الترميز الحالي
</h2>

<p>
	يملك الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> عددًا من الخاصيات، ونادرًا ما يتم استخدامها الآن، ولكن ما زال بإمكانك رؤيتها في الشيفرات البرمجية القديمة.
</p>

<h3 id="-type-">
	الخاصية <code>type</code>
</h3>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_9" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">...</span><span class="tag">&gt;</span></pre>

<p>
	تتطلب معايير لغة HTML القديمة، HTML4، إسناد قيمة للخاصية <code>type</code> في الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code>، وعادةً ما تكون <code>type="text/javascript"‎</code>، لكن هذا الأمر لم يعد ضروريًا. كما أنَ معنى هذه الخاصية تغيَر بشكل كامل وفق معايير لغة HTML بنسختها الحالية، HTML5. وأصبحت تستخدم مع وحدات (modules) لغة JavaScript. ولكنه موضوع متقدم سنتحدث عنه لاحقًا في جزء آخر من هذه السلسلة التعليمية.
</p>

<h3 id="-language-">
	الخاصية <code>language</code>
</h3>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_11" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">language</span><span class="pun">=</span><span class="atv">...</span><span class="tag">&gt;</span></pre>

<p>
	تُستخدَم هذه الخاصية لتحديد اللغة المكتوب بها السكربت، ولكنها لم تعد مهمة الآن، لأن لغة JavaScript أصبحت هي اللغة الافتراضية، ولم تعد هناك حاجة لاستخدام هذه الخاصيَّة.
</p>

<h3 id="-">
	التعليقات قبل وبعد السكربتات
</h3>

<p>
	من الممكن أن تجد تعليقات ضمن الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> في كتب ومراجع لغة JavaScript القديمة، مثل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_13" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">”text/javascript”</span><span class="tag">&gt;</span><span class="pun">&lt;!--</span><span class="pln">
    </span><span class="pun">…</span><span class="pln">
</span><span class="com">//--&gt;</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	تعمل هذه التعليقات على إخفاء الشيفرة البرمجية عن المتصفحات القديمة والتي لا تعرف معالجة الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> ولم تعد مستخدمة في لغة JavaScript بنسختها الحالية. وبما أن نسخ المتصفحات في السنوات الخمسة عشر الماضية لا تملك هذه المشكلة، فإنً هذا النوع من التعليقات يمكًنك من تحديد الشيفرات البرمجية القديمة للغة JavaScript.
</p>

<h2 id="-script-">
	ما هو الاستعمال الحديث للعنصر <code>&lt;script&gt;</code>؟
</h2>

<p>
	عندما تكون الشيفرة البرمجية للغة JavaScript طويلة، قد ترغب في وضعها في ملف مستقل. ويتم ربط ملف السكربت إلى HTML عن طريق الخاصية <code>src</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9075_15" style="">
<span class="pun">&lt;</span><span class="pln">script src</span><span class="pun">=”/</span><span class="pln">path</span><span class="pun">/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">script</span><span class="pun">.</span><span class="pln">js</span><span class="pun">”&gt;&lt;/</span><span class="pln">script</span><span class="pun">&gt;</span></pre>

<p>
	هنا المسار <code>path/to/script.js/</code> هو المسار الكامل لملف السكربت (ابتداءً من جذر الموقع).
</p>

<p>
	بإمكانك أيضًا إدخال المسار نسبةً للصفحة الحالية. مثلًا، المسار (<code>"src="script.js</code>) معناه أنً الملف script.js موجود في نفس المجلد الذي توجد فيه الصفحة.
</p>

<p>
	بالإمكان أيضًا استخدام عنوان الموقع كاملًا، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9075_17" style="">
<span class="pun">&lt;</span><span class="pln">script src</span><span class="pun">=”</span><span class="pln">https</span><span class="pun">:</span><span class="com">//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js”&gt;&lt;/script&gt;</span></pre>

<p>
	وإن أردت ربط عدة سكربتات مع نفس الصفحة، فاستخدم الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> لكل سكربت على حدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9075_19" style="">
<span class="pun">&lt;</span><span class="pln">script src</span><span class="pun">=”/</span><span class="pln">js</span><span class="pun">/</span><span class="pln">script1</span><span class="pun">.</span><span class="pln">js</span><span class="pun">”&gt;&lt;/</span><span class="pln">script</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="pln">script src</span><span class="pun">=”/</span><span class="pln">js</span><span class="pun">/</span><span class="pln">script2</span><span class="pun">.</span><span class="pln">js</span><span class="pun">”&gt;&lt;/</span><span class="pln">script</span><span class="pun">&gt;</span></pre>

<p>
	<strong>ملاحظة:</strong> يمكنك العمل بالقاعدة التالية، «السكربتات البسيطة فقط تُضمَّن مع HTML والسكربتات الأكثر تعقيدًا تُكتَب في ملفات مستقلة». والفائدة من وجود ملف مستقل هي امكانية تنزيل المتصفح لهذا السكربت مرة واحدة وتخزينه في ذاكرة مؤقتة (cache). وبذلك، تتمكن الصفحات الأخرى <em>المرتبطة بنفس السكربت</em> من طلبه وجلبه من الذاكرة المؤقتة عوضًا عن تنزيله مرةً أخرى. وبذلك يتم فعليًا تنزيله مرة واحدة، مما يقلل حركة البيانات عبر الإنترنت ويُسرِّع تحميل ومعالجة صفحات الويب.
</p>

<p>
	<strong>تحذير:</strong> انتبه إلى أنه يجري تجاهل السكربت المكتوب ضمن الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> في حال ربطه مع ملف مستقل أي عند إسناد قيمة أو مسار معين للخاصية <code>src</code>. بعبارة أخرى، ليس بإمكان الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> أن يُنفِّذ شيفرتين برمجيَّتين في آن واحد: شيفرة قادمة من الخاصية <code>src</code> وشيفرة برمجية مكتوبة بداخله.
</p>

<p>
	فمثلًا، لن تُنفَّذ التعليمة البرمجية <code>alert(1)‎</code> المكتوبة ضمن الوسم في هذا المثال:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_21" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">”file.js”</span><span class="tag">&gt;</span><span class="pln">
    alert</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">  </span><span class="com">// src سيجري تجاهل أي محتوى مكتوب ضمن الوسم بسبب ضبط الخاصية</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	يجب أن تختار أحد الأمرين: ملف خارجي مستقل للسكربت <code>&lt;script src="..."‎&gt;</code>، أو وسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> عادي يحوي ضمنه على الشيفرة البرمجية المراد تنفيذها.
</p>

<p>
	بالإمكان فصل السكربت في المثال السابق إلى وسمين <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> منفصلين ليعمل بشكل صحيح:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9075_23" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">”file.js”</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;script&gt;</span><span class="pln">
    alert</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<h2 id="-">
	الخلاصة
</h2>

<ul>
<li>
		نستخدم الوسم <code><a href="http://wiki.hsoub.com/HTML/script)" rel="external">&lt;script&gt;</a></code> لتضمين الشيفرة البرمجية للغة JavaScript في صفحة الويب.
	</li>
	<li>
		في الوقت الحالي، لم نعد نستعمل الخاصيتين <code>type</code> و <code>language</code>.
	</li>
	<li>
		يمكن ربط السكربت الموجود في ملف خارجي باستخدام الخاصية <code>src</code>.
	</li>
</ul>
<p>
	هنالك الكثير لتعلمه عن السكربتات الممكن تنفيذها في المتصفح وتأثيرها على صفحات الويب. ولكن أبقِ في ذهنك أن هذا الجزء من السلسلة التعليمية يُركِّز على لغة JavaScript ويجب ألا نشوش أنفسنها بالتركيز على معايير تنفيذ السكربتات ضمن كل متصفح بشكل خاص. سنستخدم المتصفح وسيلةً لتنفيذ سكربتات JavaScript لأنه مناسب في حالتنا للتعلم عن طريق الإنترنت، ولكنه إحدى الطرق الكثيرة لتشغيل JavaScript.
</p>

<h2 id="-">
	تمارين
</h2>

<h3 id="-">
	1. إظهار تنبيه
</h3>
<style type="text/css">
.task__importance {
    color: #999;
    margin-left: 30px;
}

.task__answer {
    border: 3px solid #f7f6ea;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}</style>
<p class="task__importance">
	الأهمية: 5
</p>

<p>
	أنشئ صفحةً تُظهِر الرسالة "I`m JavaScript".
</p>

<p>
	بإمكانك تنفيذها في صفحة تجريبية (sandbox)، أو على قرصك الصلب. لا يهم ولكن تأكد من أنها تعمل بالشكل الصحيح. بعد كتابة شيفرتك، نفِّذها ثم تأكد من الإجابة المرفقة.
</p>

<p class="task__solution">
	<strong>الحل:</strong>
</p>

<div class="task__answer">
	<ul>
<li>
			<a href="https://en.js.cx/task/hello-alert/solution/" rel="external nofollow">عرض توضيحي</a>
		</li>
		<li>
			<a href="https://plnkr.co/edit/s7BD6a896UDlRmCiPEDR?p=preview" rel="external nofollow">فتح الحل في بيئة تجريبية حية</a>
		</li>
	</ul>
</div>

<h3 id="-">
	2. إظهار تنبيه باستخدام سكربت خارجي
</h3>

<p class="task__importance">
	الأهمية: 5
</p>

<p>
	استخدم الحل في التمرين السابق (إظهار تنبيه)، وعدله لاستخراج الشيفرة البرمجية المراد تنفيذها إلى سكربت خارجي باسم "alert.js" موجود في نفس المجلد. افتح الصفحة وتأكد من عمل التنبيه.
</p>

<p class="task__solution">
	<strong>الحل:</strong>
</p>

<div class="task__answer">
	<p>
		الشيفرة البرمجية لمستند HTML:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5397_6" style="">
<span class="pun">&lt;!</span><span class="pln">DOCTYPE html</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;</span><span class="pln">html</span><span class="pun">&gt;</span><span class="pln">

</span><span class="pun">&lt;</span><span class="pln">body</span><span class="pun">&gt;</span><span class="pln">

  </span><span class="pun">&lt;</span><span class="pln">script src</span><span class="pun">=</span><span class="str">"alert.js"</span><span class="pun">&gt;&lt;/</span><span class="pln">script</span><span class="pun">&gt;</span><span class="pln">

</span><span class="pun">&lt;/</span><span class="pln">body</span><span class="pun">&gt;</span><span class="pln">

</span><span class="pun">&lt;/</span><span class="pln">html</span><span class="pun">&gt;</span></pre>

	<p>
		ويحتوي الملف <code>alert.js</code> في نفس المجلد على الشيفرة البرمجية التالية:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5397_8" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"I'm JavaScript!"</span><span class="pun">);</span></pre>

	<p>
		 
	</p>
</div>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/hello-world" rel="external nofollow">!Hello, world</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r669/" rel="">بنية الشيفرة البرمجية</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AD%D8%B1%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r666/" rel="">محررات الشيفرة البرمجية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">668</guid><pubDate>Thu, 16 May 2019 13:00:00 +0000</pubDate></item><item><title>&#x625;&#x62C;&#x631;&#x627;&#x621; &#x62A;&#x639;&#x62F;&#x64A;&#x644;&#x627;&#x62A; &#x639;&#x644;&#x649; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%AA%D8%B9%D8%AF%D9%8A%D9%84%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-dom-r667/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_05/dom.png.e90daff30fdf054a11dec4ea04b77750.png" /></p>

<p>
	تحدثنا في مقالتين سابقتين عن <a href="https://academy.hsoub.com/programming/javascript/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-dom-r647/" rel="">طريقة الوصول إلى العناصر في DOM</a> و <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D8%A8%D9%8A%D9%86-%D8%B9%D9%82%D8%AF-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r648/" rel="">التنقل بين عقد شجرة DOM</a> وتعلمنا كيف يستطيع مطورو الويب استخدام الأصناف، والوسم، والمعرفات لإيجاد عقدة في DOM بالإضافة إلى استخدام خصائص القرابة بين هذه العقد للتنقل فيما بينها بهدف الوصول في النهاية إلى العقدة المطلوبة.
</p>

<p>
	الخطوة التالية الآن ستكون احترافية بشكل أكبر حيث سنتعلم طريقة إضافة، وتغيير، واستبدال، وإزالة العقد من DOM. وسنتدرّب على ذلك عبر برنامج قائمة مهام بسيط مع لغة <a href="https://academy.hsoub.com/programming/javascript/" rel="">جافاسكربت</a>.
</p>

<p>
	سنتعلم في هذه المقالة كيفية إنشاء العقد وإضافتها إلى DOM، واستبدال وإزالة عقد قديمة.
</p>

<h2 id="-">
	إنشاء عقد جديدة
</h2>

<p>
	في مواقع الويب الثابتة، يتم إضافة العناصر بشكل مباشر من خلال كتابة ملف HTML باللاحقة <code>‎.html</code> ولكن في تطبيقات الويب الديناميكية المتغيرة باستمرار، تُضَاف العناصر والنصوص بشكل آلي من خلال جافاسكربت باستخدام توابع مثل <code>createElement()‎</code> و <code>createTextNode()‎</code> التي تنشئ عقدة جديدة في DOM.
</p>

<p>
	 
</p>
<style type="text/css">
table {
    width: 100%;
}
td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table><tbody>
<tr>
<th>
				الخاصية / التابع
			</th>
			<th>
				التوصيف
			</th>
		</tr>
<tr>
<td>
				<code>createElement()‎</code>
			</td>
			<td>
				إنشاء عقدة جديدة من نوع عنصر
			</td>
		</tr>
<tr>
<td>
				<code>createTextNode()‎</code>
			</td>
			<td>
				إنشاء عقدة جديدة من نوع نص
			</td>
		</tr>
<tr>
<td>
				<code>node.textContent</code>
			</td>
			<td>
				الوصول أو تعديل المحتوى النصي لعقدة العنصر
			</td>
		</tr>
<tr>
<td>
				<code>node.innerHTML</code>
			</td>
			<td>
				الوصول أو تعديل محتوى HTML في العنصر
			</td>
		</tr>
</tbody></table>
<p>
	لنبدأ أولًا بإنشاء الملف index.html ونقوم بحفظه في مجلد المشروع.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_8" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">

  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	نضغط بالزر الأيمن على أي مكان في الصفحة لتظهر لدينا قائمة نختار منها "Inspect" لفتح أدوات التطوير ثم نختار اللسان Console. سنقوم الآن باستخدام التابع <code>()createElement</code> الموجود في الكائن <code>document</code> من أجل إنشاء عنصر جديد هو <code>p</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_10" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> paragraph </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span></pre>

<p>
	للتأكد من أنه تم إنشاء العنصر <code>p</code>، ندخل التعليمة التالية إلى الطرفية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_12" style="">
<span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">paragraph</span><span class="pun">)</span></pre>

<p>
	حيث سيكون الخرج هو:
</p>

<pre class="ipsCode" id="ips_uid_5572_16">
&lt;p&gt;&lt;/p&gt;</pre>

<p>
	نلاحظ أن المتغير <code>paragraph</code> أعطانا كخرج عنصر <code>p</code> فارغ وهو غير مفيد من دون وجود نص فيه، لذلك سنقوم بإضافة النص من خلال تعديل الخاصية <code>textContent</code> بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_18" style="">
<span class="pun">&gt;</span><span class="pln"> paragraph</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I'm a brand new paragraph."</span><span class="pun">;</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">paragraph</span><span class="pun">)</span></pre>

<p>
	عندها سيكون الخرج هو:
</p>

<pre class="ipsCode">
&lt;p&gt;I<span class="hljs-comment">'m a brand new paragraph.<span class="hljs-doctag">&lt;/p&gt;</span></span>
</pre>

<p>
	إن استخدام <code>()createElement</code> و <code>textContent</code> معًا يؤدي إلى بناء عقدة عنصر كاملة. ولكن يمكن أيضًا استخدام تابع بديل لتعديل محتوى العنصر من خلال الخاصية<code>innerHTML</code> التي تسمح بإضافة تعليمات HTML ونص عادي إلى العنصر بآن واحد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_20" style="">
<span class="pun">&gt;</span><span class="pln"> paragraph</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I'm a paragraph with &lt;strong&gt;bold&lt;/strong&gt; text."</span><span class="pun">;</span></pre>

<p>
	<strong>تحذير</strong>: إن طريقة استخدام <code>innerHTML</code> شائعة لإضافة محتوى إلى العنصر ولكن سيصبح الموقع عرضة لخطر هجوم cross-site scripting (xxs) والذي يتم من خلال إضافة سطر تعليمة جافاسكربت قد تؤدي إلى ضرر بالموقع باستخدام <code>innerHTML</code> غير مرغوب فيه، لذلك ينصح باستخدام <code>textContent</code> وبالتالي سيتم التخلص من وسوم HTML فورًا. كما أنه من الممكن استخدام التابع <code>createTextNode()‎</code> لإضافة عقدة نص، كما في التعليمة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_22" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> text </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createTextNode</span><span class="pun">(</span><span class="str">"I'm a new text node."</span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">text</span><span class="pun">)</span></pre>

<p>
	وسيكون الخرج هو بالشكل:
</p>

<pre class="ipsCode" id="ips_uid_5572_24">
"I'm a new text node."
</pre>

<p>
	إذًا، نستطيع من خلال هذه التوابع إنشاء عقد عناصر ونصوص جديدة، ولكن هذه العقد لن تصبح مرئية في واجهة الموقع حتى يتم إدخالها إلى المستند <code>document</code>.
</p>

<h2 id="-dom">
	إضافة عقد إلى DOM
</h2>

<p>
	نحتاج الآن بعد بناء عقد العناصر والنصوص إلى إضافتها إلى <code>document</code> ويتم ذلك من خلال استخدام مجموعة من التوابع مثل <code>appendChild()‎</code> و <code>insertBefore()‎</code> لإضافة العناصر في بداية، وسط، أو نهاية عنصر الأب، كما يمكن استخدام التابع <code>replaceChild(‎)</code> لاستبدال عقدة قديمة بأخرى جديدة.
</p>

<table>
<thead><tr>
<th>
				الخاصية / التابع
			</th>
			<th>
				التوصيف
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>node.appendChild()‎</code>
			</td>
			<td>
				إضافة عقدة كابن أخير للعنصر الأب
			</td>
		</tr>
<tr>
<td>
				<code>node.insertBefore()‎</code>
			</td>
			<td>
				إضافة عقدة على نفس مستوى عقدة الأب قبل عقدة الأخ المحددة
			</td>
		</tr>
<tr>
<td>
				<code>node.replaceChild()‎</code>
			</td>
			<td>
				استبدال العقدة الحالة بأخرى جديدة
			</td>
		</tr>
</tbody>
</table>
<p>
	للتمرن على هذه التوابع سنقوم بإنشاء قائمة المهام التالية باستخدام html:
</p>

<ul>
<li>
		Buy groceries
	</li>
	<li>
		Feed the cat
	</li>
	<li>
		Do laundry
	</li>
</ul>
<p>
	وعند تحميل الملف السابق إلى المتصفح فإنه سيبدو بالشكل:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29435" href="https://academy.hsoub.com/uploads/monthly_2019_05/01.png.b5600ef378fbb68d689247efd401d049.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29435" data-unique="2txgfbcfe" src="https://academy.hsoub.com/uploads/monthly_2019_05/01.thumb.png.025f938786593aca6ace3b506985899e.png"></a>
</p>

<p>
	الآن سنقوم بإضافة عنصر جديد إلى نهاية قائمة المهام، وللقيام بذلك سننشئ عنصرًا ونضيف له نصًّا كما فعلنا في المقطع السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_40" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="com">// ليمثل قائمة المهام ul إنشاء عنصر</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> todoList </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'ul'</span><span class="pun">);</span><span class="pln">

</span><span class="pun">&gt;</span><span class="pln"> </span><span class="com">// إنشاء مهمة جديدة أي عنصر قائمة</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> newTodo </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'li'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> newTodo</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Do homework'</span><span class="pun">;</span></pre>

<p>
	الأن سنقوم بإضافة هذه المهمة إلى نهاية القائمة باستخدام التابع <code>appendChild()‎</code>:
</p>

<pre class="ipsCode" id="ips_uid_5572_38">
&gt; // إضافة مهمة جديدة إلى نهاية القائمة
&gt; todoList.appendChild(newTodo);
</pre>

<p>
	عند فتح ملف html الخاص بالقائمة، سنلاحظ أنه تم إضافة عنصر <code>li</code> جديد في نهاية <code>ul</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_28" style="">
<span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Buy groceries</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Feed the cat</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do laundry</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do homework</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29436" href="https://academy.hsoub.com/uploads/monthly_2019_05/02.png.c742e8ee40680f674b0f7836500a9b2b.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29436" data-unique="krdy3dh7j" src="https://academy.hsoub.com/uploads/monthly_2019_05/02.thumb.png.5cc8e71ac5496a44690638a77137f905.png"></a>
</p>

<p>
	قد نحتاج لإضافة مهمة جديدة إلى القائمة ولكنها على رأس الأولويات، وبالتالي نحتاج لإضافتها في رأس القائمة. وللقيام بذلك، سنبدأ أولًا بإنشاء عنصر من خلال التابع <code>createElement()‎</code> ولكنه غير قابل للاستخدام بعد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_36" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="com">// إنشاء مهمة جديدة</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> anotherTodo </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'li'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> anotherTodo</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Pay bills'</span><span class="pun">;</span></pre>

<p>
	ولإضافة هذا العنصر إلى رأس القائمة، سنستخدم التابع <code>insertBefore()‎</code> حيث نمرر لهذا التابع متغيرين الأول هو العقدة الجديدة التي نريد إضافتها والثاني هو العقدة الأخ الذي يأتي مباشرة بعد العقدة الجديدة وسيكون شكل التعليمة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_32" style="">
<span class="pln">parentNode</span><span class="pun">.</span><span class="pln">insertBefore</span><span class="pun">(</span><span class="pln">newNode</span><span class="pun">,</span><span class="pln"> nextSibling</span><span class="pun">);</span></pre>

<p>
	الآن، لتطبيق التعليمة السابقة عمليًا على قائمتنا، سنضيف العقدة التي بنيناها سابقًا والمسماة <code>anotherTodo</code> قبل العنصر الأول من أبناء القائمة والذي هو العنصر “Buy groceries”:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_34" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="com">// إضافة مهمة جديدة إلى بداية القائمة</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> todoList</span><span class="pun">.</span><span class="pln">insertBefore</span><span class="pun">(</span><span class="pln">anotherTodo</span><span class="pun">,</span><span class="pln"> todoList</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">);</span></pre>

<p>
	الآن سيصبح شكل ملف todo.html هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_42" style="">
<span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Pay bills</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Buy groceries</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Feed the cat</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do laundry</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do homework</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	وعند تحميل الملف السابق على المتصفح سيظهر كمايلي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29437" href="https://academy.hsoub.com/uploads/monthly_2019_05/03.png.86619dc8ce9b54a41d2071b82acc1b47.png" rel=""><img alt="03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29437" data-unique="2fo91fas9" src="https://academy.hsoub.com/uploads/monthly_2019_05/03.thumb.png.69d2d84447c75784a533a0b17504d974.png"></a>
</p>

<p>
	إذًا تمت إضافة العقدة الجديدة بنجاح لبداية القائمة، وهكذا نكون قد تعلمنا كيفية إضافة عقدة ابن لعقدة أب ولكن يمكننا أيضًا استبدال هذه العقدة الموجودة بعقدة جديدة.
</p>

<p>
	لتعديل عقدة موجودة في قائمة المهام، سننشئ أولًا عنصرًا جديدًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_44" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> modifiedTodo </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'li'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> modifiedTodo</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Feed the dog'</span><span class="pun">;</span></pre>

<p>
	سنقوم بالاستبدال باستخدام التابع <code>replaceChild()‎</code> الذي يشبه التابع <code>insertBefore()‎</code>حيث يتم تمرير متحولين له الأول هو العقدة الجديدة والثاني هو العقدة المراد استبدالها، حيث أن الشكل العام لهذه التعليمة هو:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_46" style="">
<span class="pln">parentNode</span><span class="pun">.</span><span class="pln">replaceChild</span><span class="pun">(</span><span class="pln">newNode</span><span class="pun">,</span><span class="pln"> oldNode</span><span class="pun">);</span></pre>

<p>
	الآن سنقوم باستبدال العنصر الثالث في القائمة بالعنصر الجديد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_48" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="com">// استبدال مهمة موجودة مسبقًا بأخرى</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> todoList</span><span class="pun">.</span><span class="pln">replaceChild</span><span class="pun">(</span><span class="pln">modifiedTodo</span><span class="pun">,</span><span class="pln"> todoList</span><span class="pun">.</span><span class="pln">children</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]);</span></pre>

<p>
	حيث سيتم تلقائيًا تعديل تعليمات ملف html لتصبح بالشكل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_50" style="">
<span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Pay bills</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Buy groceries</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Feed the dog</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do laundry</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do homework</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	ويصبح شكل صفحة الويب:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29438" href="https://academy.hsoub.com/uploads/monthly_2019_05/04.png.60b66573b08726b6daf07b9bba7ccea8.png" rel=""><img alt="04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29438" data-unique="6a0fm5l8d" src="https://academy.hsoub.com/uploads/monthly_2019_05/04.thumb.png.8b4398f8a461abe087a52b28e406a0db.png"></a>
</p>

<p>
	باستخدام توابع <code>appendChild()‎</code>، و <code>insertBefore()‎</code>، و <code>replaceChild()‎</code> يمكننا إضافة العناصر إلى أي مكان في DOM.
</p>

<h2 id="-dom">
	حذف عقد من DOM
</h2>

<p>
	بما أننا تعرفنا على طريقة إنشاء عناصر وإضافتهم إلى DOM أو تعديل العناصر الموجودة، تبقى لنا الخطوة الأخيرة لإتمامها وهي تعلم كيفية حذف عنصر موجود في DOM. نستطيع حذف العقد الأبناء من العقدة الأب باستعمال التابع <code>removeChild()‎</code> كما نستطيع حذف العقدة نفسها باستخدام التابع <code>remove()‎</code>.
</p>

<table>
<thead><tr>
<th>
				التابع
			</th>
			<th>
				التوصيف
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<code>node.removeChild()‎</code>
			</td>
			<td>
				حذف عقدة ابن
			</td>
		</tr>
<tr>
<td>
				<code>node.remove()</code>‎
			</td>
			<td>
				حذف العقدة نفسها
			</td>
		</tr>
</tbody>
</table>
<p>
	بالعودة إلى مثال قائمة المهام السابق، سنحذف عناصر من القائمة بعد الانتهاء منها. مثلًا سنقوم بحذف المهمة "Do homework" الموجودة في نهاية القائمة (أي هي الابن الأخير للقائمة) وذلك باستخدام التابع <code>removeChild()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5572_52" style="">
<span class="pun">&gt;</span><span class="pln">todoList</span><span class="pun">.</span><span class="pln">removeChild</span><span class="pun">(</span><span class="pln">todoList</span><span class="pun">.</span><span class="pln">lastElementChild</span><span class="pun">);</span></pre>

<p>
	بالعودة لملف html نلاحظ أن عنصر <code>li</code> الأخير قد حُذِف:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_54" style="">
<span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Pay bills</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Buy groceries</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Feed the dog</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do laundry</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29439" href="https://academy.hsoub.com/uploads/monthly_2019_05/05.png.f1a4b81b6b1aefca91315814722a4b00.png" rel=""><img alt="05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29439" data-unique="l1ocrw49o" src="https://academy.hsoub.com/uploads/monthly_2019_05/05.thumb.png.02458bc1b9533443aae18feb8c1cdd8a.png"></a>
</p>

<p>
	الآن سنستخدم التابع الآخر وهو <code>remove()‎</code> والذي يقوم بحذف العقدة نفسها مباشرة:
</p>

<pre class="ipsCode">
&gt; <span class="hljs-comment">// Remove second element child from todoList</span>
&gt; <span class="hljs-selector-tag">todoList</span><span class="hljs-selector-class">.children</span><span class="hljs-selector-attr">[1]</span><span class="hljs-selector-class">.remove</span>();
</pre>

<p>
	وبالتالي يصبح ملف html بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5572_58" style="">
<span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Pay bills</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Feed the dog</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Do laundry</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29440" href="https://academy.hsoub.com/uploads/monthly_2019_05/06.png.6ba06dba8f0ed469c7301c1b1e480b0e.png" rel=""><img alt="06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29440" data-unique="9gmhsu77z" src="https://academy.hsoub.com/uploads/monthly_2019_05/06.thumb.png.7c788c8f8f6596fe3cfa2e6a7316987d.png"></a>
</p>

<p>
	باستخدام التابعين <code>removeChild()‎</code> و <code>remove()‎</code>، يمكننا إزلة أي عقدة من DOM كما يمكننا استخدام الخاصية <code>innerHTML</code> لإزالة عقدة ابن من العنصر الأب من خلال استبدال الابن بسلسلة نصية فارغة (empty string) بالشكل <code>""</code> ولكن هذه الطريقة غير مفضلة في الاستخدام. ملخص تعلمنا في هذه المقالة كيفية استخدام الجافا سكربت لإنشاء عقد وعناصر جديدة ثم إضافتها إلى DOM، واستبدال أو حذف العقد والعناصر الموجودة. وبهذا نكون قد تعلمنا طريقة الوصول إلى عناصر DOM والتنقل بين العقد وتعديلها وبالتالي يمكنك البدء بإنشاء واجهة تطيبق ويب باستخدام الجافا سكربت.
</p>

<p>
	ترجمة -وبتصرف- للمقالة <a href="https://www.digitalocean.com/community/tutorials/how-to-make-changes-to-the-dom" rel="external nofollow">How To Make Changes to the DOM</a> للكاتبة Tania Rascia
</p>
]]></description><guid isPermaLink="false">667</guid><pubDate>Mon, 06 May 2019 12:35:23 +0000</pubDate></item><item><title>&#x645;&#x62D;&#x631;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x634;&#x64A;&#x641;&#x631;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D8%AD%D8%B1%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r666/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/3.jpg.a4808f439e98bf5bf6e9dbfa15f134ce.jpg" /></p>

<p>
	يقضي المبرمجون معظم وقتهم في العمل على أحد محررات الشيفرة البرمجية لكتابة وتطوير برامجهم. سنساعدك في هذا المقال على اختيار المحرر الأنسب لك.
</p>

<p>
	بدايةً، يوجد نوعان رئيسيان لمحررات الشيفرة البرمجية: «بيئات التطوير المتكاملة» (Integrated Development Environments وتدعى اختصارًا IDE) و «المحررات البسيطة» (lightweight editors). يستخدم العديد من المبرمجين محرِّرًا واحدًا من كل نوع. في بداية تعلمك للبرمجة، يمكنك استعمال المحررات البسيطة مثل المفكرة (notepad) في ويندوز والمحرر <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D9%85%D8%AD%D8%B1%D9%91%D8%B1%20vim/" rel="">vim</a> أو kate في لينكس ولكن ستحتاج مع تقدمك وتطور وكبر شيفرتك إلى بيئة تطوير متكاملة. فما هي بيئة التطوير المتكاملة؟
</p>

<h2 id="-">
	بيئة التطوير المتكاملة
</h2>

<p>
	بيئة التطوير المتكاملة «<a href="https://ar.wikipedia.org/wiki/%D8%A8%D9%8A%D8%A6%D8%A9_%D8%AA%D8%B7%D9%88%D9%8A%D8%B1_%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9" rel="external nofollow">IDE</a>» عبارة عن محرر شيفرة برمجية قوي، ومزود بمزايا كثيرة ومتنوعة تكفي للعمل عادةً على كامل المشروع. وكما هو واضح من اسمها، فهي ليست كأي محرر عادي، ولكن «بيئة تطوير» شاملة.
</p>

<p>
	يمكنك تحميل المشروع بجميع ملفاته إلى بيئة التطوير (IDE)، مما يسمح بالتنقل بينها بسهولة، كما توفر هذه البيئة (IDE) ميزة الإكمال التلقائي أثناء كتابتك للشيفرة البرمجية <em>كالتعليمات وأسماء المتغيرات</em> بالنسبة لكامل المشروع (وليس ضمن الملف المفتوح فقط). وتتيح الاندماج مع نظام التحكم في النسخ مثل <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r240/%5D%D8%8C" rel="">git</a>، وبيئة الاختبار، وغيرها من الأمور التي تُنفذ على مستوى المشروع.
</p>

<p>
	بإمكانك الاطلاع على خيارات بيئات التطوير (IDE) التالية، لمساعدتك على اختيار واحدة منها للعمل عليها إن لم تحدد واحدة بعد:
</p>

<ul>
<li>
		<a href="https://www.jetbrains.com/webstorm/" rel="external nofollow">WebStorm</a>: تستخدم لتطوير الواجهات الأمامية (Front-end development). توفر الشركة محررات أخرى للعديد من اللغات البرمجية ولكنها مدفوعة.
	</li>
	<li>
		<a href="https://netbeans.org/" rel="external nofollow">NetBeans</a>: بيئة متكاملة ومجانية وتعمل على مختلف أنظمة التشغيل.
	</li>
	<li>
		<a href="https://visualstudio.microsoft.com/vs/" rel="external nofollow">Visual Studio</a>: خاص بنظام التشغيل «ويندوز»، (<em>ميّز بينه وبين "<a href="https://code.visualstudio.com/" rel="external nofollow">Visual Studio Code</a>")</em>. وهو محرر قوي ومدفوع، ومناسب جدًا للعمل على منصة «NET.»، ويوجد نسخة مجانية منه تُسمى <a href="https://visualstudio.microsoft.com/vs/community/" rel="external nofollow">Visual Studio Community</a>.
	</li>
</ul>
<p>
	أغلب بيئات التطوير المتكاملة متعددة المنصات، وتعمل على أنظمة تشغيل مختلفة ولكنها مدفوعة (لها فترة تجريبية مجانية)، وكلفتها متواضعة بالنسبة لدخل المطور المؤهل، لذلك ننصحك باختيار الأفضل والأنسب لك، دون القلق من كلفتها.
</p>

<h2 id="-">
	المحررات البسيطة
</h2>

<p>
	المحررات البسيطة (Lightweight editors) ليست قوية مثل بيئات التطوير المتكاملة، لكنها سريعة، وأنيقة، وبسيطة الاستخدام. تُستخدَم بشكل أساسي لفتح وتعديل الملف بطريقة سريعة وآنية.
</p>

<p>
	الاختلاف الرئيسي بين المحرر البسيط وبيئة التطوير المتكاملة، هو أنّ بيئة التطوير المتكاملة تعمل على «مستوى المشروع»، لذلك تُحمِّل الكثير من البيانات في البداية، وتكون قادرة على تحليل بنية المشروع عند الحاجة وغيرها من المهام. أمّا المحرر البسيط، يكون أسرع بشكل كبير عند الحاجة للعمل على ملف واحد فقط من المشروع.
</p>

<p>
	عمليًا، يمكن أن تملك المحررات البسيطة العديد من الإضافات التي تتضمن محللات ومدققات الصياغة على مستوى المشروع وميزة الإكمال التلقائي، وبالتالي لا توجد هناك حدود واضحة بين المحرر الخفيف وبيئة التطوير المتكاملة.
</p>

<p>
	لذلك وقبل أن تحسم رأيك باستخدام بيئة تطوير متكاملة، ننصحك بالاطلاع على الخيارات التالية للمحررات البسيطة:
</p>

<ul>
<li>
		<a href="https://code.visualstudio.com/" rel="external nofollow">Visual Studio Code</a>: مجاني ومتعدد المنصات ويملك العديد من المزايا المشابهة لمزايا بيئة التطوير المتكاملة.
	</li>
	<li>
		<a href="https://atom.io/" rel="external nofollow">Atom</a>: مجاني الاستخدام ومتعدد المنصات.
	</li>
	<li>
		<a href="http://www.sublimetext.com/" rel="external nofollow">Sublime Text</a>: <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D8%A7%D9%85%D8%AC_%D8%AA%D8%AC%D8%B1%D9%8A%D8%A8%D9%8A%D8%A9" rel="external nofollow">برنامج تجريبي</a> ومتعدد المنصات ويدعم العديد من اللغات البرمجية (programming languages) واللغات التوصيفية (markup languages).
	</li>
	<li>
		<a href="http://brackets.io/" rel="external nofollow">Brackets</a>: محرِّر مجاني ومفتوح المصدر وعابر للمنصات ومخصَّص بشكل عام لمطوري الويب وبشكل خاص لمصممي الويب ومطوري الواجهات الأمامية.
	</li>
	<li>
		<a href="https://notepad-plus-plus.org/" rel="external nofollow">++Notepad</a>: محرِّر مجاني وخاص بنظام التشغيل ويندوز.
	</li>
	<li>
		<a href="https://www.vim.org/" rel="external nofollow">Vim</a> و <a href="https://www.gnu.org/software/emacs/" rel="external nofollow">Emacs</a>: محِّرران بسيطان، ويعدَّان خيارًا جيدًا إذا كنت تعرف كيفية استخدامهما.
	</li>
</ul>
<h2 id="-">
	ما هو محرري المفضل الذي سأستخدمه؟
</h2>

<p>
	نصيحة مني لك هو تجريب الخيارين السابقين كلاهما؛ استخدم بيئة التطوير المتكاملة عند العمل على كامل المشروع، وأحد المحررات الخفيفة من أجل التعديلات السريعة والطفيفة في ملفات المشروع. يمكن في البداية استعمال المحررات الخفيفة (مثل <a href="https://code.visualstudio.com/" rel="external nofollow">VS code</a>) التي تفي بالغرض في أغلب المشاريع ثمَّ الانتقال إلى البيئات المتكاملة (سواءً المجانية أو المدفوعة) في المستويات المتقدمة عندما تتولد الحاجة إليها. أسمعك تسألني ما الذي استخدمه؟ حسنًا، أنا استخدم:
</p>

<ul>
<li>
		استعمل WebStorm - بيئة التطوير المتكاملة - عند العمل بلغة JavaScript، واستعمل خيارًا آخر من JetBrains مثل <a href="https://www.jetbrains.com/idea/" rel="external nofollow">IntelliJ IDEA</a> عند العمل بلغات برمجية مختلفة.
	</li>
	<li>
		واستخدم Sublime أو Atom كمحرر خفيف.
	</li>
</ul>
<p>
	قبل أن تختلف معي بشأن القائمة السابقة، فإن هذه المحررات هي إما محررات استخدمتها بنفسي أو استخدمها أحد أصدقائي من المطورين الجيدين لوقت طويل وكانوا سعداء باستخدامهم لها.
</p>

<p>
	هناك العديد من المحررات الجيدة أيضًا في عالمنا الكبير. لذلك، ننصحك بالعمل على المحرر المفضل لديك. فاختيار المحرر، مثل أي أداة أخرى، هو قرار خاص، ومعتمد على مشروعك، وعاداتك، وتفضيلاتك الشخصية. ولكي تعرف ما هو المحرر المفضل لديك، لا بد أن تجرب جميع المحرِّرات.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/code-editors" rel="external nofollow">Code Editors</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A3%D9%87%D9%84%D9%8B%D8%A7-%D8%A8%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85-r668/" rel="">المثال الأول: أهلًا بالعالم!</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D8%B1-r665/" rel="">أدوات المطور</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">666</guid><pubDate>Thu, 09 May 2019 13:09:00 +0000</pubDate></item><item><title>&#x623;&#x62F;&#x648;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x637;&#x648;&#x631;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D8%B1-r665/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/2.jpg.bfde894d72349d01bc7c5da2df6e16d6.jpg" /></p>

<p>
	أبقِ في بالك أن الشيفرة البرمجية عرضةً لاحتواء الكثير من الأخطاء، إذ احتمال ارتكابك الأخطاء كبير أثناء كتابة الشيفرة البرمجية، لا بل وقوعك فيها هو أمر حتمي طالما أنك إنسان ولست رجلًا آليًا. هل تصدق أنه حتى المبرمجين المتمرسين وذوي الخبرة الطويلة يرتكبون الكثير من الأخطاء في الشيفرة التي يكتبونها! لا تقلق فهذا أمر طبيعي.
</p>

<p>
	على أي حال، لا تُظهِر المتصفِّحات الأخطاء البرمجية تلقائيًا للمستخدمين. وعند وجود مشكلة ما في السكربت، ولا يمكنك آنذاك تحديد مكانها، وبالتالي لا يمكن إصلاحها. لذلك، أُضيفت «أدوات المطوّر» (developer tools) إلى المتصفِّحات لاسكتشاف الأخطاء وتوفير معلومات مفيدة عن السكربت لتحسينه.
</p>

<p>
	يفضل معظم المطورون العمل على متصفِّحي Chrome أو FireFox لاحتوائهما على أفضل أدوات المطوّر. توفر المتصفِّحات الأخرى أيضًا مجموعة أدوات للمطوّر والتي من الممكن أن تحتوي على مزايا خاصة. لكن عادةً ما تحاول اللحاق بمتصفِّحي Chrome و FireFox الأفضل من هذه الناحية. يفضل المطوّرون بشكل عام العمل على متصفِّح واحد وينتقلون إلى متصفِّح آخر عندما تكون المشكلة التي يعملون عليها محدَّدة بهذا المتصفِّح.
</p>

<p>
	بناءً على ذلك، نجد أنَّ أدوات المطور مهمة للغاية لما تمتلكه من مزايا تساعدك أثناء مسيرتك في تطوير الويب عبر JavaScript. سنتعلم في البداية طريقة فتحها، واستخدامها لاستكشاف الأخطاء، وتشغيل تعليمات JavaScript ضمنها.
</p>

<p>
	 
</p>

<h2 id="-google-chrome">
	أدوات المطور في متصفح Google Chrome
</h2>

<p>
	قم بفتح الصفحة <a href="https://javascript.info/article/devtools/bug.html" rel="external nofollow">bug.html</a>. يوجد خطأ في الشيفرة المكتوبة بلغة JavaScript غير ظاهر للزائر العادي، لذا سنستخدم أدوات المطوّر لاكتشافه.
</p>

<p>
	اضغط على F12 (أو الاختصار Cmd+Opt+J إذا كنت تستخدم نظام التشغيل «ماك») وسيفتح ذلك تلقائيًا أدوات المطوّر على لسان «الطرفية» (Console). وتظهر أدوات المطوّر تقريبًا بهذا الشكل:
</p>

<p>
	<img alt="chrome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29417" data-unique="z5b9nbr8e" src="https://academy.hsoub.com/uploads/monthly_2019_05/chrome.png.bbe1d6af5df6369b87e7bd460f40f41e.png"></p>

<p>
	يعتمد شكل أدوات المطوّر على إصدار متصفِّح Chrome الذي تستخدمه، إذ يختلف بشكل بسيط من إصدار إلى آخر.
</p>

<ul>
<li>
		بإمكانك رؤية رسالة الخطأ باللون الأحمر. معنى الرسالة أن السكربت يحتوي على أمر غير معروف هو "lalala".
	</li>
	<li>
		لاحظ في أقصى اليمين وجود رابط إلى المصدر bug.html:12 مع رقم سطر الخطأ في الشيفرة.
	</li>
</ul>
<p>
	يظهر تحت رسالة الخطأ الرمز <code>&lt;</code> باللون الأزرق، ويحدد «سطر الأوامر» (command line) الذي سنكتب عنده أوامر وتعليمات JavaScript. اضغط زر الإدخال Enter لتنفيذ الأمر بعد كتابته (أو Shift+Enter للانتقال إلى السطر التالي عند إدخال أمر متعدد الأسطر).
</p>

<p>
	الآن أصبح بإمكانك استكشاف الأخطاء، وهذا يكفي كبداية وسنعود لاحقًا إلى أدوات المطوَر لندرس استكشاف الأخطاء وإصلاحها أو ما يعرف debugging في فصل تنقيح الأخطاء في المتصفِّح Chrome.
</p>

<h2 id="-firefox-safari-">
	أدوات المطور في متصفحي FireFox و Safari وغيرهما
</h2>

<p>
	تَستخدِم معظم المتصفِّحات الاختصار F12 لفتح أدوات المطوَر. بشكل عام تتشابه هذه الأدوات في الشكل والمضمون. وبمجرد تعلمك العمل على إحدى هذه الأدوات (بإمكانك البدء مع Chrome)، يمكنك بسهولة الانتقال للعمل على الأدوات الأخرى.
</p>

<h3 id="-safari">
	أدوات المطور في متصفح Safari
</h3>

<p>
	يختلف المتصفِّح Safari (متصفِّح خاص بنظام التشغيل «ماك» وغير مدعوم من قبل «ويندوز» أو «لينكس») في طريقة فتح أدوات المطور. نحتاج في البداية لتفعيل « قائمة المطوّر» (Develop menu). لفعل ذلك، افتح «التفضيلات» (Preferences) ثم اختر قائمة «متقدم» (Advanced). يوجد في الأسفل مربع اختيار لإظهار قائمة المطوَر في شريط القائمة. حدده لتفعيل القائمة:
</p>

<p>
	<img alt="safari.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29418" data-unique="ng5f9mvge" src="https://academy.hsoub.com/uploads/monthly_2019_05/safari.png.b5a214a473782f2e890cad41c1b9cad1.png"></p>

<p>
	بإمكانك استعمال الاختصار Cmd+opt+C لإظهار وإخفاء الطرفية من أدوات المطور. ويمكنك ملاحظة ظهور قائمة جديدة في الأعلى اسمها «Develop». تملك هذه القائمة العديد من الخيارات والأوامر الخاصة بالمطور.
</p>

<h3 id="-">
	الإدخال متعدد الأسطر
</h3>

<p>
	عادةً يتم تنفيذ الشيفرة البرمجية في نافذة الأوامر سطرًا تلو الآخر عند الضغط على زر الإدخال Enter. ولكتابة أمر متعدد الأسطر، اضغط على Shift+Enter (يُمكِّنك ذلك من الانتقال إلى السطر التالي دون تنفيذ السطر الحالي، وعند الانتهاء من إدخال كامل الأمر، اضغط على Enter فقط لتنفيذ هذا الأمر المتعدد الأسطر).
</p>

<h2 id="-">
	الخلاصة
</h2>

<ul>
<li>
		توفِّر أدوات المطوّر لك عدة أدوات متطورة تساعدك على تنقيح الأخطاء، وتنفيذ الأوامر، وفحص المتغيرات، وغيرها من المهام.
	</li>
	<li>
		يمكن الوصول إليها باستخدام الاختصار F12 في معظم متصفِّحات نظام Windows. أمَا في نظام Mac، استخدم الاختصار Cmd+Opt+J لمتصفِّح Chrome، واستخدم Cmd+Opt+C لمتصفِّح Safari (ولكن عليك أن تفعَل قائمة المطوّر في البداية).
	</li>
</ul>
<p>
	الآن أصبحت البيئة جاهزة لديك. استعد للتعمق في لغة JavaScript في الفصل التالي.
</p>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/devtools" rel="external nofollow">Developer Console</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AD%D8%B1%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r666/" rel="">محررات الشيفرة البرمجية</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-javascript-r664/" rel="">مقدمة إلى لغة JavaScript</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">665</guid><pubDate>Mon, 06 May 2019 18:00:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-javascript-r664/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/1.jpg.3b11b572e6ffd3509e90a6cadbd22973.jpg" /></p>
<p>
	تستخدَم لغة JavaScript لإنشاء صفحات ويب تفاعلية، وهي منتشرة بشكل كبير ومُستعمَلة من أغلبية المواقع، وتدعمها جميع المتصفحات تقريبًا دون الحاجة إلى إضافات خارجية.
</p>

<p>
	يشرح هذا المقال مزايا لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، وما يمكنك تحقيقه باستخدامها، وأفضل التقنيات التي تعمل معها بشكل جيد.
</p>

<h2 id="-javascript-">
	ما هي لغة JavaScript؟
</h2>

<p>
	ظهرت لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> لإنشاء صفحات ويب <em>حيوية وتفاعلية</em>.
</p>

<p>
	تسمى البرامج المكتوبة بلغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> بالسكربتات (scripts)، ويمكن كتابتها بشكل مباشر ضمن شيفرة HTML لصفحة الويب ليتم تنفيذها تلقائيًا عند تحميل الصفحة. ولا تحتاج هذه السكربتات إلى تحضير خاص أو تصريف مسبق وإنما تتم كتابتها ثم تنفيذها كنص عادي. هذا الأمر يميز لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> عن لغة برمجية أخرى تشبهها بالاسم تدعى <a href="https://academy.hsoub.com/programming/java/" rel="">Java</a>.
</p>

<h2 id="-javascript-">
	لماذا سميت JavaScript؟
</h2>

<p>
	عندما ظهرت لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، كان لها اسم مختلف وهو «LiveScript» ولكن الشعبية الكبيرة للغة Java في تلك الفترة دفعت إلى تغيير اسم اللغة إلى <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> بهدف إظهارها بصورة «الأخ الصغير» للغة <a href="https://academy.hsoub.com/programming/java/" rel="">Java</a> واكتساب بعض الشهرة منها.
</p>

<p>
	ومع تطور لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، أصبحت لغةً مستقلة بشكل كامل ولها مواصفات ومعايير خاصة بها تُسمى «<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%82%D8%A7%D8%AF%D9%85-%D9%85%D9%86-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-ecmascript-6-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r26/" rel="">ECMAScript</a>»، ولم يعد لها أي علاقة بلغة Java.
</p>

<p>
	في الوقت الحالي لا يقتصر تنفيذ لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> على المتصفح وإنما من الممكن تنفيذها ضمن الخادوم أيضًا، أو أي جهاز يحتوي على برنامج خاص يسمى محرك <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>.
</p>

<p>
	يحتوي المتصفح على محرك مدمج ضمنه عادةً ما يسمى بآلة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> الافتراضية وله أسماء تختلف باختلاف المتصفحات. فمثلًا يسمى المحرك باسم:
</p>

<ul>
	<li>
		V8 في متصفحي Chrome و Opera وباسم SpiderMonkey في المتصفح FireFox.
	</li>
	<li>
		Trident و Chakra في إصدارات مختلفة من IE، ويسمى ChakraCore في MicroSoftEdge، ويسمى Nitro و SquirrelFish في متصفح Safari …إلخ.
	</li>
</ul>

<p>
	احفظ هذه الأسماء في ذهنك جيدًا لأنها مستخدمة بشكل كبير في مقالات المطورين عبر الإنترنت وسنأتي على ذكرها لاحقًا في مقالاتنا. إذا قرأت مثلًا الجملة التالية: «الخاصية X مدعومة من قبل V8»، فيجب أن تعرف أنَ هذه الخاصية تعمل على الأغلب ضمن المتصفحين Opera و Chrome.
</p>

<h2 id="-javascript-">
	كيف تعمل محركات JavaScript؟
</h2>

<p>
	طريقة عمل المحركات معقدَة وتتألف من ثلاث مراحل أساسية:
</p>

<ol>
	<li>
		بدايةً، يقرأ المحرك (إذا كان التنفيذ يتم عن طريق المتصفح فالمحرك مدمج ضمنه) أو يفسر (بمعنى أدق) السكربت، ثم
	</li>
	<li>
		يحول السكربت إلى لغة الآلة (عملية التصريف)، ثم
	</li>
	<li>
		تُنفَّذ شيفرات الآلة بشكل سريع.
	</li>
</ol>

<p>
	يحسّن المحرك كل مرحلة من هذه العملية عن طريق مراقبة السكربت المترجم أثناء تنفيذه، وتحليل تدفق البيانات وفق السكربت ثم يقوم بتحسين شيفرة الآلة الناتجة وفقًا للمعرفة التي قام باكتسابها مما يساعد على زيادة سرعة تنفيذ السكربت.
</p>

<h2 id="-javascript-">
	ما الذي يمكن أن تفعله لغة JavaScript ضمن المتصفح؟
</h2>

<p>
	لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> بإصدارها الحالي هي لغة برمجية «آمنة». ويعود ذلك إلى توجيه هذه اللغة للعمل ضمن المتصفحات لذلك فهي لا تحتوي على تعليمات للوصول إلى طبقة أدنى من العتاد مثل المعالج أو الذاكرة لأن عملها لا يتطلب ذلك. وتعتمد امكانيات لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> بشكل كبير على البيئة التي تعمل ضمنها؛ فمثلًا تدعم بيئة <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.Js</a> (التي تنفِّذ شيفرة JavaScript خارج بيئة المتصفح) التوابع التي تسمح بالقراءة من أو الكتابة على الملفات، وتنفِّذ طلبات الشبكة، وغيرها من المهام التي لا يمكن تنفيذها في بيئة المتصفح. أما ضمن المتصفح، فيمكن للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> القيام بجميع الأعمال المتعلقة بمعالجة صفحات الويب، والتحكم بالتفاعل بين المستخدم وخادم الويب.
</p>

<p>
	يمكن للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> ضمن المتصفح تنفيذ العديد من المهام نذكر منها:
</p>

<ul>
	<li>
		إضافة عناصر <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> جديدة إلى الصفحة، وتغيير المحتوى الحالي لها، وتعديل التنسيقات.
	</li>
	<li>
		التفاعل مع المستخدم وتنفيذ أعمال معينة عند النقر على الفأرة وتحريك المؤشر والضغط على أزرار لوحة المفاتيح.
	</li>
	<li>
		إرسال الطلبات عبر الإنترنت للخوادم البعيدة، بالإضافة إلى تحميل وتنزيل الملفات (كما في تقنية AJAX و COMET).
	</li>
	<li>
		الحصول على معلومات من «ملفات تعريف الارتباط» (Cookies، أو الكعكات) والتعديل عليها، وطرح الأسئلة على زوار الموقع وإظهار الرسائل والاشعارات.
	</li>
	<li>
		يمكن استخدامها لتخزين البيانات من جهة المستخدم أي ذاكرةً محليةً.
	</li>
</ul>

<h2 id="-javascript-">
	ما المهام التي لا يمكن للغة JavaScript القيام بها ضمن المتصفح؟
</h2>

<p>
	الحد من إمكانيات <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> ضمن المتصفح أمرٌ بالغ الضرورة وذلك لضمان أمان المستخدم. أي أن الهدف من ذلك هو منع صفحات الويب الخطيرة من الوصول إلى معلومات سرية أو التلاعب ببيانات المستخدم ...إلخ.
</p>

<p>
	يوجد العديد من القيود على عمل <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> ضمن المتصفح نذكر منها:
</p>

<ul>
	<li>
		<p>
			لا يمكن للغة JavaScript ضمن المتصفح قراءة الملفات الموجودة على القرص الصلب للمستخدم، أو نسخها، أو التعديل عليها. كما لا يمكنها تشغيل البرامج على جهاز المستخدم أو الوصول إلى ملفات نظام التشغيل. تسمح المتصفحات في الوقت الحالي للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> بالتعامل مع الملفات في حالة سماح المستخدم بذلك. مثال على ذلك هو تحميل المستخدم ملفًا ما إلى موقع ويب طلب ذلك إما عبر السحب والإفلات في مربع محدَّد أو اختيار ملف معين في الوسم <a href="http://wiki.hsoub.com/HTML/input" rel="external">&lt;input&gt;</a>. وتوجد طرق تتيح التعامل مع الأجهزة الملحقة مثل الكاميرا أو مسجل الصوت ولكنها تتطلب تقديم صلاحيات صريحة من قبل المستخدم وأخذ موافقته على أداء مهمة معينة فقط. بمعنى أن الصفحة التي جرى تفعيل <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> لا يعني بالضرورة تفعيل كاميرات الويب والوصول إليها الأمر الذي يتيح مراقبة المستخدم ومحيطه وإرسال المعلومات عبر الإنترنت إلى وكالات الأمن القومي كما يظن البعض.
		</p>
	</li>
	<li>
		<p>
			في الحالة العامة، الألسن والنوافذ المختلفة في المتصفح لا يمكنها تبادل البيانات فيما بينها أو معرفة أية تفاصيل عن بعضها بعضًا إلا عندما تستخدم صفحة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> لفتح صفحة أخرى؛ وحتى في هذه الحالة، لا يمكن لصفحة تبادل البيانات مع صفحة فتحتها إذا كانت هاتين الصفحتين من موقعين مختلفين (نطاق مختلف، برتوكول أو منفذ). يسمى ذلك «<a href="https://ar.wikipedia.org/wiki/%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9_%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1_%D8%A7%D9%84%D8%A3%D9%88%D8%AD%D8%AF" rel="external nofollow">سياسة المصدر الواحد</a>» ويمكن تجاوزها عند الحاجة ولكن يجب أن تحتوي <em>كلا الصفحتين</em> على سكربت <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> خاص يتحكم بتبادل البيانات بينهما. هذه المحدودية - مرةً أخرى - ضرورية لضمان أمان المستخدم. فلا يجب على أي صفحة من الموقع <a href="http://anysite.com" rel="external nofollow">http://anysite.com</a> مثلًا والتي فتحها المستخدم أن يكون باستطاعتها الوصول وسرقة بيانات صفحة أخرى من الموقع <a href="http://gmail.com" rel="external nofollow">http://gmail.com</a> مثلًا مفتوحة في لسان آخر من نفس المتصفح.
		</p>
	</li>
	<li>
		<p>
			بإمكان لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> تبادل البيانات عبر الإنترنت بسهولة بين صفحة الويب والخادم الخاص بها ولكن إمكانيتها على استقبال البيانات من مواقع ونطاقات أخرى محدودة إلا في حالة السماح بذلك بتصريح صريح (يُذكَر ضمن ترويسة <a href="https://academy.hsoub.com/devops/servers/web/" rel="">HTTP</a>) للطرف الآخر البعيد. هذه المحدودية مرةً أخرى ضرورية لأمان المستخدم.
		</p>
	</li>
</ul>

<p style="text-align: center;">
	<img alt="limitations.png" class="ipsImage ipsImage_thumbnailed" data-fileid="29410" data-unique="gcijfilws" src="https://academy.hsoub.com/uploads/monthly_2019_05/limitations.png.852c15161d1a7971831dae4c5a371575.png">
</p>

<p>
	يجب التنويه أنَ المحدوديات السابقة توجد فقط عند استخدام لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> ضمن المتصفح ولا توجد عند استخدامها ضمن بيئة مختلفة مثل الخادم. كما أنّ المتصفحات في الوقت الحالي توفر ملحقات/إضافات تسأل المستخدم عن الرغبة بإعطاء صلاحيات أكبر للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> المنفذة في المتصفح.
</p>

<h2 id="-javascript-">
	ما المميز في لغة JavaScript؟
</h2>

<p>
	هنالك على الأقل ثلاثة أمور تميَز لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> وهي:
</p>

<ul>
	<li>
		الاندماج الكامل مع <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a>.
	</li>
	<li>
		سهولة تنفيذ الأمور البسيطة.
	</li>
	<li>
		مدعومة من قبل أغلبية المتصفحات ومفعًلة تلقائيًا.
	</li>
</ul>

<p>
	لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> هي اللغة الوحيدة التي تتوفر فيها هذه المزايا الثلاث. وهذا ما يجعلها الأداة الأكثر انتشارًا لبناء صفحات الويب.
</p>

<p>
	قبل البدء بتعلم لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، من المفيد الاطلاع على الآفاق المستقبلية لها والتقنيات الحديثة التي تنافسها من لغات برمجية جديدة وتحديثات في عمل المتصفحات.
</p>

<h2 id="-javascript">
	اللغات المعتمدة على لغة JavaScript
</h2>

<p>
	لا تناسب قواعد كتابة لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> الجميع. ويختلف المطورون في حاجاتهم إلى مزايا مختلفة، وهذا بالطبع أمر متوقع لاختلاف مشاريعهم ومتطلباتهم. لذلك، ظهرت مؤخرًا مجموعة من اللغات البرمجية الجديدة والتي تُحوَّل (transpiled) إلى لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> قبل تنفيذها في المتصفح.
</p>

<p>
	ومع تطور هذه الأدوات، أصبحت عملية التحويل (transpilation) سريعة. الأمر الذي سمح للمطورين بكتابة الشيفرات بلغة برمجية أخرى ليتم تحويلها تلقائيًا دون أي اختلاف إلى لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> وكأنها مكتوبة من الأصل بهذه اللغة.
</p>

<p>
	بعض الأمثلة عن مثل هذه اللغات هي:
</p>

<ul>
	<li>
		CoffeeScript: تعدُّ لغةً ذات صياغة تجميلية للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>. توفر صياغة أقصر مما يسمح بكتابة شيفرة برمجية أوضح وأكثر دقةً. لها شعبية بين مطوري لغة <a href="wiki.hsoub.com/Ruby" rel="">Ruby</a> .
	</li>
	<li>
		<a href="wiki.hsoub.com/TypeScript" rel="">TypeScript</a>: تركز على إضافة تعريف لأنواع المعطيات لتسهيل دعم وتطوير الأنظمة المعقدة. طُوِّرت هذه اللغة من قبل شركة Microsoft.
	</li>
	<li>
		Dart: هي لغة مستقلة ولها محرك خاص وتعمل على بيئات مختلفة غير المتصفح (مثل تطبيقات الموبايل). قدمتها شركة Google كبديل عن لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، ولكن تعمل المتصفحات في الوقت الحالي على تحويلها إلى لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> كما هو حال اللغات السابقة.
	</li>
</ul>

<p>
	هنالك المزيد من اللغات ولكن تعلمك واستخدامك لإحداها لا يلغي ضرورة تعلمك للغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>، إذ يجب تعلم وفهم هذه اللغة لمعرفة كيفية تنفيذ العمليات والوظائف المختلفة بشكل فعلي. على أي حال، تبقى لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> هي الأشهر والأقوى والأسرع تطورًا بين اللغات الشبيهة والمنافسة لها.
</p>

<h2 id="-">
	الخلاصة
</h2>

<ul>
	<li>
		أُوجدت لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> في البداية كلغة يتم تنفيذها فقط من قبل المتصفح ثم تطورت وأصبح من الممكن تنفيذها ضمن بيئات مختلفة عبر <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.js</a>.
	</li>
	<li>
		اليوم، تملك لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> مكانة كبيرة وخاصة بسبب دعمها من قبل معظم المتصفحات واندماجها الكامل مع <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a>.
	</li>
	<li>
		هنالك العديد من اللغات التي تُحول إلى <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> وتوفر مزايا خاصة. لذا ننصحك بالاطلاع عليها ولو بشكل سريع بعد تمكنك من لغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a>.
	</li>
</ul>

<p>
	ترجمة -وبتصرف- للفصل <a href="https://javascript.info/intro" rel="external nofollow">An Introduction to JavaScript</a> من كتاب <a href="https://javascript.info/js" rel="external nofollow">The JavaScript Language</a>
</p>

<h2>
	انظر أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D8%B1-r665/" rel="">أدوات المطور</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AD%D8%B1%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r666/" rel="">محررات الشيفرة البرمجية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">كامل مقالات دليل تعلم جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">664</guid><pubDate>Thu, 02 May 2019 13:09:00 +0000</pubDate></item><item><title>&#x623;&#x647;&#x645; 3 &#x645;&#x643;&#x62A;&#x628;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x644;&#x631;&#x633;&#x645; &#x627;&#x644;&#x645;&#x62E;&#x637;&#x637;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x64A;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A3%D9%87%D9%85-3-%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%84%D8%B1%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%AE%D8%B7%D8%B7%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r653/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_01/js.png.9bb4d02d1515038c4d8898f9ccd8add0.png" /></p>

<p>
	تعتبر المخططات والجداول البيانية charts طريقة لعرض المعلومات information المُستخرجة من البيانات الخام data بشكل بصري يساهم في تقديم المعلومة بشكل سهل للمستخدم ويجعل تحليل الأجزاء الكبيرة من البيانات أكثر سهولة، بالإضافة إلى الجاذبية التي تضيفها هذه المخططات على الموقع بسبب الطريقة التفاعلية التي تُقدَّم بها المعلومات.
</p>

<p>
	تُؤمّن مكتبات الجافا سكربت لنا تضمين المخططات إلى موقعنا، والتي تمتاز بسهولة الفهم والتعامل، حيث سنتكلم في هذه المقالة عن أهم 3 مكتبات مفتوحة المصدر مكتوبة بلغة الجافا سكربت ومتخصصة في المخططات البيانية.
</p>

<p>
	في هذه المقالة سنتعلم عن أهم 3 مكتبات مفتوحة المصدر متخصصة في المخططات في الجافاسكربت
</p>

<h2>
	مكتبة chart.js
</h2>

<p>
	إن مكتبة chart.js هي مكتبة مفتوحة المصدر مكتوبة بالجافا سكربت تسمح لنا ببناء مخططات بيانية جميلة متحركة وتفاعلية نستخدمها في تطبيقات الويب، وهي متاحة تحت ترخيص MIT. يمكن يمكن من خلال هذه المكتبة بناء العديد من المخططات والرسوم البيانية المثيرة للإعجاب بمافيها مخططات الأعمدة bar charts، المخططات الخطية line charts، مخططات المساحة area charts، المقاييس الخطية linear scale، المخططات البيانية المبعثرة scatter charts. تمتاز المخططات المبنية بواسطة هذه المكتبة بأنها متجاوبة بشكل كامل مع غالبية الأجهزة، حيث يتم استدعاؤها وتضمينها في صفحة الويب باستخدام عناصر HTML5. سنطرح مثالًا توضيحيًا لطريقة رسم مخطط أعمدة باستخدام هذه المكتبة، حيث سنُضمِّمن مكتبة chart.js الموجودة في content delivery Network (اختصارًا CDN)، مع العلم أن البيانات المذكورة في المثال توضيحية فقط.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
  </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">
    
    </span><span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"bar-chart"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">300" height="</span><span class="pln">150</span><span class="atv">"&gt;</span><span class="tag">&lt;/canvas&gt;</span><span class="pln">

    
    </span><span class="tag">&lt;script&gt;</span><span class="pln">
      
</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Chart</span><span class="pun">(</span><span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"bar-chart"</span><span class="pun">),</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">,</span><span class="pln">
    data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      labels</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">"North America"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Latin America"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Europe"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Asia"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Africa"</span><span class="pun">],</span><span class="pln">
      datasets</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          label</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Number of developers (millions)"</span><span class="pun">,</span><span class="pln">
          backgroundColor</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">"red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"blue"</span><span class="pun">,</span><span class="str">"yellow"</span><span class="pun">,</span><span class="str">"green"</span><span class="pun">,</span><span class="str">"pink"</span><span class="pun">],</span><span class="pln">
          data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="lit">7</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">3</span><span class="pun">]</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">]</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    options</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      legend</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> display</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
      title</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        display</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
        text</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Number of Developers in Every Continent'</span><span class="pln">
      </span><span class="pun">},</span><span class="pln">

      scales</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            yAxes</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[{</span><span class="pln">
                ticks</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    beginAtZero</span><span class="pun">:</span><span class="kwd">true</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}]</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">


</span><span class="pun">});</span><span class="pln">

    </span><span class="tag">&lt;/script&gt;</span><span class="pln">
   
    
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	كما نرى في المثال، يتم إنشاء المخطط وتسمية نوعه عندما أسندنا القيمة bar إلى type (يمكن اختيار نوع المخطط هنا مثلًا يمكن تغيير نوع المخطط إلى horizontalBar)
</p>

<p>
	نسند قيم ألوان الأعمدة من خلال مصفوفة إلى backgroundColor
</p>

<p>
	ونلاحظ أن كل لون أسند إلى اسم العمود الذي يحمل نفس رقم الفهرسة في مصفوفة labels
</p>

<p>
	وسيكون الخرج بالشكل التالي:
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="28725" data-unique="1kr4nfzd7" src="https://academy.hsoub.com/uploads/monthly_2019_01/001.jpg.bad5a603ff78c0f9a1328636782199e4.jpg" alt="001.jpg"></p>

<h2>
	مكتبة Chartist.js
</h2>

<p>
	مكتبة Chartist.js هي هي مكتبة تحريك بسيطة مكتوبة بلغة جافا سكربت تُستخدم لبناء مخططات وتصميمات جميلة متجاوبة وقابلة للتخصيص، وهي مكتبة مفتوحة المصدر تندرج تحت ترخيص MIT و WTFPL.
</p>

<p>
	صممت هذه المكتبة من قبل مجموعة من المطورين الذين كانوا غير راضيين عن الأدوات التي تُستخدم لتصميم المخططات، لذلك قاموا ببناء هذه المكتبة التي توفر ديناميكية رائعة للمصممين والمطورين.
</p>

<p>
	للبدء باستخدام هذه المكتبة ضمن تطبيقنا، نحتاج أولًا لتضمين ملف المكتبة Chartist.js والملف CSS، ويمكننا بعدها البدء ببناء العديد من أنواع المخططات والرسوم البيانية مثل مخططات الأعمدة، المخططات الخطية، بالإضافة إلى أنها إضافة بعض التحريك animation، حيث تقوم باستخدام SVG لاستدعاء وتحريك المخططات ديناميكيًا.
</p>

<p>
	سنطرح هنا مثالًا عن طريقة استخدام هذه المكتبة لبناء مخطط الفطيرة pie chart:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    
    </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/css"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    
    </span><span class="tag">&lt;style&gt;</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">series</span><span class="pun">-</span><span class="pln">a </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">slice</span><span class="pun">-</span><span class="pln">pie </span><span class="pun">{</span><span class="pln">
            fill</span><span class="pun">:</span><span class="pln"> hsl</span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">%,</span><span class="pln"> </span><span class="lit">50</span><span class="pun">%);</span><span class="pln"> </span><span class="com">/* filling pie slices */</span><span class="pln">
            stroke</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln"> </span><span class="com">/*giving pie slices outline */</span><span class="pln">           
            stroke</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">  </span><span class="com">/* outline width */</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">

          </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">series</span><span class="pun">-</span><span class="pln">b </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">slice</span><span class="pun">-</span><span class="pln">pie </span><span class="pun">{</span><span class="pln">
            fill</span><span class="pun">:</span><span class="pln"> hsl</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">%,</span><span class="pln"> </span><span class="lit">60</span><span class="pun">%);</span><span class="pln">
            stroke</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
            stroke</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">

          </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">series</span><span class="pun">-</span><span class="pln">c </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">slice</span><span class="pun">-</span><span class="pln">pie </span><span class="pun">{</span><span class="pln">
            fill</span><span class="pun">:</span><span class="pln"> hsl</span><span class="pun">(</span><span class="lit">120</span><span class="pun">,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">%,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">%);</span><span class="pln">
            stroke</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
            stroke</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">

          </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">series</span><span class="pun">-</span><span class="pln">d </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">slice</span><span class="pun">-</span><span class="pln">pie </span><span class="pun">{</span><span class="pln">
            fill</span><span class="pun">:</span><span class="pln"> hsl</span><span class="pun">(</span><span class="lit">90</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</span><span class="pun">%,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">%);</span><span class="pln">
            stroke</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
            stroke</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">
          </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">series</span><span class="pun">-</span><span class="pln">e </span><span class="pun">.</span><span class="pln">ct</span><span class="pun">-</span><span class="pln">slice</span><span class="pun">-</span><span class="pln">pie </span><span class="pun">{</span><span class="pln">
            fill</span><span class="pun">:</span><span class="pln"> hsl</span><span class="pun">(</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">140</span><span class="pun">%,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">%);</span><span class="pln">
            stroke</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
            stroke</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">

    </span><span class="tag">&lt;/style&gt;</span><span class="pln">
     </span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"ct-chart ct-golden-section"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">

    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

    </span><span class="tag">&lt;script&gt;</span><span class="pln">
       
      </span><span class="kwd">var</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            series</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="lit">45</span><span class="pun">,</span><span class="pln"> </span><span class="lit">35</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">]</span><span class="pln">
            </span><span class="pun">};</span><span class="pln">

      </span><span class="kwd">var</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b </span><span class="pun">};</span><span class="pln">

      </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Chartist</span><span class="pun">.</span><span class="typ">Pie</span><span class="pun">(</span><span class="str">'.ct-chart'</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        labelInterpolationFnc</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">round</span><span class="pun">(</span><span class="pln">value </span><span class="pun">/</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">series</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">(</span><span class="pln">sum</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'%'</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
              </span><span class="pun">});</span><span class="pln">
     </span><span class="tag">&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	تتيح لنا هذه المكتبة استخدام العديد من الأنماط Style المُعرَّفة مسبقًا في ملفات CSS التي قمنا بتضمينها في البداية بدلًا من كتابة الأنماط بشكل كامل يدويًا حيث يمكننا استخدام هذه الأنماط في التحكم بشكل المخطط الذي قمنا ببنائه.
</p>

<p>
	يُستخدم الصف .ct-chart المبني مُسبقًا في CSS لبناء حاوية container للمخطط، ويستخدم الصف .ct-golden-section للحصول على النسبة aspect ratios المستخدمة في تكبير وتصغيير التصميم ليتلائم مع التصميم المتجاوب responsive design وبالتالي يخفف عنا حساب الأبعاد.
</p>

<p>
	واستخدمنا الصف الافتراضي .ct-series-a لتحديد شكل الأقسام الموجودة في المخطط، حيث يمكن استبدال الحرف a للحصول على أشكال أخرى مبنية مُسبقًا.
</p>

<p>
	وقد استخدمنا التابع Chartist.Pie لبناء مخطط الفطيرة، وفي حال كنا نريد بناء شكل نوع آخر من المخططات مثل المخطط الخطي يمكن استخدام التابع Chartist.Line
</p>

<p>
	وسيكون الخرج لهذا الكود بالشكل:
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="28726" data-unique="cfwy1ns5a" src="https://academy.hsoub.com/uploads/monthly_2019_01/002.jpg.793b42f77cdc1c2623a6db48408e0771.jpg" alt="002.jpg"></p>

<h2>
	مكتبة D3.js
</h2>

<p>
	تُعتبر المكتبة D3.js مكتبة أخرى مهمة مفتوحة المصدر مكتوبة بالجافا سكربت. وهي متاحة تحت رخصة BSD.
</p>

<p>
	وتقوم هذه المكتبة التي توفر أيضا تحريك ثلاثي الأبعاد 3D animation باستخدام HTML5، SVG، و CSS كإطار لعملها ضمن صفحة الويب.
</p>

<p>
	تقوم هذه المكتبة على على مبدأ أساسي في العمل وهو بناء مستند (Document Object Model) DOM ثم معالجته بالاعتماد على التوابع والبيانات المتوفرة داخله لنحصل منها على المخطط البياني الذي نريد بناؤه من خلال إحداث تغييرات في المستند.
</p>

<p>
	سنطرح هنا مثال عن مخطط الأعمدة باستخدام هذه المكتبة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
     
    </span><span class="tag">&lt;style&gt;</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">chart div </span><span class="pun">{</span><span class="pln">
      font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">15px</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> lightblue</span><span class="pun">;</span><span class="pln">
      text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
      padding</span><span class="pun">:</span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
      margin</span><span class="pun">:</span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
      color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
      font</span><span class="pun">-</span><span class="pln">weight</span><span class="pun">:</span><span class="pln"> bold</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
        
    </span><span class="tag">&lt;/style&gt;</span><span class="pln">
     </span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"chart"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
    
    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"https://cdnjs.cloudflare.com/ajax/libs/d3/5.5.0/d3.min.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

    </span><span class="tag">&lt;script&gt;</span><span class="pln">

      </span><span class="kwd">var</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">342</span><span class="pun">,</span><span class="lit">222</span><span class="pun">,</span><span class="lit">169</span><span class="pun">,</span><span class="lit">259</span><span class="pun">,</span><span class="lit">173</span><span class="pun">];</span><span class="pln">

      d3</span><span class="pun">.</span><span class="pln">select</span><span class="pun">(</span><span class="str">".chart"</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">selectAll</span><span class="pun">(</span><span class="str">"div"</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">data</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln">
          </span><span class="pun">.</span><span class="pln">enter</span><span class="pun">()</span><span class="pln">
          </span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">"div"</span><span class="pun">)</span><span class="pln">
          </span><span class="pun">.</span><span class="pln">style</span><span class="pun">(</span><span class="str">"width"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">d</span><span class="pun">){</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> d </span><span class="pun">+</span><span class="pln"> </span><span class="str">"px"</span><span class="pun">;</span><span class="pln"> </span><span class="pun">})</span><span class="pln">
          </span><span class="pun">.</span><span class="pln">text</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">d</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> d</span><span class="pun">;</span><span class="pln"> </span><span class="pun">});</span><span class="pln">
       
  
    </span><span class="tag">&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	حيث قمنا أولًا ببناء وسم style يحوي جميع اختياراتنا لشكل المخطط ويتم ربطها مع عقدة DOM لمعالجتها بنفس الطريقة التي يعمل بها jQuery.
</p>

<p>
	بعد حفط البيانات في المستند document يقوم التابع .enter() بالإذن ببدء التطبيق invoke لبناء العقدة الجديدة التي تحمل البيانات
</p>

<p>
	بالنسبة لجميع وكل التوابع التي تلي التابع .enter() فسيتم استدعاؤها من أجل كل عنصر من البيانات.
</p>

<p>
	وسيكون الخرج بالشكل التالي:
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="28727" data-unique="c5l3zzsg9" src="https://academy.hsoub.com/uploads/monthly_2019_01/003.jpg.6bfb6fdbef2d431e17476ea9bd1f67bc.jpg" alt="003.jpg"></p>

<h2>
	الخلاصة
</h2>

<p>
	توفر مكتبات المخططات في الجافا سكربت أدوات فعالة لإظهار البيانات بشكل بصري في الموقع الالكتروني الخاص بك، وهذا يزيد من جمالية وتفاعل الموقع.
</p>

<p>
	ترجمة وبتصرّف للمقال  <a href="https://opensource.com/article/18/9/open-source-javascript-chart-libraries" rel="external nofollow">3 top open source JavaScript chart libraries</a> لصاحبه Dr. Michael J. Garbade
</p>
]]></description><guid isPermaLink="false">653</guid><pubDate>Sun, 27 Jan 2019 10:00:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x646;&#x642;&#x644; &#x628;&#x64A;&#x646; &#x639;&#x642;&#x62F; &#x634;&#x62C;&#x631;&#x629; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D8%A8%D9%8A%D9%86-%D8%B9%D9%82%D8%AF-%D8%B4%D8%AC%D8%B1%D8%A9-dom-r648/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_09/intro.png.42aa19362f8028482ce7f3c8f5f960bc.png" /></p>

<h3>
	مقدمة
</h3>

<p>
	تعلمنا في <a href="https://academy.hsoub.com/programming/javascript/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-dom-r647/" rel="">المقال السابق</a> طريقة الوصول إلى العناصر في DOM  عن كيفية استخدام التوابع الملحقة بالكائن document بهدف الوصول إلى عناصر html بإحدى الطرق التالية: معرف العنصر ID، صف العنصر class، اسم الوسم tag name، أو محددات الاستعلام query selectors.
</p>

<p>
	كما شرحنا في مقال <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">البنية الشجرية لـ DOM</a>  عن العقدة الأب لـ DOM الممثلة بالكائن document، كما تطرقنا إلى شرح مفصل عن العقد الأبناء التي تبنى من خلالها الشجرة وعن أنواعها (العناصر، التعليقات، والنصوص).
</p>

<p>
	ولكننا نحتاج غالبًا للانتقال بين عقد شجرة DOM بدون المرور على جميع العقد التي تسبق العقدة المطلوبة، لذلك سنتحدث في هذه المقالة عن كيفية التنقل في شجرة DOM من الأعلى إلى الأسفل وبالعكس، إضافة إلى التنقل بين أفرع الشجرة من خلال باستخدام تعليمات الجافا سكربت و html.
</p>

<h3>
	الإعداد:
</h3>

<p>
	لنبدأ أولًا بإنشاء ملف nodes.html والذي يحوي التعليمات التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6791_7" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
  </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning About Nodes</span><span class="tag">&lt;/title&gt;</span><span class="pln">

  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    </span><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="com">#dedede; padding: 15px; margin: 15px; }</span><span class="pln">
    html </span><span class="pun">{</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    body </span><span class="pun">{</span><span class="pln"> max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">;</span><span class="pln"> font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#333; }</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Shark World</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">The world's leading source on </span><span class="tag">&lt;strong&gt;</span><span class="pln">shark</span><span class="tag">&lt;/strong&gt;</span><span class="pln"> related information.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Types of Sharks</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;ul&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">Hammerhead</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">Tiger</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li&gt;</span><span class="pln">Great White</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> h1 </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'h1'</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> ul </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'ul'</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	عند فتح هذا الملف من خلال متصفح الانترنت، سنشاهد الصفحة التالية:<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28203" href="https://academy.hsoub.com/uploads/monthly_2018_09/01.png.3f4ced123a0d53345f1d32d27960f17f.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28203" data-unique="5f71p345g" src="https://academy.hsoub.com/uploads/monthly_2018_09/01.thumb.png.da8a0683ec5692339e906ab2e307e2ca.png"></a>
</p>

<p>
	في صفحة الويب هذه لدينا مستند html يحوي على عدد قليل من العناصر وأساسيات css مرفقة به من خلال الوسم style من أجل تحسين طريقة إظهار العناصر، كما قمنا ببناء عدد قليل من المتحولات باستخدام تعليمات الجافا سكربت والتي ذكرت ضمن الوسم script حيث ستساعدنا بالوصول إلى العناصر.
</p>

<p>
	كما نلحظ وجود عنصر واحد من العناصر التالية h1، p، ul لذا يمكن الوصول إليها من خلال الدليل الأول index للتابع getElementsByTagName.
</p>

<h3>
	عقدة الجذر Root Node
</h3>

<p>
	يعتبر الكائن doucment العقدة الجذر root node لجميع العقد في DOM. ولكن في الحقيقة كائن document هو إحدى خصائص الكائن window والذي يمكن تعريفه بأنه كائن عام global وذو مستوى عالي top-level object حيث يمثل تبويب المتصفح الذي يظهر فيه صفحة الويب.
</p>

<p>
	يمكننا من خلال كائن window أن نصل إلى معلومات عن شريط الأدوات، طول وارتفاع النافذة، الرسائل الظاهرة في المتصفح، والإنذارات، في حين أن كائن document يتضمن كل الأحداث والخصائص الأخرى الموجودة داخل window.
</p>

<p>
	يتضمن الجدول المرفق عناصر الجذر التي يمتلكها كل document حتى لو كان ملف html المحمل إلى المتصفح فارغ وهي عبارة عن 3 عقد سيتم إضافتها وتفسيرها في DOM.
</p>
<style type="text/css">
table {
    width: 100%;
}
td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 8px;
}
tr:nth-child(even) {
    background-color: #dddddd;
}	</style>
<table><tbody>
<tr>
<th>
				الخاصية
			</th>
			<th>
				العقدة
			</th>
			<th>
				نوع العقدة
			</th>
		</tr>
<tr>
<td>
				document
			</td>
			<td>
				#document
			</td>
			<td>
				DOCUMENT_NODE
			</td>
		</tr>
<tr>
<td>
				document.documentElement
			</td>
			<td>
				html
			</td>
			<td>
				Element_NODE
			</td>
		</tr>
<tr>
<td>
				getElementsByTagName()
			</td>
			<td>
				head
			</td>
			<td>
				Element_NODE
			</td>
		</tr>
<tr>
<td>
				querySelector()
			</td>
			<td>
				body
			</td>
			<td>
				Element_NODE
			</td>
		</tr>
</tbody></table>
<p>
	وبما أن عناصر html، head، body شائعة جدًا فإنها تمتلك الخصائص الخاصة بها في المستند.
</p>

<p>
	سنقوم بفتح تبويب console ضمن أدوات المطورين DevTools حتى نختبر هذه الخصائص الأربع من خلال كتابتها في console ومشاهدة النتائج. كما يمكننا أيضًا اختبار العناصر h1، p، و ul.
</p>

<h3>
	عقد الآباء Parent Nodes
</h3>

<p>
	لدينا في DOM ثلاث أنواع من العقد معرفة حسب نوع العلاقة فيها بينها وهي الآباء parents، الأبناء children، والشقيقة siblings.
</p>

<p>
	تعرف العقدة الأب parent بأنها أي عقدة تمتلك عقدًا أقل في مستوى level أقل منها في التدرّج الهرمي للـ DOM، أو يمكن تعريفها بأنها العقد الأقرب لعقدة الجذر document.
</p>

<p>
	يمكن الوصول دومًا للعقدة الأب بواسطة إحدى الخاصيتين parentNode أو parentElement.
</p>

<table><tbody>
<tr>
<th>
				Gets
			</th>
			<th>
				Property
			</th>
		</tr>
<tr>
<td>
				ParentNode
			</td>
			<td>
				parentNode
			</td>
		</tr>
<tr>
<td>
				ParentElementNode
			</td>
			<td>
				parentElement
			</td>
		</tr>
</tbody></table>
<p>
	في مثالنا nodes.html نلاحظ أن:
</p>

<ul>
<li>
		html هي العقدة الأب لكل من عقد head، body، و script
	</li>
	<li>
		العقدة body  هي العقدة الأب لكل من h1، h2، و ul ولكنها ليست العقدة الأب لـ li لأنها في المستوى الأقل منها بمستويين.
	</li>
</ul>
<p>
	يمكننا اختبار طريقة الوصول إلى العقدة الأب التي ذكرناها سابقًا، حيث سنقوم بمعرفة أب العنصر p من خلال الخاصية parentNode، وكما نذكر أننا قمنا ببناء المتحول p في التعليمات السابقة وإسناد القيمة document.getElementsByTagName('p')[0] وللوصول للأب نكتب التعليمة التالية في تبويب console
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_10" style="">
<span class="pun">&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="pln">parentNode</span><span class="pun">;</span></pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6791_12" style="">
<span class="pln">Output
► </span><span class="tag">&lt;body&gt;</span><span class="pln">...</span><span class="tag">&lt;/body&gt;</span></pre>

<p>
	ويمكن استعمال parentNode مرتين للوصول إلى جد p.
</p>

<p>
	يمكن الاستعانة بالعديد من الخصائص التي تمكننا من الوصول إلى العقدة الأب ولكن يوجد فيما بينها القليل من الاختلافات كما سنبينها الآن
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_14" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="com">// Assign html object to html variable</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> html </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">;</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">html</span><span class="pun">.</span><span class="pln">parentNode</span><span class="pun">);</span><span class="pln"> </span><span class="com">// &gt; #document</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">html</span><span class="pun">.</span><span class="pln">parentElement</span><span class="pun">);</span><span class="pln"> </span><span class="com">// &gt; null</span></pre>

<p>
	إن الأب لأي عقدة هو من نوع عقدة العنصر element nodes بينما لايمكن للعقد من نوع نص أو تعليقات أن تكون أب لأي عقدة أخرى وبما أن العقدة الأب لـ html هي العقدة الجذر document node لذلك نلاحظ أن القيمة المرجعة هي Null في السطر الأخير من التعليمات.
</p>

<p>
	بشكل عام إن استخدام الخاصية parentNode شائع أكثر في الانتقال ضمن DOM.
</p>

<h3>
	العقد الأبناء Children Nodes
</h3>

<p>
	إن أبناء أي عقدة هي جميع العقد الموجودة في المستوى الذي يليه مباشرة أما العقد الموجود في المستوى الذي يلي مستوى الأبناء تسمى العقد الأحفاد.
</p>

<table><tbody>
<tr>
<th>
				Gets
			</th>
			<th>
				Property
			</th>
		</tr>
<tr>
<td>
				Child Nodes
			</td>
			<td>
				childNodes
			</td>
		</tr>
<tr>
<td>
				First Child Node
			</td>
			<td>
				firstChild
			</td>
		</tr>
<tr>
<td>
				Last Child Node
			</td>
			<td>
				lastChild
			</td>
		</tr>
<tr>
<td>
				Element Child Nodes
			</td>
			<td>
				children
			</td>
		</tr>
<tr>
<td>
				First Child Element Node
			</td>
			<td>
				firstElementChild
			</td>
		</tr>
<tr>
<td>
				Last Child Element Node
			</td>
			<td>
				lastElementChild
			</td>
		</tr>
</tbody></table>
<p>
	إن خاصية ChildNode ستعيد قائمة بأبناء العقدة. على سبيل المثال في ملف nodes.html السابق نلاحظ أن عنصر ul لديه 3 عناصر أبناء من li وبالتالي عند إدخال التعليمة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_16" style="">
<span class="pun">&gt;</span><span class="pln"> ul</span><span class="pun">.</span><span class="pln">childNodes</span><span class="pun">;</span></pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6791_18" style="">
<span class="pln">Output
► (7) [text, li, text, li, text, li, text]</span></pre>

<p>
	نلاحظ أننا حصلنا على قائمة بأبناء العنصر ul والتي تحوي العناصر li الثلاث التي ذكرناها بالإضافة إلى عُقد النصوص text nodes ويعود السبب في ذلك لأننا كتبنا ملف html بطريقة يدوية ولم يتم توليده بواسطة الجافا سكربت. مع العلم أن كل ما يوجد بين العناصر يعتبره DOM عقدة نص text node، ولكن يعمل تبويب Elements الموجودة في أدوات التطوير الخاصة بالمتصفح DevTools بحذف الفراغات البيضاء من النص وبالتالي لا يعتبرها عقد نصوص.
</p>

<p>
	مثلًا إذا حاولنا تغيير لون الخلفية للابن الأول باستخدام خاصية firstChild سنفشل لأن أول عقدة هي نص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_20" style="">
<span class="pun">&gt;</span><span class="pln"> ul</span><span class="pun">.</span><span class="pln">firstChild</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	وستكون رسالة الخطأ هي
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_22" style="">
<span class="typ">Output</span><span class="pln">

</span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">Uncaught</span><span class="pln"> </span><span class="typ">TypeError</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Cannot</span><span class="pln"> </span><span class="kwd">set</span><span class="pln"> property </span><span class="str">'background'</span><span class="pln"> of </span><span class="kwd">undefined</span></pre>

<p>
	لذلك فإن الخصائص children، firstElementChild، و lastElementChild وجدت لكي نستطيع الحصول على العقدة من نوع عنصر element  node  فقط، أي في حال كتابة ul.children سنحصل على مصفوفة تحوي 3 عقد من نوع عنصر هي li.
</p>

<p>
	باستخدام الخاصية firstElementChild سنقوم بتغيير لون الخلفية للعنصر الأول li التي هي ابن للعقدة ul
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_24" style="">
<span class="pun">&gt;</span><span class="pln"> ul</span><span class="pun">.</span><span class="pln">firstElementChild</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	وعند تنفيذ هذه التعليمة سيتغير لون الخلفية<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28204" href="https://academy.hsoub.com/uploads/monthly_2018_09/02.png.448e08a8ace42ad00f40cb8afa1e018b.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28204" data-unique="rbxpbirnj" src="https://academy.hsoub.com/uploads/monthly_2018_09/02.thumb.png.be737db48f20f5a7e139eb036d87cc94.png"></a>
</p>

<p>
	عند معالجة شجرة DOM تظهر بعض الخصائص المفيدة للعناصر element properties.
</p>

<p>
	في تطبيقات الويب التي تم توليدها باستخدام الجافا سكربت الأكثر احتمالًا، هو استخدام الخصائص التي تختار جميع العقد، وفي هذه الحالة الخطوط والمساحات البيضاء لن تكون موجودة.
</p>

<p>
	بالعودة للمثال السابق يمكن استخدام حلقة for ... of من أجل تطبيق اللون الأصفر في الخلف على جميع العناصر الأبناء children.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_26" style="">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let element of ul</span><span class="pun">.</span><span class="pln">children</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  element</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بتطبيق هذه التعليمات سيظهر اللون الأصفر في خلفية جميع الأبناء<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28205" href="https://academy.hsoub.com/uploads/monthly_2018_09/03.png.984d16a7e8d162742adf2d818768010d.png" rel=""><img alt="03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28205" data-unique="x4hdbptfd" src="https://academy.hsoub.com/uploads/monthly_2018_09/03.thumb.png.7632cee4e09ae0b0e2ab98ada087db71.png"></a>
</p>

<p>
	وبما أن العنصر p يمتلك نوعي عقد من الأبناء وهي العناصر والنصوص في داخله، فإنه يمكن للخاصية childNodes أن تكون مفيدة في الوصول إلى لهذه المعلومات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_28" style="">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let element of p</span><span class="pun">.</span><span class="pln">childNodes</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">element</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	حيث سيكون الخرج عبارة عن ثلاثة أسطر كل سطر يمثل ابن للعقدة p
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6791_32" style="">
<span class="pln">Output
"The world's leading source on "
</span><span class="tag">&lt;strong&gt;</span><span class="pln">shark</span><span class="tag">&lt;/strong&gt;</span><span class="pln">
" related information."</span></pre>

<p>
	إن خاصيتي children و childNode تعيد مصفوفة ولكنها لاتمتلك جميع خصائص وتوابع المصفوفات، ولكنها تظهر بشكل مشابه للمصفوفات في الجافا سكربت. ولكن يمكن الوصول إلى العقد من خلال رقم الدليل index أو من خلال خاصية طول المصفوفة length
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_34" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">children</span><span class="pun">[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">lastElementChild</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'fuchsia'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	التعليمة السابقة هي عبارة عن إضافة اللون الفوشي لخلفية العقدة الابن الأخيرة (li) التابعة للعنصر الابن رقم 3 (ul) والتي هي بدورها ابن للعقدة body.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28206" href="https://academy.hsoub.com/uploads/monthly_2018_09/04.png.a46c2d67e534d9b0669b390c0b62e018.png" rel=""><img alt="04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28206" data-unique="f2ed7wmtz" src="https://academy.hsoub.com/uploads/monthly_2018_09/04.thumb.png.e7fb3e836950db665a4b028b66eb994d.png"></a>إن استخدام خصائص الأب والابن تساعد في الوصول إلى أي عقدة ضمن شجرة DOM.
</p>

<h3>
	العقد الشقيقة Sibling Nodes
</h3>

<p>
	العقد الشقيقة sibling of nodes هي العقد الموجودة في نفس المستوى في شجرة DOM ويمكن أن تكون من أنواع مختلفة من العقد سواء عنصر، نص أو تعليق
</p>

<table><tbody>
<tr>
<th>
				Gets
			</th>
			<th>
				Property
			</th>
		</tr>
<tr>
<td>
				Previous Sibling Node
			</td>
			<td>
				previousSibling
			</td>
		</tr>
<tr>
<td>
				Next Sibling Node
			</td>
			<td>
				nextSibling
			</td>
		</tr>
<tr>
<td>
				Previous Sibling Element Node
			</td>
			<td>
				previousElementSibling
			</td>
		</tr>
<tr>
<td>
				Next Sibling Element Node
			</td>
			<td>
				nextElementSibling
			</td>
		</tr>
</tbody></table>
<p>
	إن خصائص العقد الشقيقة تعمل بنفس الطريقة التي تعمل فيها عند العقد الأبناء، حيث نجد مجموعة من الخصائص للتنقل بين العقد بكل أنواعها وهي previousSibling و nextSibling ومجموعة أخرى تساعد على التنقل بين العقد من نوع عناصر فقط وهي previousElementSibling و nextElementSibling.
</p>

<p>
	في مثالنا nodes.html سنختار الابن الأوسط للعنصر ul
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_36" style="">
<span class="kwd">const</span><span class="pln"> tiger </span><span class="pun">=</span><span class="pln"> ul</span><span class="pun">.</span><span class="pln">children</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">
</span></pre>

<p>
	وبما أننا بنينا DOM الخاص بنا من الصفر وليس بناء على تطبيق ويب باستخدام الجافا سكربت فإننا نحتاج لاستخدام خصائص العناصر الأشقاء للوصول إلى عقد العناصر السابقة واللاحقة مع العلم أن الفراغات البيضاء موجودة في DOM كعقد من نوع text
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6791_38" style="">
<span class="pln">tiger</span><span class="pun">.</span><span class="pln">nextElementSibling</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'coral'</span><span class="pun">;</span><span class="pln">

tiger</span><span class="pun">.</span><span class="pln">previousElementSibling</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">background </span><span class="pun">=</span><span class="pln"> </span><span class="str">'aquamarine'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	وبتنفيذ التعليمات السابقة سنلاحظ أن لون الخلفية عند Hammerhead وGreat White قد تغير
</p>

<h3>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28207" href="https://academy.hsoub.com/uploads/monthly_2018_09/05.png.1022c00aae92542411d9b5a985045699.png" rel=""><img alt="05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28207" data-unique="u30i4y3ov" src="https://academy.hsoub.com/uploads/monthly_2018_09/05.thumb.png.8a4d73917080987c78459f7d4464b9f1.png"></a>ملخص
</h3>

<p>
	تحدثنا في هذه المقالة عن كيفية الوصول إلى جميع عناصر مستند HTML وكيفية التحرك بين العقد في شجرة DOM من خلال خصائص العقد الأب، الابن، والشقيقة.
</p>

<p>
	وبهذا ستكون قادرًا على الوصول إلى أي عقدة ضمن شجرة DOM في أي موقع ويب.
</p>

<p>
	 
</p>

<p>
	هذه المقالة ترجمة للمقالة <a href="https://www.digitalocean.com/community/tutorials/how-to-traverse-the-dom" rel="external nofollow">How To Traverse the DOM</a>  للكاتبة Tania Rascia
</p>
]]></description><guid isPermaLink="false">648</guid><pubDate>Sat, 29 Sep 2018 13:45:00 +0000</pubDate></item><item><title>&#x637;&#x631;&#x64A;&#x642;&#x629; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644; &#x644;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x641;&#x64A; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-dom-r647/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_09/intro.png.23b6450104d5698ad932cad09f781e56.png" /></p>

<h3>
	مقدمة
</h3>

<p>
	تحدثنا في المقال السابق عن <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">البنية الشجرية لـ DOM</a> وعن العقد Nodes المكونة لها وهي عبارة عن كائنات objects من الممكن أن تكون نصوص أو تعليقات أو عناصر.
</p>

<p>
	في الغالب يمكن الوصول إلى محتوى DOM من خلال عقد عناصر html، ولمعرفة كيفية الوصول إلى عناصر DOM بشكل احترافي من الضروري امتلاك معلومات كافية عن قواعد وأساسيات css، لذلك سنقوم في هذه المقالة بتعلم كيفية الوصول إلى عناصر DOM من خلال ID والصف class والوسم tag، ومحددات الاستعلام query selectors.
</p>

<h3>
	نظرة عامة
</h3>

<p>
	سنستعرض في هذا المقال خمس توابع methods هي:
</p>

<table><tbody>
<tr>
<th>
				الطرق
			</th>
			<th>
				محدد بناء الجملة
			</th>
			<th>
				يحصل على
			</th>
		</tr>
<tr>
<td>
				getElementById()
			</td>
			<td>
				#demo
			</td>
			<td>
				ID
			</td>
		</tr>
<tr>
<td>
				getElementsByClassName()
			</td>
			<td>
				.demo
			</td>
			<td>
				Class
			</td>
		</tr>
<tr>
<td>
				getElementsByTagName()
			</td>
			<td>
				demo
			</td>
			<td>
				Tag
			</td>
		</tr>
<tr>
<td>
				querySelector()
			</td>
			<td>
				 
			</td>
			<td>
				Selector (single)
			</td>
		</tr>
<tr>
<td>
				querySelectorAll()
			</td>
			<td>
				 
			</td>
			<td>
				Selector (all)
			</td>
		</tr>
</tbody></table>
<p>
	من المهم عند دراستنا ل DOM أن تقوم بتطبيق الأمثلة على حاسبك للتأكد من فهم جميع المعلومات بشكل جيد.<br>
	سنبدأ بإنشاء ملف access.html في مجلد المشروع والذي سنقوم بتطبيق جميع أمثلتنا عليه في هذه المقالة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_7" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"utf-8"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width, initial-scale=1.0"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;title&gt;</span><span class="pln">Accessing Elements in the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">

  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    html </span><span class="pun">{</span><span class="pln"> font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#333; }</span><span class="pln">
    body </span><span class="pun">{</span><span class="pln"> max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln"> padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">15px</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    div</span><span class="pun">,</span><span class="pln"> article </span><span class="pun">{</span><span class="pln"> padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln"> border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="com">#dedede; }</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Accessing Elements in the DOM</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">ID (#demo)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by ID</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Class (.demo)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (2)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Tag (article)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (1)</span><span class="tag">&lt;/article&gt;</span><span class="pln">
  </span><span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (2)</span><span class="tag">&lt;/article&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Query Selector</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo-query"</span><span class="tag">&gt;</span><span class="pln">Access me by query</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Query Selector All</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (2)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	في ملف html هذا نلاحظ أن لدينا العديد من العناصر التي يمكن الوصول إليها من خلال توابع method الخاصة بـ document وعند فتح هذا الملف في المتصفح سيكون مشابه لهذه الصفحة:<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28188" href="https://academy.hsoub.com/uploads/monthly_2018_09/01.png.c94f7b071258e75451495509d254a8d0.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28188" data-unique="r74iuyttl" src="https://academy.hsoub.com/uploads/monthly_2018_09/01.thumb.png.8b9bb1607407441b84a9183e4a3e693d.png"></a>
</p>

<p>
	سنستخدم العديد من التوابع methods التي ذكرناها في المقال سابقًا للوصول إلى العناصر المتاحة في هذا الملف.
</p>

<h3>
	الوصول للعناصر باستخدام ID
</h3>

<p>
	أسهل طريقة للوصول إلى عنصر محدد في DOM هو المعرف الخاص بها ID(Identification). حيث يمكن الوصول إلى العنصر من خلال ID باستخدام التابع getElementById() مع العنصر document.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_9" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">();</span></pre>

<p>
	ولكن للحصول على هذه الخاصية في الوصول إلى العنصر من خلال id يجب أولًا إضافة الصفة id للعنصر. مثلًا سنضيف المعرف demo للعنصر div
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_11" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by ID</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span></pre>

<p>
	الآن في تبويب console سنقوم بالوصول إلى العنصر واسناده للمتحول demoId
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_13" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> demoId </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'demo'</span><span class="pun">);</span><span class="pln">
</span></pre>

<p>
	في حال تمرير المتحول demoId إلى تابع log سنحصل على عنصر html كاملًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_15" style="">
<span class="pun">&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">demoId</span><span class="pun">);</span><span class="pln">
</span></pre>

<p>
	سيكون الخرج عندها العنصر كاملًا
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_17" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by ID</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span></pre>

<p>
	للتأكد من وصولنا إلى العنصر الصحيح سنقوم بتغيير حدود العنصر border property إلى اللّون البنفسجي
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_19" style="">
<span class="pun">&gt;</span><span class="pln"> demoId</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid purple'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	وعند تنفيذ هذه التعليمات سنلاحظ أن حدود العنصر قد تغيرت إلى اللّون البنفسجي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28189" href="https://academy.hsoub.com/uploads/monthly_2018_09/02.png.5a863c233fbe395a3c232555e776abe3.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28189" data-unique="9c5v5upx6" src="https://academy.hsoub.com/uploads/monthly_2018_09/02.thumb.png.73315db666ceda3b0ea3b20e5273a7ca.png"></a>
</p>

<p>
	إن الوصول إلى أي عنصر من خلال ID الخاص به هي أكثر طريقة فعالة وسريعة للوصول إلى عنصر ضمن DOM، ومع ذلك هذه الطريقة لديها عدة عيوب وهي أن ID دائمًا يجب أن يكون متفردًا في الصفحة ولذلك لا يمكن الوصول إلا إلى عنصر واحد فقط من خلال التابع getElementById. ولذلك في حال الحاجة إلى إضافة تابع لأكثر من عنصر في الصفحة فإن إضافته باستخدام id سيؤدي إلى تكرار كتابة التابع لكل عنصر على حدى.
</p>

<h3>
	الوصول للعناصر باستخدام class
</h3>

<p>
	تستخدم خاصية class للوصول إلى عنصر أو أكثر في DOM وذلك من خلال التابع getElementByClassName()
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_21" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">getElementsByClassName</span><span class="pun">();</span></pre>

<p>
	ونستطيع من خلال الخاصية class الوصول إلى أكثر من عنصر، كما في هذا المثال حيث سنعطي لعنصرين نفس اسم الصف demo
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_23" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (2)</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	الآن في تبويبة console سنبني متحول demoClass ونسند له العناصر التي استطعنا الوصول إليها من خلال اسم الصف demo
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_25" style="">
<span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> demoClass </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByClassName</span><span class="pun">(</span><span class="str">'demo'</span><span class="pun">);</span><span class="pln">
</span></pre>

<p>
	والآن أصبح بالإمكان الوصول إلى العناصر وتعديلها باستخدام class كما فعلنا في المثال السابق باستخدم ID.
</p>

<p>
	سنقوم الآن بتغيير خاصية الحدود border من خلال المتحول demoClass،
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_50" style="">
<span class="pln">demoClass</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid orange'</span><span class="pun">;</span></pre>

<p>
	ولكن ستظهر لنا رسالة خطأ بأنه لا يمكن تحديد العنصر
</p>

<pre class="ipsCode" id="ips_uid_6168_31">
Output

Uncaught TypeError: Cannot set property 'border' of undefined</pre>

<p>
	والسبب في هذا الخطأ أن المتحول demoClass لايحوي عنصرًا واحدًا فقط وإنما مصفوفة كائنات من هذه العناصر
</p>

<p>
	للتأكد من ذلك سنكتب التعليمة التالية لمعرفة عدد عناصر المصفوفة المُسند إلى deomClass
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_48" style="">
<span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">demoClass</span><span class="pun">);</span></pre>

<p>
	والخرج سيكون هو عدد العناصر في المصفوفة
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_35" style="">
<span class="pln">Output

(2) [div.demo, div.demo]</span></pre>

<p>
	حتى نستطيع الوصول إلى العناصر بشكل صحيح يجب أن نتعامل مع المتحول demoClass على أنه <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">مصفوفة جافا سكربت</a> يتم الوصول إليها من خلال رقم دليل العنصر index number.<br>
	الآن نستطيع تغيير حدود كل العنصر الأول في المصفوفة باستخدام رقم الدليل 0
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_46" style="">
<span class="pln">demoClass</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid orange'</span><span class="pun">;</span></pre>

<p>
	بشكل عام للوصول إلى العناصر من خلال الصف calss سنقوم بتغيير جميع العناصر التي تمتلك نفس اسم الصف باستخدام حلقة for التي تقوم بالمرور على جميع العناصر التي تحويها المصفوفة
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_43" style="">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> demoClass</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

     demoClass</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">lpx solid orange</span><span class="pun">’;</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	وعند تنفيذ هذه التعليمات سيصبح شكل صفحة الويب<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28190" href="https://academy.hsoub.com/uploads/monthly_2018_09/03.png.539af1949eac56a6efba9d9514507cf9.png" rel=""><img alt="03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28190" data-unique="af1ni2uet" src="https://academy.hsoub.com/uploads/monthly_2018_09/03.thumb.png.5abd454a3617b57e9460de3497381ac6.png"></a><br>
	 
</p>

<p>
	إذًا استطعنا الوصول إلى جميع العناصر التي تمتلك الصف demo وتغيير خاصية حدودها border إلى اللّون البرتقالي.
</p>

<h3>
	الوصول للعناصر باستخدام Tag
</h3>

<p>
	طريقة الوصول للعنصر من خلال اسم الوسم html tag name هو أقل الطرق تخصيصًا حيث يمكننا الوصول إلى العديد من العناصر باستخدام تابع getElementsByTagName()<br>
	 
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_52" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">();</span></pre>

<p>
	سنستخدم كمثال هنا العنصر article للوصول إليه من خلال اسم الوسم، نلاحظ العنصرين الذين يحملان اسم الوسم article
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_54" style="">
<span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (1)</span><span class="tag">&lt;/article&gt;</span><span class="pln">

</span><span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (2)</span><span class="tag">&lt;/article&gt;</span></pre>

<p>
	وبنفس الطريقة التي وصلنا للعناصر من خلال اسم الصف class فإن التابع getElementsByTagName تعيد لنا مصفوفة array من العناصر حيث يمكن تعديل كل tag في المستند من خلال حلقة for
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_56" style="">
<span class="kwd">const</span><span class="pln"> demoTag </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(‘</span><span class="pln">article</span><span class="pun">’);</span><span class="pln">

 </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> demoTag</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

     demoTag</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="lit">1px</span><span class="pln"> solid blue</span><span class="pun">’;</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	وبمجرد تنفيذ هذه التعليمات سيصبح شكل صفحة الويب بالشكل<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28191" href="https://academy.hsoub.com/uploads/monthly_2018_09/04.png.850487674d4148b36c82f800253a5cdf.png" rel=""><img alt="04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28191" data-unique="r4v5b22zu" src="https://academy.hsoub.com/uploads/monthly_2018_09/04.thumb.png.70394a709f5ad18e4ab8842efcf798ba.png"></a>
</p>

<p>
	وهكذا قمنا بتعديل خاصية الحدود border لجميع العناصر article إلى اللّون الأزرق.
</p>

<p>
	محددات الاستعلام Query Selector
</p>

<p>
	في حال كان لديك خبرة سابقة في jQuery <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> ربما ستكون لديك معرفة سابقة مع توابع jQuery التي تستطيع الوصول لعناصر DOM من خلال محددات css
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_58" style="">
<span class="pln">$</span><span class="pun">(</span><span class="str">'#demo'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// returns the demo ID element in jQuery</span><span class="pln">
</span></pre>

<p>
	يمكننا الحصول على نفس النتيجة في الجافا سكربت من خلال استخدام التوابع querySelector() و querySelectorAll()
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_60" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">();</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">();</span></pre>

<p>
	للوصول إلى عنصر واحد نستخدم تابع querySelector. فمثلًا يمكننا الوصول إلى العنصر الذي لديه المعرف demo-query من خلال التابع querySelector()
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_62" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo-query"</span><span class="tag">&gt;</span><span class="pln">Access me by query</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span></pre>

<p>
	حيث نمرر للتابع المعرف id مع إضافة الرمز #، وسنقوم بإسناد العنصر للثابت demoQuery
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_64" style="">
<span class="kwd">const</span><span class="pln"> demoQuery </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'#demo-query'</span><span class="pun">);</span></pre>

<p>
	ولكن في حالة استخدمنا التابع السابق مع المحددات التي تعطينا أكثر من عنصر واحد مثل class أو tag فإن querySelector() سيعيد لنا العنصر الأول فقط الذي يتطابق مع الاستعلام، ولكن نستطيع استخدام التابع querySelectorAll() من أجل الحصول على جميع العناصر المتطابقة مع الاستعلام.
</p>

<p>
	في مثالنا نلاحظ أن لدينا عنصرين يملكان اسم الصف demo-query-all
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_66" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (2)</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	إن اسم المحدد للخاصية class يجب أن يسبق بنقطة عند تمريره للتابع querySelectorAll() أي سنمرر في هذا المثال .demo-query-all
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_68" style="">
<span class="kwd">const</span><span class="pln"> demoQueryAll </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'.demo-query-all'</span><span class="pun">);</span><span class="pln">
</span></pre>

<p>
	باستخدام التابع forEach() يمكننا تطبيق اللّون الأخضر على حدود هذه العناصر
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_74" style="">
<span class="pln">deomQueryAll</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">query </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

     query</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="lit">1px</span><span class="pln"> solid green</span><span class="pun">’;</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28192" href="https://academy.hsoub.com/uploads/monthly_2018_09/05.png.d27c84e2c9870450069e5a7d5e24f8e2.png" rel=""><img alt="05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28192" data-unique="15on1ip5d" src="https://academy.hsoub.com/uploads/monthly_2018_09/05.thumb.png.195f931433a181ca984de6e124c3aa02.png"></a>
</p>

<p>
	تعتبر الفاصلة , في حال وضعناها بين القيم للتابع querySelector() كعملية OR مثلاً إذا قمنا بكتابة التابع بالشكل querySelector(‘div, article’) أي تعني أن يجد لنا العنصر div أو article بغض النظر عمن سيظهر أولًا في الملف.
</p>

<p>
	أما في حالة وجود الفاصلة بين القيم للتابع querySelectorAll فإنها تعني العملية AND أي في حال كتبنا التابع querySelectroAll(‘div, article’)  فإنها تعني إعادة العناصر التي تحوي القيم articl و div الموجودة ضمن المستند.
</p>

<p>
	إن استخدام توابع محددات الاستعلامات يعطينا القدرة العالية في البرمجة للوصول إلى أي عنصر أو مجموعة عناصر ضمن DOM بنفس المحددات التي نستخدمها في ملف css. وفي <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors" rel="external nofollow">هذه المقالة</a> يوجد قائمة بجميع المحددات الخاصة بال css التي جمعت بواسطة شبكة مطوري Mozilla.
</p>

<h3>
	تعليمات الجافا سكربت كاملة
</h3>

<p>
	سأذكر هنا التعليمات التي كتبناها بلمف access.js بشكل كامل. حيث يمكن إضافة ملف js إلى ملف html قبل إغلاق body.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6168_78" style="">
<span class="com">// Assign all elements</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoId </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'demo'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoClass </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByClassName</span><span class="pun">(</span><span class="str">'demo'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoTag </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'article'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoQuery </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'#demo-query'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> demoQueryAll </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'.demo-query-all'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// Change border of ID demo to purple</span><span class="pln">
demoId</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid purple'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Change border of class demo to orange</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> demoClass</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  demoClass</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid orange'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// Change border of tag demo to blue</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> demoTag</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  demoTag</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid blue'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// Change border of ID demo-query to red</span><span class="pln">
demoQuery</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid red'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Change border of class query-all to green</span><span class="pln">
demoQueryAll</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">query </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  query</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">border </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1px solid green'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وسيكون الشكل النهائي لملف html هو
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6168_80" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"utf-8"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width, initial-scale=1.0"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;title&gt;</span><span class="pln">Accessing Elements in the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">

  </span><span class="tag">&lt;style&gt;</span><span class="pln">
    html </span><span class="pun">{</span><span class="pln"> font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln"> color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#333; }</span><span class="pln">
    body </span><span class="pun">{</span><span class="pln"> max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln"> padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">15px</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    div</span><span class="pun">,</span><span class="pln"> article </span><span class="pun">{</span><span class="pln"> padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln"> margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln"> border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="com">#dedede; }</span><span class="pln">
  </span><span class="tag">&lt;/style&gt;</span><span class="pln">

</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Accessing Elements in the DOM</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">ID (#demo)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by ID</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Class (.demo)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo"</span><span class="tag">&gt;</span><span class="pln">Access me by class (2)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Tag (article)</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (1)</span><span class="tag">&lt;/article&gt;</span><span class="pln">
  </span><span class="tag">&lt;article&gt;</span><span class="pln">Access me by tag (2)</span><span class="tag">&lt;/article&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Query Selector</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"demo-query"</span><span class="tag">&gt;</span><span class="pln">Access me by query</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Query Selector All</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (1)</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"demo-query-all"</span><span class="tag">&gt;</span><span class="pln">Access me by query all (2)</span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"access.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	 
</p>

<h3>
	ملخص
</h3>

<p>
	في هذه المقالة تعلمنا 5 طرق للوصول إلى عناصر html الموجودة في DOM وهي من خلال المعرف ID، الصف class، الوسم html tag name، ومن خلال المحددات selector.
</p>

<p>
	التوابع التي يمكن استخدامها للحصول على عنصر أو مجموعة عناصر تعتمد على مدى دعم المتصفح المستخدم لها وعدد العناصر التي تتم معالجتها.
</p>

<p>
	والآن يمكنك الوصول إل عناصر html الموجودة في المستند باستخدام الجافا سكربت و DOM.
</p>

<p>
	 
</p>

<p>
	هذه المقالة هي ترجمة للمقالة <a href="https://www.digitalocean.com/community/tutorials/how-to-access-elements-in-the-dom" rel="external nofollow">How To Access Elements in the DOM</a> وكاتبتها Tania Rascia.
</p>

<p>
	 
</p>
<style type="text/css">
table {
    width: 100%;
}
td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 8px;
}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
]]></description><guid isPermaLink="false">647</guid><pubDate>Thu, 27 Sep 2018 12:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x634;&#x62C;&#x631;&#x64A;&#x629; &#x644;&#x640; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_09/under.png.c0399ff21222cf362dfbd67042cfaf64.png" /></p>
<div class="is-node" id="write">
	<h3>
		<a class="md-header-anchor " name="header-n2" rel=""></a>مقدمة
	</h3>

	<p>
		عندما نتكلم عن DOM فإننا نتكلم عن بنية شجرية تحوي العديد من الكائنات objects التي تدعى العقد nodes.
	</p>

	<p>
		لقد تكلمنا في المقال السابق (مدخل إلى DOM) عن تعريف DOM وكيفية الوصول إلى الكائن document وطريقة تعديل خصائصه من خلال console بالإضافة إلى إيضاح الفرق بين ماهية HTML و DOM.
	</p>

	<p>
		في هذه المقالة فسنتحدث عن مصطلحات HTML التي تعتبر قواعد أساسية للتنسيق برمجة موقع الويب الذي يتضمن html، الجافا سكربت ومفاهيم DOM. حيث سنتعلم من خلال هذا المقال كيفية بناء شجرة DOM و كيفية إضافة العقد الخاصة بها Nodes حسب نوعها، أخيرًا سنقوم ببناء برنامج باستخدام الجافا سكربت بدلًا من استخدام console وذلك لتعديل DOM.
	</p>

	<h3>
		<a class="md-header-anchor " name="header-n7" rel=""></a>مصطلحات HTML
	</h3>

	<p>
		إن فهم مصطلحات Html و الجافا سكربت تعتبر أمرًا ضروريًا لفهم كيفية العمل مع DOM. ولذلك سنقوم بمراجعة بعض مصطلحات html
	</p>

	<p>
		سنبدأ أولًا بالنظر إلى عنصر html التالي
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_8" style="">
<span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"index.html"</span><span class="tag">&gt;</span><span class="pln">Home</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span></pre>

	<p>
		إن عنصر html السابق a هو عبارة عن عنصر يُضاف لربط صفحة الويب الخاصة بنا بصفحة أو محتوى آخر، في هذا المثال لتحقيق إمكانية الوصول إلى صفحة index.html
	</p>

	<ul>
<li>
			a هو الوسم tag
		</li>
		<li>
			href هو الصفة attribute
		</li>
		<li>
			index.html هو قيمة الصف
		</li>
		<li>
			home هو النص الذي نضيفه للعنصر
		</li>
	</ul>
<p>
		كل ماهو موجود بين علامتي &lt;&gt; هو عبارة عن عنصر html
	</p>

	<p>
		سنعمل على صفحة index.html التي بنيناها بالمقالة السابقة
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_10" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">

  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

	<p>
		إن الطريقة الأسهل للوصول إلى عنصر عبر الجافا سكربت هي استخدام الصفة id ويمكننا ربط أي عنصر في html بـ id خاص به، فمثلًا سنقوم بإضافة id خاص بالعنصر a في المثال السابق وقيمتها هي nav
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_12" style="">
<span class="pln">...
</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"nav"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"index.html"</span><span class="tag">&gt;</span><span class="pln">Home</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
...</span></pre>

	<p>
		الآن سنقوم بتحميل إو إعادة تحميل صفحة index.html للتأكد بتعديل DOM الخاص بصفحتنا التي عدلناها.
	</p>

	<p>
		سنستخدم التابع getElementById() للوصول إلى العنصر كاملًا من خلال كتابة التعليمة التالية في تبويبة console
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_14" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'nav'</span><span class="pun">);</span><span class="pln">
</span></pre>

	<p>
		عندها سيكون الخرج في تبويبة console بالشكل
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_16" style="">
<span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"nav"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"index.html"</span><span class="tag">&gt;</span><span class="pln">Home</span><span class="tag">&lt;/a&gt;</span></pre>

	<p>
		حيث نلاحظ أننا حصلنا على العنصر كاملآ من خلال استخدام تابع getElementById() ، ولكن يمكننا إسناد عنصر html إلى متحول variable للوصول إليه بشكل أسرع من استخدام التابع السابق.
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_18" style="">
<span class="pln">let navLink </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'nav'</span><span class="pun">);</span><span class="pln">
</span></pre>

	<p>
		وهكذا أصبح navLink هو عبارة عن متحول يحوي على عنصر a الخاص وبالتالي يمكننا تعديل الصفات attribute التي يحويها وقيمها بسهولة، فمثلًا يمكننا تعديل قيمة الصفة href بالشكل التالي
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_20" style="">
<span class="pln">navLink</span><span class="pun">.</span><span class="pln">href </span><span class="pun">=</span><span class="pln"> </span><span class="str">'https://www.wikipedia.org'</span><span class="pun">;</span></pre>

	<p>
		كما يمكننا تعديل المحتوى النصي للمتحول من خلال إعادة إسناد قيمة نصية جديدة للخاصية textContent
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_22" style="">
<span class="pln">navLink</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Navigate to Wikipedia'</span><span class="pun">;</span></pre>

	<p>
		الآن عندما سنستعرض العنصر a إما من خلال console أو من خلال تمرير الفأة على الوسم a سنشاهد كيف تم تعديل العنصر
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_24" style="">
<span class="pln">navLink</span><span class="pun">;</span></pre>

	<p>
		وسيكون الخرج هو
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_30" style="">
<span class="pln">Output
</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"nav"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.wikipedia.org/"</span><span class="tag">&gt;</span><span class="pln">Navigate to Wikipedia</span><span class="tag">&lt;/a&gt;</span></pre>

	<p>
		كما سنشاهد أن هذه سينعكس على شكل واجهة الموقع
	</p>

	<p>
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28182" href="https://academy.hsoub.com/uploads/monthly_2018_09/01.png.615f12b7557573797150c3f08804f6be.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28182" data-unique="a2dfb0btg" src="https://academy.hsoub.com/uploads/monthly_2018_09/01.thumb.png.3c068b985e9bfd700d3a6392adb11cd7.png"></a>
	</p>

	<p>
		ولكن عند تحديث الصفحة سيتم التراجع عن كل التعديلات التي قمنا بها.
	</p>

	<p>
		وبنهاية هذه الفقرة يجب أن نكون قد تعلمنا كيفية التعامل مع توابع document وطريقة الوصول إليها وإسناد العنصر إلى متحول وتغيير الصفات الخاصة بالعنصر من خلال استخدام المتحول المُسند إليه.
	</p>

	<h3>
		<a class="md-header-anchor " name="header-n58" rel=""></a>شجرة DOM والعقد المكونة لها
	</h3>

	<p>
		تعرف جميع العناصر التي تنتمي لل DOM كعقد nodes ولها أنواع متعددة لكن يوجد 3 أنواع هي الأكثر استخداما
	</p>

	<ul>
<li>
			عقد العنصر Element nodes
		</li>
		<li>
			عقد النص Text nodes
		</li>
		<li>
			عقد التعليقات Comment nodes
		</li>
	</ul>
<p>
		عندما يتم تمثيل عنصر html كعنصر داخل DOM سنشير له بأنه عقدة العنصر element nodes، وأي نص خارج هذا العنصر سنشير له بأنه عقدة النص text node، وأخيرًا التعليقات التي نكتبها داخل html سنشي لها في DOM بأنها عقد التعليقات Comment node.
	</p>

	<p>
		بالإضافة إلى هذه الأنواع الثلاثة تعتبر document بأنها عقدة قائمة بذاتها تسمى document node والتي تعتبر بأنها جذر العقد الأخرى كافة التي يحتويها ملف DOM.
	</p>

	<p>
		إذًا يتضمن DOM بنية شجرية تحوي العديد من القعد المتداخلة والتي غالبًا ما يشار لها بشجرة DOM أو DOM tree وتشبه بنيتها إلى حد كبير بنية شجرة العائلة التي تضمن الآباء، الأبناء والأشقاء وتلك هي الحال أيضًا بالنسبة للعلاقة بين عقد شجرة DOM.
	</p>

	<p>
		لنرى هذه العلاقات بين عقد شجرة DOM بشكل عملي سنقوم ببناء ملف nodes.html والتي يحوي على أنواع العقد الثلات: عقد النص text، التعليقات comment والعناصر element
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_28" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">

  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning About Nodes</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">

  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">An element node</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
    </span><span class="com">&lt;!-- a comment node --&gt;</span><span class="pln">
    A text node.
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

	<p>
		عقدة العنصر html هي العقدة الأب parent node أما عقد العناصر head و body فهي عقد أشقاء وأبناء للقعدة html. أما عقدة body فهي تملك 3 عقد أبناء وهي جميعها عقد أخوة، مع العلم أن نوع العقدة لايؤثر على مستواها.
	</p>

	<p>
		<u><strong>ملاحظة:</strong></u> {.underline} عند العمل مع DOM المولد من قبل html فإن كثرة الفراغات المضافة إلى تعليمات html سيؤدي إلى خلق العديد من عقد النصوص text nodes الفارغة. والتي لاتظهر في تبويبة "Elements" الموجودة في DevTools في chrome.
	</p>

	<h3>
		تمييز نوع العقدة
	</h3>

	<p>
		كل العقد في المستند document تملك نوع مخصص والتي يمكن الحصول عليها من خلال الخاصية nodeType. قامت شبكة مطوري Mozilla بتحديث قائمتها لـ <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType" rel="external nofollow">ثوابت نوع العقدة</a>. وسنذكر هنا قائمة بأكثر أنواع العقد الشائعة وكيفية التعامل معها في هذه المقال
	</p>

	<table style="width:100%"><tbody>
<tr>
<th>
					نوع العقدة
				</th>
				<th>
					القيمة
				</th>
				<th>
					مثال
				</th>
			</tr>
<tr>
<td>
					عقدة العنصر ELEMENT_NODE
				</td>
				<td>
					1
				</td>
				<td>
					العنصر &lt; body &gt;
				</td>
			</tr>
<tr>
<td>
					عقدة النص TEXT_NODE
				</td>
				<td>
					3
				</td>
				<td>
					أي نص ليس جزء من العنصر
				</td>
			</tr>
<tr>
<td>
					عقدة التعليق COMMENT_NODE
				</td>
				<td>
					8
				</td>
				<td>
					&lt; !--- html comment --- &gt;
				</td>
			</tr>
</tbody></table>
<p>
		<br>
		في تبويبة "Elemnets" الموجودة في أدوات المطوريين قد تلاحظ أنه في حال قمت بالضغط على أي عنصر في DOM وتم تظليله فستلاحظ أنه سيظهر بجانبه القيمة ==$0 ولذلك فإن أحد الطرق السهلة للوصول إلى العنصر النشيط من خلال أدوات التطوير هو كتابة $0.
	</p>

	<p>
		في تبويبة "console" الخاصة بالصفحة nodes.html سنقوم بالضغط على أول عنصر موجود في body وهو h1
	</p>

	<p>
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28183" href="https://academy.hsoub.com/uploads/monthly_2018_09/02.png.d184d31606debb89725a13ba0387fff2.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28183" data-unique="xejtv90ly" src="https://academy.hsoub.com/uploads/monthly_2018_09/02.thumb.png.2fba2fd4390c9c44f2630e4cb2be12e5.png"></a>الآن سنحصل على نوع العقدة المفعلة حاليًا وذلك من خلال الوصول إليها عبر خاصية nodeType لذلك ندخل التعليمة التالية في console
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_32" style="">
<span class="pln">$0</span><span class="pun">.</span><span class="pln">nodeType</span><span class="pun">;</span></pre>

	<p>
		وسيكون عندها الخرج هو 1 بالشكل التالي
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_34" style="">
<span class="pln">Output

1</span></pre>

	<p>
		وجدنا أن الخرج هو 1 المرتبط بالعنصر المختار h1 والذي يشير إلى نوع ELEMENT_NODE. وبتجربة التعليمة السابقة على نص أو تعليق في ملف HTML فإننا سنحصل على الخرج 3 و 8 بالترتيب.
	</p>

	<p>
		كما يمكننا الحصول على نوع العقدة من دون الحاجة إلى تظليل العنصر في DOM قبل معرفته وذلك من خلال التعليمة
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_36" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">nodeType</span><span class="pun">;</span></pre>

	<p>
		حيث سيكون الخرج هو 1 أيضًا.
	</p>

	<p>
		بالإضافة إلى الخاصية nodeType، يمكن استخدام الخاصية nodeValue للحصول على القيمة أو التعليق في عقد النص والتعليق، كما أن الخاصية nodeName تساعدنا في الحصول على اسم الوسم الخاص بالعنصر.
	</p>

	<h3>
		<a class="md-header-anchor " name="header-n106" rel=""></a>تعديل DOM باستخدام الأحداث
	</h3>

	<p>
		تعرفنا إلى الآن إلى كيفية تعديل DOM من خلال console ولكن هذا التعديل مؤقت فبمجرد تحديث صفحة الويب ستُلغى هذه التعديلات. في المقالة مدخل إلى DOM استخدمنا console من أجل تعديل لون خلفية الشاشة، الآن يمكن الجمع بين ما تعلمناه سابقًا مع المعلومات في هذه المقالة لبناء زر تفاعلي عندما يتم الضغط عليه.
	</p>

	<p>
		بالعودة إلى ملف index.html سنضيف زر من خلال العنصر button ونضيف له id كما أننا سنضيف رابط جديد لملف جافا سكربت موجود في المجلد js/scripts.js
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3421_38" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">

  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln"> 
    </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"changeBackground"</span><span class="tag">&gt;</span><span class="pln">Change Background Color</span><span class="tag">&lt;/button&gt;</span><span class="pln">

    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"scripts.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

	<p>
		يعرف الحدث event في الجافا سكربت بأنه الفعل الذي يقوم به المستخدم كمثال عندما يقوم المستخدم بتمرير الفأرة فوق عنصر، الضغط على عنصر، أو الضغط على زر معين في لوحة المفاتيح.
	</p>

	<p>
		في هذا المثال نريد للزر الذي بنيناه أن ينتظر ويكون مستعدًا لتلقي الفعل من قبل المستخدم من خلال استخدام event listener للزر.
	</p>

	<p>
		أولًا نقوم ببناء ملف scripts.js ونحفظه في مجلد js ثم سنضيف تعليمات الجافا سكربت التي تقوم بإيجاد العنصر وإسناده إلى متحول
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_40" style="">
<span class="pln">let button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'changeBackground'</span><span class="pun">);</span><span class="pln">
</span></pre>

	<p>
		ثم نضيف التابع addEventListener الذي يعمل على جعل الزر ينتظر حتى يتم الضغط عليه من أجل تنفيذ التابع function الذي يقوم بالفعل في هذا المثال الفعل هو تغيير لون الخلفية.
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_42" style="">
<span class="pun">...</span><span class="pln">

button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="com">// action will go here</span><span class="pln">

</span><span class="pun">});</span></pre>

	<p>
		حيث سنكتب داخل التابع function التعليمة الخاصة بتغيير لون الخلفية إلى لون fuchsia
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_44" style="">
<span class="pun">...</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">backgroundColor </span><span class="pun">=</span><span class="pln"> </span><span class="str">'fuchsia'</span><span class="pun">;</span></pre>

	<p>
		حيث ستكون التعليمات بالترتيب كما يلي
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3421_46" style="">
<span class="pln">let button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'changeBackground'</span><span class="pun">);</span><span class="pln">

button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">backgroundColor </span><span class="pun">=</span><span class="pln"> </span><span class="str">'fuchsia'</span><span class="pun">;</span><span class="pln">

</span><span class="pun">});</span></pre>

	<p>
		وحالما نقوم بحفظ هذا الملف وإعادة تحديث ملف index.html ثم الضغط على زر الموجود في الشاشة فإن الحدث event الذي صممناه لتغير لون الخلفية سوف يعمل مباشرة.
	</p>

	<p>
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28184" href="https://academy.hsoub.com/uploads/monthly_2018_09/03.png.b391e0626dba06c83e2e08ec6848f763.png" rel=""><img alt="03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28184" data-unique="yfoc5ypf3" src="https://academy.hsoub.com/uploads/monthly_2018_09/03.thumb.png.a61b878f230effdbc108b8b3975fca93.png"></a>
	</p>

	<h3>
		<a class="md-header-anchor " name="header-n139" rel=""></a>ملخص
	</h3>

	<p>
		في هذه المقالة قمنا باستذكار المصطلحات التي تساعدنا على فهم وتعديل DOM كما تعرفنا على البنية الشجرية لل DOM وأنواع العقد المستخدمة في إنشائها مثل عناصر html، النصوص، والتعليقات. كما قمنا في النهاية بإنشاء سكربت يسمح للمستخدم بتعديل شكل الموقع من دون الحاجة إلى إدخال التعليمات يدويًا إلى تبويبة console.
	</p>

	<p>
		هذه المقالة هي ترجمة للمقالة <a href="https://www.digitalocean.com/community/tutorials/understanding-the-dom-tree-and-nodes" rel="external nofollow">Understanding the DOM Tree and Nodes</a> وكاتبتها <a href="https://www.digitalocean.com/community/users/taniarascia" rel="external nofollow">Tania Rascia</a>
	</p>
</div>]]></description><guid isPermaLink="false">646</guid><pubDate>Thu, 27 Sep 2018 08:55:55 +0000</pubDate></item><item><title>&#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A; Objects &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r645/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_09/11111.png.061546abd544fc01baff0517e940992c.png" /></p>
<h3>
	مقدّمة نظرية
</h3>

<ul>
	<li>
		<p>
			<strong>كائن</strong> جافاسكريبت هو كيان لديه خاصيّات. كلّ خاصيّة عبارة عن زوج مفتاح وقيمة. المفتاح هو اسم الخاصيّة.
		</p>
	</li>
	<li>
		<p>
			يمكن أن تكون قيمة الخاصيّة بيانات (عددا، سلسلة محارف، …إلخ.) أو دالة. يُطلَق على الخاصيّة عندما تكون قيمتها دالة الاسم <strong>تابع</strong> Method.
		</p>
	</li>
	<li>
		يُنشَأ <strong>كائن حرفي</strong> Object literal في جافاسكريبت بتحديد خاصيّاته ضمن زوج من الأقواس المعكوفة.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5684_6" style=""><span class="kwd">const</span><span class="pln"> myObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  property1</span><span class="pun">:</span><span class="pln"> value1</span><span class="pun">,</span><span class="pln">
  property2</span><span class="pun">:</span><span class="pln"> value2</span><span class="pun">,</span><span class="pln">
  </span><span class="com">// ... ,</span><span class="pln">
  method1</span><span class="pun">(</span><span class="com">/* ... */</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  method2</span><span class="pun">(</span><span class="com">/* ... */</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
myObject</span><span class="pun">.</span><span class="pln">property1 </span><span class="pun">=</span><span class="pln"> newValue</span><span class="pun">;</span><span class="pln"> </span><span class="com">// يعيّن القيمة الجديدة للخاصيّة property1 في الكائن myObject </span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">myObject</span><span class="pun">.</span><span class="pln">property1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يعرض قيمة الخاصيّة property1 في الكائن myObject</span><span class="pln">
myObject</span><span class="pun">.</span><span class="pln">method1</span><span class="pun">(...);</span><span class="pln">           </span><span class="com">// استدعاء التابع method1 في myObject</span></pre>

<ul>
	<li>
		<pre class="language-js">تمثّل الكلمة المفتاحية <code style="font-size: 16px;">this</code><span style='font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;'> في تابع الكائن الذي يُستدعَى فيه التابع.</span>
</pre>
	</li>
	<li>
		<p>
			تعرّف لغة البرمجة سلفا كائنات عدّة للاستفادة منها مثل <code>console</code> و <code>Math</code>.
		</p>
	</li>
</ul>

<h3 id="مقدّمة">
	مقدّمة
</h3>

<h3 id="ما-هو-الكائن؟">
	ما هو الكائن؟
</h3>

<p>
	انظر إلى الكائنات في معناها غير البرمجي، مثل قلم. يمكن أن يكون للقلم ألوان عدّة، يصنعه أشخاص متعدّدون، أطراف متنوّعة وخاصيّات أخرى كثيرة.
</p>

<p>
	على نحو مشابه، <strong>الكائن</strong> في البرمجة هو <strong>كيان لديه خاصيّات</strong>. تعرّف كل خاصيّة ميزة في الكائن. يمكن أن تكون الخاصيّة بيانات مرتبطة بالكائن (لون القلم) أو إجراء (قدرة القلم على الكتابة).
</p>

<h3 id="ما-علاقة-هذا-بالشفرة؟">
	ما علاقة هذا بالشفرة؟
</h3>

<p>
	<strong>البرمجة كائنية التوجّه</strong> Object-oriented programming (أو <abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr> اختصارا) هي طريقة لكتابة البرامج باستخدام الكائنات. يكتُب المبرمج - عند اتّباع هذه الطريقة - الكائنات، ينشئها ويعدّل عليها؛ تشكلّ الكائنات البرنامج.<br>
	**<br>
	تغيّر البرمجة كائنية التوجّه الطريقة التي تُكتَب وتُنظَّم بها البرامج. كتبنا في الفصول السابقة برامج تعتمد على الدوالّ، وهي طريقة برمجيّة تُسمَّى <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A5%D8%AC%D8%B1%D8%A7%D8%A6%D9%8A%D8%A9/" rel="">البرمجة الإجرائية</a> Procedural programming. فلنكتشف الآن كيف نكتب شفرة كائنية التوجّه.
</p>

<h3 id="جافاسكريبت-والكائنات">
	جافاسكريبت والكائنات
</h3>

<p>
	تدعم جافاسكريبت، مثل لغات برمجة أخرى، البرمجة بالكائنات. كما توفّر كائنات معرَّفة مسبقا مع إتاحة الفرصة لإنشاء كائنات جديدة.
</p>

<h3 id="إنشاء-كائن">
	إنشاء كائن
</h3>

<p>
	في ما يلي تمثيل جافاسكريبت لقلم حبر جاف أزرق اللون علامته التجارية Bic.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_9" style=""><span class="kwd">const</span><span class="pln"> pen </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  type</span><span class="pun">:</span><span class="pln"> </span><span class="str">"حبر جاف"</span><span class="pun">,</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أزرق"</span><span class="pun">,</span><span class="pln">
  brand</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bic"</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	يمكن إنشاء كائنات جافاسكريبت، كما ذكرنا سابقا، بسهولة بتعيين خاصيّات الكائن ضمن زوج أقواس معكوفة <code>{...}</code>. كلّ خاصيّة هي زوج من المفاتيح والقيم. يُسمَّى الكائن المعرَّف سابقا <strong>بالكائن الحَرْفي</strong> Object literal.
</p>

<p>
	<strong>ملحوظة:</strong> النقطة الفاصلة <code>;</code> بعد زوج الأقواس اختيارية، إلا أنه من الآمن إضافتها على كلّ حال.
</p>

<p>
	تعرِّف الشفرةُ أعلاه متغيّرا يُسمَّى <code>pen</code> قيمته كائن، يمكننا القول إذن إن <code>pen</code> كائن. لهذا الكائن ثلاث خاصيّات هي: <code>type</code> (النوع)، <code>color</code> (اللون) و<code>brand</code> (العلامة التجارية). لكلّ خاصيّة اسمٌ وقيمة، كما أنها متبوعة بفاصلة لاتينية <code>,</code> (ما عدا الخاصيّة الأخيرة)
</p>

<h3 id="الوصول-إلى-خاصيّات-الكائن">
	الوصول إلى خاصيّات الكائن
</h3>

<p>
	يمكن الوصول إلى قيم الخاصيّات بعد إنشاء الكائن ب<strong>التنويت النقطي</strong> Dot notation مثل <code>myObject.myProperty</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_11" style=""><span class="kwd">const</span><span class="pln"> pen </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  type</span><span class="pun">:</span><span class="pln"> </span><span class="str">"حبر جاف"</span><span class="pun">,</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أزرق"</span><span class="pun">,</span><span class="pln">
  brand</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bic"</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">type</span><span class="pun">);</span><span class="pln">  </span><span class="com">// "حبر جاف"</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">color</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "أزرق"</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">brand</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "Bic"</span></pre>

<p>
	الوصول إلى خاصيّة كائن هو <strong>عبارة</strong> Expression تنتج قيمة. يمكن تضمين هذه العبارة في عبارات أكثر تعقيدا. يوضّح المثال التالي كيفية عرض خاصيّات القلم السابق في تعليمة واحدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_13" style=""><span class="kwd">const</span><span class="pln"> pen </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  type</span><span class="pun">:</span><span class="pln"> </span><span class="str">"حبر جاف"</span><span class="pun">,</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أزرق"</span><span class="pun">,</span><span class="pln">
  brand</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bic"</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`أكتب</span><span class="pln"> </span><span class="pun">بقلم</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">type</span><span class="pun">}</span><span class="pln"> </span><span class="pun">لونه</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">color</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وعلامته</span><span class="pln"> </span><span class="pun">التجارية</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">brand</span><span class="pun">}`);</span></pre>

<p>
	<img alt="chapter06-01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28168" data-unique="ccs1wc8ki" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-01.png.ead94001906d0774a041bd4ca229eed4.png">
</p>

<h3 id="التعديل-على-كائن">
	التعديل على كائن
</h3>

<p>
	يمكن تعديل قيم الخاصيّات في كائن بعد إنشائه بالصيغة <code>myObject.myProperty = newValue</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_16" style=""><span class="kwd">const</span><span class="pln"> pen </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  type</span><span class="pun">:</span><span class="pln"> </span><span class="str">"حبر جاف"</span><span class="pun">,</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أزرق"</span><span class="pun">,</span><span class="pln">
  brand</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bic"</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

pen</span><span class="pun">.</span><span class="pln">color </span><span class="pun">=</span><span class="pln"> </span><span class="str">"أحمر"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// تغيير لون القلم </span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`أكتب</span><span class="pln"> </span><span class="pun">بقلم</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">type</span><span class="pun">}</span><span class="pln"> </span><span class="pun">لونه</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">color</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وعلامته</span><span class="pln"> </span><span class="pun">التجارية</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">brand</span><span class="pun">}`);</span></pre>

<p>
	<img alt="chapter06-02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28169" data-unique="83437qbyv" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-02.png.fff330107fed4a0d290706018e6631e4.png">
</p>

<p>
	توفّر جافاسكريبت إمكانية الإضافة الديناميكية لخاصيّات جديدة لكائن أنشأته قبْلا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_19" style=""><span class="kwd">const</span><span class="pln"> pen </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  type</span><span class="pun">:</span><span class="pln"> </span><span class="str">"حبر جاف"</span><span class="pun">,</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أزرق"</span><span class="pun">,</span><span class="pln">
  brand</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bic"</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

pen</span><span class="pun">.</span><span class="pln">price </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2.5"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// تعيين خاصية لسعر القلم</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`يبلغ</span><span class="pln"> </span><span class="pun">سعر</span><span class="pln"> </span><span class="pun">قلمي</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">pen</span><span class="pun">.</span><span class="pln">price</span><span class="pun">}`);</span></pre>

<p>
	<img alt="chapter06-03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28170" data-unique="i8cz3vvi4" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-03.png.36a4f5e69c23b2d00fcce1943d44dbb2.png">
</p>

<h3 id="البرمجة-بالكائنات">
	البرمجة بالكائنات
</h3>

<p>
	تعلّم الكثير من الكتب والدورات البرمجة كائنية التوجّه عبر أمثلة عن الحيوانات، السيّارات أو الحسابات المصرفية. فلنجرّب أمرا ألطف ولننشئ لعبة تقمّص أدوار Role playing game مصغَّرة باستخدام الكائنات.
</p>

<p>
	تُعرَّف كلّ شخصية في ألعاب تقمّص اﻷدوار بصفات مميَّزة عدّة مثل القوّة، القدرة على التحمّل والذكاء. في ما يلي لقطة شاشة للعبة تقمّص أدوار شهيرة على الإنترنت.
</p>

<p>
	<img alt="chapter06-04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28171" data-unique="nw1vq76l2" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-04.png.244d8d5034146e01f0f0494c9f468e8b.png">
</p>

<p>
	سيكون للشخصيّات - في مثالنا الأبسط كثيرا - ثلاثُ صفات مميّزة:
</p>

<ul>
	<li>
		الاسم Name،
	</li>
	<li>
		الصّحة Health (عدد نقاط الحياة)،
	</li>
	<li>
		القوة Strength.
	</li>
</ul>

<h3 id="مثال-ساذج">
	مثال ساذج
</h3>

<p>
	فلنقدّم أورورا، الشخصيّة الأولى في لعبتنا لتقمّص الأدوار:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_23" style=""><span class="kwd">const</span><span class="pln"> aurora </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أورورا"</span><span class="pun">,</span><span class="pln">
  health</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln">
  strength</span><span class="pun">:</span><span class="pln"> </span><span class="lit">25</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	للكائن <code>aurora</code> ثلاث خاصيّات: <code>health</code>، <code>name</code> و<code>strength</code>.
</p>

<p>
	<strong>ملاحظة:</strong> يمكن - كما ترى في المثال أعلاه - إسناد أعداد، سلاسل محارف وحتى كائنات أخرى إلى خاصيّات الكائنات.
</p>

<p>
	تستعدّ أورورا للبدء في سلسلة من المغامرات العظيمة التي ستحدّث بعض منها خاصيّات الشخصيّة. تأمل المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_25" style=""><span class="kwd">const</span><span class="pln"> aurora </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أورورا"</span><span class="pun">,</span><span class="pln">
  health</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln">
  strength</span><span class="pun">:</span><span class="pln"> </span><span class="lit">25</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`يوجد</span><span class="pln"> </span><span class="pun">لدى</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">نقاط</span><span class="pln"> </span><span class="pun">قوة</span><span class="pln"> </span><span class="pun">قدرها</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">health</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وقوة</span><span class="pln"> </span><span class="pun">تبلغ</span><span class="pln">  $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">strength</span><span class="pun">}`);</span><span class="pln">

</span><span class="com">// أصاب سهم أورورا وبالتالي تقل نقاط الحياة</span><span class="pln">
aurora</span><span class="pun">.</span><span class="pln">health </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تتجهّز أورورا بقلادة قوة</span><span class="pln">
aurora</span><span class="pun">.</span><span class="pln">strength </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`يوجد</span><span class="pln"> </span><span class="pun">لدى</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">نقاط</span><span class="pln"> </span><span class="pun">قوة</span><span class="pln"> </span><span class="pun">قدرها</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">health</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وقوة</span><span class="pln"> </span><span class="pun">تبلغ</span><span class="pln">  $</span><span class="pun">{</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">strength</span><span class="pun">}`);</span></pre>

<p>
	<img alt="chapter06-05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28172" data-unique="70f4xp6vb" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-05.png.ea35911f30d4bab8e594367722883a56.png">
</p>

<h3>
	التعريف بالتوابع
</h3>

<p>
	احتجنا في الأمثلة السابقة إلى كتابة تعليمات <code>console.log</code> طويلة في كلّ مرة نريد عرض حالة الشخصية. توجد طريقة أنسب للوصول إلى هذا الغرض.
</p>

<h4 id="إضافة-تابع-لكائن">
	إضافة تابع لكائن
</h4>

<p>
	تأمل المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_30" style=""><span class="kwd">const</span><span class="pln"> aurora </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أورورا"</span><span class="pun">,</span><span class="pln">
  health</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln">
  strength</span><span class="pun">:</span><span class="pln"> </span><span class="lit">25</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// ترجع وصف الشخصية</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> describe</span><span class="pun">(</span><span class="pln">character</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`يوجد</span><span class="pln"> </span><span class="pun">لدى</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">نقاط</span><span class="pln"> </span><span class="pun">صحة</span><span class="pln"> </span><span class="pun">قدرها</span><span class="pln">  $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">health</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وقوة</span><span class="pln"> </span><span class="pun">تبلغ</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">strength</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">describe</span><span class="pun">(</span><span class="pln">aurora</span><span class="pun">));</span></pre>

<p>
	<img alt="chapter06-06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28173" data-unique="eunsnj5lx" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-06.png.f92cd91f4fec8a852333eee861b45af2.png">
</p>

<p>
	معامل الدالة <code>describe()</code> هو كائن. تصل الدالة إلى خاصيّات الكائن وتنشئ سلسلة المحارف التي تصف الشخصية.
</p>

<p>
	أدناه مقاربة بديلة تستخدم الدالة <code>describe()</code> <em>داخل</em> الكائن.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_32" style=""><span class="kwd">const</span><span class="pln"> aurora </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أورورا"</span><span class="pun">,</span><span class="pln">
  health</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln">
  strength</span><span class="pun">:</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln">

 </span><span class="com">// ترجع وصف الشخصية</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> describe</span><span class="pun">(</span><span class="pln">character</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`يوجد</span><span class="pln"> </span><span class="pun">لدى</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">نقاط</span><span class="pln"> </span><span class="pun">صحة</span><span class="pln"> </span><span class="pun">قدرها</span><span class="pln">  $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">health</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وقوة</span><span class="pln"> </span><span class="pun">تبلغ</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">character</span><span class="pun">.</span><span class="pln">strength</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">describe</span><span class="pun">());</span></pre>

<p>
	<img alt="chapter06-07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28174" data-unique="5zdukibwu" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-07.png.55dd109d39d8ac1f9499fc8014101b54.png">
</p>

<p>
	يتوفّر الكائن الآن على خاصيّة جديدة: <code>describe()</code>. قيمة هذه الخاصيّة دالة تُرجِع وصفا نصيًّا للكائن. نتيجة التنفيذ مطابقة تماما لما سبق.
</p>

<p>
	تُسمّى خاصيّة كائن عندما تكون قيمتها دالة ب<strong>التابع</strong>. تُستخدَم التوابع لتعريف <strong>إجراءات</strong> على كائن. يضيف التابع <strong>سلوكا</strong> إلى الكائن.
</p>

<h4 id="استدعاء-تابع-في-كائن">
	استدعاء تابع في كائن
</h4>

<p>
	فلنتأمل السطر الأخير من المثال السابق:
</p>

<pre class="language-js"> </pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_34" style=""><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">describe</span><span class="pun">());</span></pre>

<p>
	نستخدم العبارة <code>aurora.describe()</code> لعرض وصف الشخصية بدلا من <code>describe(aurora)</code>، وهنا فرق <em>جوهري</em>.
</p>

<ul>
	<li>
		تستدعي العبارة <code>describe(aurora)</code> الدالة <code>describe()</code> مع تمرير الكائن <code>aurora</code> في المعطيات. الدالة خارجة عن الكائن. هذا مثال على البرمجة الإجرائية.
	</li>
	<li>
		تستدعي العبارة <code>aurora.describe()</code> الدالة <code>describe()</code> في الكائن <code>aurora</code>. الدالة خاصيّة من خاصيّات الكائن: تابع. هذا مثال على البرمجة كائنية التوجه.
	</li>
</ul>

<p>
	صيغة استدعاء التابع <code>myMethod()</code> في <code>myObject</code> هي <code>myObject.myMethod()</code>.
</p>

<p>
	<strong>تنبيه:</strong> تذكّر الأقواس، حتى وإن كانت خاوية، عند استدعاء تابع.
</p>

<h3 id="الكلمة-المفتاحية-this">
	الكلمة المفتاحية <code>this</code>
</h3>

<p>
	تأمل جيّدا متن التابع <code>describe()</code> في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_36" style=""><span class="kwd">const</span><span class="pln"> aurora </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أورورا"</span><span class="pun">,</span><span class="pln">
  health</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln">
  strength</span><span class="pun">:</span><span class="pln"> </span><span class="lit">25</span><span class="pun">,</span><span class="pln">

  </span><span class="com">// ترجع وصف الشخصية</span><span class="pln">
  describe</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`يوجد</span><span class="pln"> </span><span class="pun">لدى</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">نقاط</span><span class="pln"> </span><span class="pun">صحة</span><span class="pln"> </span><span class="pun">قدرها</span><span class="pln">  $</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">health</span><span class="pun">}</span><span class="pln"> </span><span class="pun">وقوة</span><span class="pln"> </span><span class="pun">تبلغ</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">strength</span><span class="pun">}`;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	سترى كلمة مفتاحية جديدة: <code>this</code>. تُعيَّن هذه الكلمة المفتاحية تلقائيا داخل تابع في جافاسكريبت وتمثّل <strong>الكائن الذي استُدعِي فيه التابع</strong>.
</p>

<p>
	لا يستقبل التابع <code>describe()</code> أي معاملات. يستخدم التابع <code>this</code> للوصول إلى خاصيّات الكائن الذي استُدعِي فيه.
</p>

<h3 id="الكائنات-المعرَّفة-مسبقا-في-جافاسكريبت">
	الكائنات المعرَّفة مسبقا في جافاسكريبت
</h3>

<p>
	تتوفّر جافاسكريبت على كائنات عدّة معرَّفة مسبقا تخدم أغراضا متفرّقة. رأينا في ما مضى بعضا منها:
</p>

<ul>
	<li>
		يمنح الكائن <code>console</code> الوصول إلى بيئة الطرفية. التعليمة <code>console.log()</code> هي في الواقع استدعاء لتابع.
	</li>
	<li>
		يحوي الكائن <code>Math</code> خاصيّات رياضية كثيرة. على سبيل المثال، تُرجع الخاصيّة <code>Math.PI</code> قيمة تقريبية للعدد π، ويرجع التابع <code>Math.random()</code> عددا عشوائيا بين 0 و1.
	</li>
</ul>

<h3 id="حان-وقت-كتابة-الشفرة">
	حان وقت كتابة الشفرة!
</h3>

<h3 id="إضافة-تجربة-الشخصية">
	إضافة تجربة الشخصية
</h3>

<p>
	حسّن برنامج لعبة تقمّص الأدوار بإضافة خاصيّة التجربة؛ على أن يكون اسمها <code>xp</code> وقيمتها الابتدائية 0. يجب أن تظهر التجربة ضمن وصف الشخصية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_38" style=""><span class="com">// للإنجاز: إنشاء الكائن character هنا.</span><span class="pln">

</span><span class="com">// أصاب سهم أورورا وبالتالي تقل نقاط الحياة</span><span class="pln">
aurora</span><span class="pun">.</span><span class="pln">health </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تتجهّز أورورا بقلادة قوة</span><span class="pln">
aurora</span><span class="pun">.</span><span class="pln">strength </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تعلّمت أورورا مهارة جديدة</span><span class="pln">
aurora</span><span class="pun">.</span><span class="pln">xp </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">aurora</span><span class="pun">.</span><span class="pln">describe</span><span class="pun">());</span></pre>

<p>
	<img alt="chapter06-08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28175" data-unique="wrwuij957" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-08.png.b37600d7fde05a5775b8b85ac692e7ee.png">
</p>

<h3 id="نمذجة-modeling-كلب">
	نمذجة Modeling كلب
</h3>

<p>
	أكمل البرنامج التالي لإضافة تعريف بالكائن <code>dog</code> (كلب).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_40" style=""><span class="com">// للإنجاز: أنشئ الكائن dog هنا </span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">dog</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">كلب</span><span class="pln"> </span><span class="pun">نوعه</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">dog</span><span class="pun">.</span><span class="pln">species</span><span class="pun">}</span><span class="pln"> </span><span class="pun">يبلغ</span><span class="pln"> </span><span class="pun">طوله</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">dog</span><span class="pun">.</span><span class="pln">size</span><span class="pun">}`);</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`انظر</span><span class="pln"> </span><span class="pun">هرّة!</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">dog</span><span class="pun">.</span><span class="pln">name</span><span class="pun">}</span><span class="pln"> </span><span class="pun">ينبح:</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">dog</span><span class="pun">.</span><span class="pln">bark</span><span class="pun">()}`);</span></pre>

<p>
	<img alt="chapter06-09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28176" data-unique="pvjplgpri" src="https://academy.hsoub.com/uploads/monthly_2018_09/chapter06-09.png.576b20f0294eb182f2f6533d4a2c5fa8.png">
</p>

<h3 id="نمذجة-دائرة">
	نمذجة دائرة
</h3>

<p>
	أكمل البرنامج التالي لإضافة تعريف الكائن <code>circle</code> (دائرة). يُدخل الزائر قيمة شعاع الدائرة
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1818_42" style=""><span class="kwd">const</span><span class="pln"> r </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Number</span><span class="pun">(</span><span class="pln">prompt</span><span class="pun">(</span><span class="str">"أدخل قيمة شعاع الدائرة:"</span><span class="pun">));</span><span class="pln">

</span><span class="com">// للإنجاز: أنشئ تعريف الدائرة هنا</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`يبلغ</span><span class="pln"> </span><span class="pun">محيط</span><span class="pln"> </span><span class="pun">الدائرة</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">circle</span><span class="pun">.</span><span class="pln">circumference</span><span class="pun">()}`);</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`تبلغ</span><span class="pln"> </span><span class="pun">مساحة</span><span class="pln"> </span><span class="pun">الدائرة</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">circle</span><span class="pun">.</span><span class="pln">area</span><span class="pun">()}`);</span></pre>

<h3 id="نمذجة-حساب-مصرفي">
	نمذجة حساب مصرفي
</h3>

<p>
	أنشئ برنامجا ينشئ كائن <code>account</code> يمثّل حسابا مصرفيا لديه الميزات التالية:
</p>

<ul>
	<li>
		خاصيّة <code>name</code> قيمتها “أحمد”.
	</li>
	<li>
		خاصيّة <code>balance</code> قيمتها 0.
	</li>
	<li>
		تابع <code>credit</code> تضيف القيمة (سالبة أو موجبة) المُمرَّرة في المعطى إلى رصيد الحساب <code>balance</code>.
	</li>
	<li>
		تابع <code>describe</code> يُرجع وصف الحساب.
	</li>
</ul>

<p>
	استخدم هذا الكائن لعرض وصف حساب مصرفي، أضف 250 إلى رصيده، اسحب منه 80 ثم اعرض وصفه مرة أخرى.
</p>

<p>
	تحصُل على الآتي عند عرض وصف البرنامج في المرة الأولى:
</p>

<blockquote>
	<p>
		“المالك: أحمد، الرصيد: 0”
	</p>
</blockquote>

<p>
	وعلى ما يلي في المرة الثانية:
</p>

<blockquote>
	<p>
		“المالك: أحمد، الرصيد: 170”
	</p>
</blockquote>

<p>
	ترجمة - بتصرّف - للفصل <a href="https://github.com/bpesquet/thejsway/blob/master/manuscript/chapter06.md" rel="external nofollow">Create your first objects</a> من كتاب The JS Way.
</p>
]]></description><guid isPermaLink="false">645</guid><pubDate>Wed, 26 Sep 2018 11:41:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; DOM</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_09/intro.png.5f972874ee7660b603f9110add71a7aa.png" /></p>

<h3>
	مقدمة
</h3>

<p>
	إن نموذج تمثيل المستند ك جسم أو كائن Document Object Model والذي يشار له اختصارا ب DOM يعتبر أحد الطرق الأساسية في بناء مواقع متفاعلة فيما بينها، حيث تُعتبر هذه الطريقة واجهة تسمح للغات البرمجة بمعالجة محتوى المواقع وهيكليتها.
</p>

<p>
	أحد اللغات المرتبطة بالـ DOM في المتصفحات هي الجافا سكربت وذلك لأنها لغة برمجة تعمل في مواقع الويب من جهة المستخدم client-side.
</p>

<p>
	 حيث يمكن الاستفادة من مفاهيم DOM في بناء مواقع ويب متفاعلة مثل إضافة عرض صور للموقع من خلال شاشة عرض بطريقة تدوير الصور، أو إظهار لافتة تنبّه المستخدم إلى وقوعه في خطأ عند محاولته إدخال معلومات ناقصة ضمن الحقول المطلوبة، أو التبديل في قوائم التصفح الخاصة بالموقع ويتم تنفيذ هذه العمليات الثلاث من خلال لغة الجافاسكربت ولكن من خلال معالجة DOM.
</p>

<p>
	في هذا المقال سنتعلم ماهو DOM وكيفية التعامل معه من خلال تعريف كائن object هو document والتمييز بين أسطر التعليمات المكتوبة بلغة HTML وبين DOM.
</p>

<p>
	<strong><u>ملاحظة:</u></strong>  لاتعتبر DOM لغة برمجة كما الحال في لغات البرمجة الاعتيادية كالجافا أو الجافا سكربت... حيث يتم تنفيذ وتطبيق مفاهيمها من خلال لغات برمجة أخرى وهنا سنستخدم لغة الجافا سكربت.
</p>

<h3>
	المتطلبات الأساسية
</h3>

<p>
	لفهم كيفية تطبيق مفاهم DOM بشكل فعال وتنفيذه  في تطبيقات الويب من المهم أن تكون لديك معرفة سابقة بـ HTML و CSS بالإضافة إلى معرفة القواعد الأساسية حول طريقة كتابة تعليمات الجافا سكربت وهيكليتها.
</p>

<h3>
	ما هي DOM
</h3>

<p>
	للبدء ببناء أي موقع ويب مهما كان بسيط سنبدأ أولًا بإنشاء مستند HTML، حيث يقوم برنامج المتصفح الذي يستخدمه الزائر لمشاهدة الموقع بتفسير تعليمات html  و CSS وتحويلهم إلى المحتوى، الهيكلية والتصميم الذي نشاهده أمامنا في الصفحة النهائية.
</p>

<p>
	بالإضافة لذلك يقوم المتصفح ببناء تمثيل للمستند يُعرف بأنه نموذج كائن المستند Document Object Model ويسمح هذا النموذج للجافا سكربت بالوصول إلى المحتوى المُعبّر عنه كنص text أو كعناصر element ضمن المستند ورؤيتها على شكل أغراض objects.
</p>

<p>
	ولسهولة فهم هذا المفهوم الجديد سنتعرف عليه من خلال مثال عملي يبدأ بتطوير موقع بسيط وذلك بإنشاء ملف جديد يسمى index.html ثم حفظه ضمن مجلد المشروع project directory
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_467_7" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	إن أسطر التعليمات السابقة هي أساسيات HTML لبناء موقع ويب.
</p>

<p>
	سنستخدم هنا متصفح Chrome ولكن يمكنك الوصول إلى نفس الخرج من خلال المتصفحات الحديثة الأخرى.
</p>

<p>
	أولًا سنقوم بفتح ملف index.html الذي قمنا ببنائه من خلال متصفح chrome عندها سيظهر أمامك صفحة ويب فارغة وتحوي فقط عنوان هو "Document Object Model" ومن خلال النقر بالزر اليميني في أي مكان بالصفحة ستظهر لدينا قائمة نختار منها "Inspect" والتي ستفتح لنا على جانب الصفحة أدوات التطوير، سيظهر لدينا DOM تحت تبويب "Elements"
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28166" href="https://academy.hsoub.com/uploads/monthly_2018_09/01.png.aad958f96aa4b992497df09cd6d0c3f0.png" rel=""><img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28166" data-unique="yfhtknko1" src="https://academy.hsoub.com/uploads/monthly_2018_09/01.thumb.png.60746eeb0b5a82deb547263427fb5a19.png"></a>
</p>

<p>
	في هذه الحالة نلاحظ أن DOM الذي قمنا بإظهاره مطابق تمامًا لتعليمات html التي كتبناها سابقًا لبناء الموقع، وعند تمرير السهم فوق العنصر سنلاحظ أن مايقابله من صفحة الويب المفتوحة أمامنا ستُظلّل باللون الأزرق، كما أن السهم الموجود على جانب كل عنصر يسمح بتوسيع العناصر المكتوبة بالداخل.
</p>

<h3>
	كائن المستند Document
</h3>

<p>
	كائن المستند document هو عبارة عن كائن مُدمج يملك عدد من الخصائص properties والطرق methods التي يمكن استخدامها للوصول إلى الموقع وتعديله.
</p>

<p>
	لفهم كيفية عمل DOM يجب أولًا فهم كيف تعمل الكائنات objects في الجافا سكريبت، ويمكن ذلك من خلال الإطلاع على مقالة <a href="https://academy.hsoub.com/programming/javascript/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r645/" rel="">برمجة الكائنات Objects في جافاسكريبت</a><br>
	في أدوات التطوير التي أظهرناها سابقًا بجانب ملف index.html ننتقل إلى التبويبة "Console" ونكتب document داخل console ثم نضغظ زر Enter حيث نلاحظ أن الخرج هو نفسه الخرج الموجود في تبويبة "Elements"
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5642_6" style="">
<span class="pln">document;</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5642_8" style="">
<span class="pln">Output
#document
</span><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Learning the DOM</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">

  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span></pre>

<p>
	إن كتابة المستند document أو العمل مباشرة في تبويب console ليست أمرًا شائعًا نقوم به خارج debugging ولكنه يساعد في ترسيخ مفهوم كائن المستند document وكيفية تعديله ومعرفه العناصر الأخرى المدرجة ضمنه.
</p>

<h3>
	ماهو الفرق بين DOM وتعليمات HTML
</h3>

<p>
	حاليًا في المثال السابق الذي طرحناه تبدو لنا DOM كما لو أنها تعليمات HTML نفسها ولكن يوجد أمثلة يقوم فيها المتصفح بتوليد DOM مختلف عن تعليمات HTML مثل:
</p>

<ul>
<li>
		تعديل DOM من خلال تعليمات الجافا سكربت والتي يتم تنفيذها في جانب المستخدم.
	</li>
	<li>
		قيام المتصفح بتصحيح الأخطاء الموجودة في التعليمات HTML المكتوبة سابقًا بشكل تلقائي.
	</li>
</ul>
<p>
	سنقوم الآن باكتشاف آلية تعديل DOM من خلال استخدام الجافا سكربت التي تُطبق في جانب المستخدم.
</p>

<p>
	أولًا ندخل في console التعليمة
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5642_10" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">;</span></pre>

<p>
	عندها سيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5642_12" style="">
<span class="pln">Output
</span><span class="tag">&lt;body&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span></pre>

<p>
	سنلاحظ هنا أن document هو عبارة عن كائن أما body فهو خاصية property لهذا الكائن لذلك من للوصول إلى هذه الخاصية نكتب اسم الكائن ثم نقطة ثم الخاصية document.body عندها سيكون الخرج هو جميع عناصر body الموجودة في المستند document.
</p>

<p>
	نستطيع من خلال console تغيير بعض الصفات الظاهرة في الكائن body في هذا الموقع فمثلًا يمكن تغيير صفات style الخاصية بالـ body مثل تغيير لون الخلفية ويتم ذلك من خلال التعليمة
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5642_14" style="">
<span class="pln">document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">backgroundColor </span><span class="pun">=</span><span class="pln"> </span><span class="str">'fuchsia'</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	بعد كتابة هذه التعليمة وإدخالها سنلحظ تغير لون خلفية الموقع للون الفوشيا:<br><a class="ipsAttachLink ipsAttachLink_image" data-fileid="28167" href="https://academy.hsoub.com/uploads/monthly_2018_09/02.png.a4a15bb746ce1d326005632d50ab0cc7.png" rel=""><img alt="02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28167" data-unique="52cxr1hmg" src="https://academy.hsoub.com/uploads/monthly_2018_09/02.thumb.png.0f337d1ba56f79ae6a17546ec949e704.png"></a>
</p>

<p>
	بالانتقال إلى تبويبة "Elements" أو من خلال كتابة تعليمة document.body في console مرة أخرى سنلاحظ أن DOM قد تغير
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5642_16" style="">
<span class="pln">Output

</span><span class="tag">&lt;body</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="pln">background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> fuchsia</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Document Object Model</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/body&gt;</span></pre>

<p>
	 
</p>

<p>
	<strong><u>ملاحظة:</u></strong> رأينا في المثال السابق عند تغيير لون الخلفية أن خاصية لون الخلفية في CSS والذي يكتب بالشكل background-color تمت كتابته بالشكل backgroundColor في الجافا سكربت وبنفس هذا الترتيب فإن أي خاصية في CSS يمكن كتابتها في الجافا سكربت بطريقة camelCase والتي تعني أن الحرف الأول من الكلمة الأولى صغير بينما الحرف الأول من الكلمة الثانية كبير.
</p>

<p>
	عند الضغط بالزر اليميني على الصفحة واختيار "View Page Source" سنلاحظ أن التعليمات الظاهرة لاتحوي على الصفة attribute الجديدة للون الخلفية الذي أضفناه من خلال الجافا سكربت وذلك لأن التعليمات الأساسية الموجودة في جانب الخادم Server التي تم بناء الموقع من خلالها لاتتأثر بأي تعليمات كتبت في جانب المستخدم بلغة الجافا سكربت، ولذلك في حال قمنا بتحديث الصفحة فإن الخاصية التي أضفناها ستُلغى.
</p>

<p>
	بالنسبة للحالة الأخرى التي ذكرناها عن اختلاف DOM و تعليمات HTML وهي عندما يتم تصحيح الأخطاء المكتوبة في التعليمات source code آليًا من قبل المتصفح، كمثال شائع فإن الوسم tbody يجب أن  يرافق الوسم table دائمًا ولكن غالبًا لايقوم المطورون بتضمين هذه الوسوم بالشكل الصحيح ضمن HTML وعندها يقوم المتصفح تلقائيًا بتصيح هذا الخطأ وإضافة الوسم tbody وبالتالي يتم تغيير DOM.
</p>

<p>
	بالإضافة إلى ذلك دائمًا يصحح DOM الوسوم التي لايتم إغلاقها.
</p>

<h3>
	ملخص
</h3>

<p>
	عرضنا في هذه المقالة تعريف للـ DOM واستطعنا الوصول إلى كائن المستند document باستخدام الجافا سكربت وconsole من أجل تغيير خصائص تابعة للكائن document، كما تعرفنا على الفرق بين HTML و DOM.
</p>

<p>
	 أما في <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">المقالة التالية</a> سنقوم باستعراض معلومات مهمة عن HTML وشجرة DOM وكيفية التعامل مع عقدها Nodes وماهي الأنواع الشائعة منها.
</p>

<p>
	ترجمة بتصرف للمقال <a href="https://www.digitalocean.com/community/tutorials/introduction-to-the-dom" rel="external nofollow">Introduction to DOM</a>  وكاتبتها Tania Rascia
</p>
]]></description><guid isPermaLink="false">644</guid><pubDate>Wed, 26 Sep 2018 10:12:00 +0000</pubDate></item></channel></rss>
