<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: HTML</title><link>https://academy.hsoub.com/programming/html/page/5/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: HTML</description><language>ar</language><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x646;&#x645;&#x627;&#x630;&#x62C; HTML5 &#x648;&#x62E;&#x635;&#x627;&#x626;&#x635;&#x647;&#x627; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629;</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-html5-%D9%88%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5%D9%87%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-r4/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/HTML5-forms_480x300.png.1823f0cfd6fa5b41f489455f06ec3414.png" /></p>
<p dir="rtl">مما لا شك فيه هو أنك تتعامل على الأقل مع نموذج واحد على الويب كل يوم، سواء كان ذلك خلال استخدامك لمحرك بحثك المُفضل، تسجيلك للدخول إلى بريدك الإلكتروني، أو حتى الدخول إلى فيس بوك. يُعتبر التعامل مع النماذج  Forms إحدى المهمات الأكثر شيوعا على الإنترنت. بحُكم أننا مصممون أو مطورون فإن تعاملنا مع النماذج يحوم حوله نوع من الرتابة والتكرار خاصة لما يتعلق الأمر بكتابة سكريبتات للتحقق من قيم الحقول. أضافت HTML5 العديد من أنواع المُدخلات، الخواص والعديد من العناصر إلى هذه النماذج. سنركز في هذا المقال على الخواص الجديدة التي أضافتها HTML5 فقط، وسنفرد مقالا آخر لأنواع المدخلات الجديدة لاحقا.</p><p dir="rtl">كما سنلاحظه طيله هذا المقال، ستسهل عليك هذه الخواص الجديدة مهمتك وستقدم تجربة أمتع للمستخدم، وفوق كل هذا يُمكنك الشروع في استخدامها من الآن. لكن دعونا نبدأ باستعراض سريع لتاريخ النماذج.</p><p dir="rtl"> </p><h2 dir="rtl">نبذة عن تاريخ نماذج HTML5</h2><p dir="rtl">قبل أن تصبح نماذج HTML5 على النحو الذي نعرفه الآن كانت في السابق مُجرد مواصفات specification أُطلق عليها اسم <a rel="external nofollow" href="http://www.whatwg.org/specs/web-forms/current-work/">Forms 2.0</a> والتي أضافت جُملة من العناصر والمُدخلات الجديدة إلى النماذج. هذه المواصفات أطلقتها Opera وتولى تحريرها Ian Hickson الذي كان يعمل لديها حينها، قبل أن يتم <a rel="external nofollow" href="http://www.w3.org/Submission/2005/SUBM-web-forms2-20050411/">تقديمها إلى W3C بداية 2005</a>. تم الشروع في العمل على هذه المواصفات تحت مظلة W3C ثم تم دمجها مع مواصفات Web Applications 1.0 لإنشاء قواعد ما أصبح يُعرف لاحقا بمواصفات HTML5 التابعة لـ WHATWG.</p><h2 dir="rtl">استخدام مبادئ تصميم HTML5</h2><p dir="rtl">أحد أفضل ميزات النماذج الخاصة بـ HTML5 تتعلق بكونها قابلة للاستعمال ابتداءًا من الآن، ولا حاجة لك للاستعانة بأية حيل، Shivs أو طرق مُلتوية للقيام بذلك، لكن ذلك لا يعني بأنها مدعومة الآن، حيث أنها تعطي نتائج رائعة على المتصفحات الحديثة التي تدعمها وتوفر "تراجعا رشيقا" (graceful degradation) على المتصفحات التي لا تفهمها، وهذا راجع بشكل أساسي إلى <a rel="external nofollow" href="http://www.w3.org/TR/html-design-principles/">مبادئ تصميم HTML5</a>، ونقصد هنا بالتحديد التراجع الرشيق وهو ما يعني بأنه لا يوجد أي دافع لعدم استخدام هذه الخواص في مشاريعك الحالية.</p><h2 dir="rtl">خواص نماذج HTML5 الجديدة</h2><p dir="rtl">هناك 14 خاصية جديدة مُتعلقة بنماذج HTML5 والتي سنقوم باستعراضها في هذا المقال وهي كالآتي:</p><ul><li>placeholder</li><li>autofocus</li><li>autocomplete</li><li>required</li><li>pattern</li><li>list</li><li>multiple</li><li>novalidate</li><li>formnovalidate</li><li>form</li><li>formaction</li><li>formenctype</li><li>formmethod</li><li>formtarget</li></ul><h3 dir="rtl">placeholder</h3><p dir="rtl">أول هذه الخواص هي placeholder والتي تسمح لنا بإضافة نص توضيحي بنفس الطريقة التي كنا نعملها مع خاصية value في نماذج HTML4. يجب استخدام هذه الخاصية مع النصوص التوضيحية القصيرة فقط، ويُفضل الاستعانة بخاصية title لكل النصوص التوضيحية الأطول. الاختلاف الحاصل مُقارنة بالطريقة المُتبعة مع نماذج HTML4 هو أنه لا يتم استعراض  النص إلا في حالة ما إذا كان الحقل فارغا ولم يستقبل "التركيز" Focus (يعني لم يتم اختياره بالنقر عليه مثلا أو بالانتقال إليه عبر Tab من حقل آخر)، وبُمجرد أن يستقبل الحقل التركيز فإن النص يختفي، وهو أمر مُشابه لحقل البحث الموجود على مُتصفح Safari مثلا.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/Browser-search-box-in-safari-without-and-with-focus.png"><img alt="Browser-search-box-in-safari-without-and-with-focus" src="http://www.webtuts.me/wp-content/uploads/2013/06/Browser-search-box-in-safari-without-and-with-focus.png"></a></dt><dd>حقل البحث على متصفح Safari مع وبدون التركيز focus</dd></dl></div><p dir="rtl">دعونا نُلقي نظرة على طريقة استخدام placeholder:</p><pre class="html ipsCode prettyprint">&lt;input type="text" name="user-name" id="user-name" placeholder="at least 3 characters"&gt;</pre><p>هذا كل ما في الأمر. قد يقول قائل: "وما الرائع في هذا الأمر؟ ألِفتُ القيام بنفس الأمر عبر استخدام JavaScript طيلة السنوات الماضية" وذلك أمر صحيح، لكن مع HTML5 تأتي هذه الخاصية مدعومة بشكل مُضمن في المُتصفح، مما يعني أنها ستعمل من دون أية سكربتات إضافية، وتعمل على جميع المتصفحات حتى ولو كان JavaScript مُعطلا عليها.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/Placeholder-attribute-support-in-Chrome-unfocused-and-focused.png"><img alt="Placeholder-attribute-support-in-Chrome-unfocused-and-focused" src="http://www.webtuts.me/wp-content/uploads/2013/06/Placeholder-attribute-support-in-Chrome-unfocused-and-focused.png"></a></dt><dd>دعم خاصية placeholder على متصفح Chrome مع ظهوره في الصورة الأولى واختفائه في الثانية</dd></dl></div><p dir="rtl">ستقوم المتصفحات التي لا تدعم placeholder بتجاهله بكل بساطة، وبالتالي فإنها لن تقوم بإظهاره. باستخدامك لهذه الخاصية فإنك ستقدم تجربة مستخدم مُحسنة لزوار موقعك والذين تدعم مُتصفحاتهم هذه الخاصية، كما أنها تُعد موقعك للعمل وفق معايير المستقبل، بحكم أن كل المُتصفحات الحديثة تدعمها.</p><p dir="rtl">ملاحظة: حاليا لا وجود لأية pseudo-class رسمية للتحكم في مظهر placeholder رغم ذلك فإن كلا من Mozilla (مُطورة متصفح Firefox) و WebKitتوفران آليات للتعامل مع ذلك (vendor prefixed properties) ويتعلق الأمر بكل من -mozplaceholder  و –webkit-input-placeholder، وهو ما يُعطي الانطباع بأنه سيتم اعتماد pseudo-class للتحكم في مظهر placeholder في المُستقبل. لمعلومات أوفى حول الأمر يُمكنكم مُراجعة هذه <a rel="external nofollow" href="http://lists.w3.org/Archives/Public/www-style/2011Apr/0240.html">الصفحة على القائمة البريدية الخاصة بـ WHATWG</a>.</p><h3 dir="rtl">autofocus</h3><p dir="rtl">تقوم autofocus تماما بالوظيفة الظاهرة من اسمها. إضافة هذه الخاصية لأي حقل من الحقول تُمكنه من الحصول على "التركيز" (Focus) بمجرد أن يتم تحميل الصفحة. ومثلما هو الحال مع placeholder فإنه كان بإمكاننا في السابق الوصول إلى نفس النتيجة التي نحصل عليها لدى استخدام autofocus إن نحن استعملنا بعض الـ JavaScript. إلا أن الطرق المُستعملة مع JavaScript تُعاني بعض النقائص، فعلى سبيل المثال لو شرع المُستخدم في ملء حقول النموذج قبل أن يتم تحميل السكربت فإنه سيتم إرجاعه (أو تحويل التركيز إلى الحقل الأول) بُمجرد أن يتم الفراغ من تحميل السكربت، وهذا ما يُرجح الكفة لصالح autofocus حيث أن هذه الخاصية (أي حصول أحد الحقول على التركيز) يتم بمُجرد الفراغ من تحميل الصفحة دون الحاجة إلى انتظار تحميل أي سكربتات إضافية. في المُقابل ننصح باستعمال خاصية autofocus بشكل حصري على الصفحات التي يكون النموذج محتواها الرئيسي فقط (مثل صفحة بداية مُحرك Google) وذلك لتفادي المشاكل التي قد تترتب عن ذلك والمُتعلقة بقابلية الاستخدام usability.</p><p dir="rtl">بما أن الأمر هنا يتعلق بخاصية منطقية boolean attribute (إن كان المُستند الذي تكتبه متوافقا مع XHTML5 فاقرأ الملاحظة أدناه) فإننا نستعملها على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="text" name="first-name" id="first-name" autofocus&gt;</pre><p>كل المتصفحات الحديثة تدعم خاصية autofocus ومثلما هو الحال مع placeholder فإنه لا يحدث أي شيء على المتصفحات التي لا تدعمها حيث أنها تقوم بتجاهله.</p><p dir="rtl">ملاحظة: العديد من خواص HTML5 الجديدة هي خواص منطقية (Boolean attribute)، وهو ما يعني بأنها خواص يتم أخذها بالحسبان إن كانت حاضرة ويتم تجاهلها إن لم تحضر. إلا أنه من المُمكن كتابتها بعدة طرق في HTML5 على النحو التالي:</p><pre class="html ipsCode prettyprint">autofocus
autofocus=""
autofocus="autofocus"</pre><p>في المُقابل إن كان مُستندك متوافقا مع XHTML5 فإنه يجب عليك استعمال الصيغة التالية:</p><pre class="html ipsCode prettyprint">autofocus="autofocus"

autocomplete
</pre><p dir="rtl">تُساعد خاصية autocomplete المُستخدِمَ على ملء حقوله بناء على ما قام بإدخاله من قبل في نفس الحقل. هذه الخاصية ليست بالجديدة حيث كان بالإمكان استخدامها منذ IE5.5 وقد تم اعتمادها مؤخرا بشكل رسمي ضمن HTML5. الحالة القياسية (default state) لهذه الخاصية هو on وهو ما يعني بأنك لست في حاجة إلى استخدامها بشكل صريح في حقولك. في المُقابل إن أردت أن يقوم المُستخدم بملء حقوله بنفسه في كل مرة يتعامل فيها مع نموذجك (يعني أنك ترغب في أن  لا يتم ملء الحقول بشكل آلي) فإنه يجب عليك استخدام الخاصية على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="text" name="tracking-code" id="tracking-code" autocomplete="off"&gt;</pre><p dir="rtl">إن توفرت خاصية autocomplete في حقل ما فإن المتصفح سيأخذ حالتها في الحسبان عوض حالة هذه الخاصية في عنصر form الذي يحتوي الحقل (بعبارة أخرى خاصية autocomplete في أي حقل تقوم بعمل override لنفس الخاصية إن كان form يستخدمها).</p><h3 dir="rtl">required</h3><p dir="rtl">لا يبدو بأننا في حاجة لشرح ما الذي تقوم به هذه خاصية required حيث أنها تقوم تماما بالوظيفة التي نفهمها من اسمها. لدى إضافة هذه الخاصية لأي حقل من الحقول فإن المُتصفح سيطلب من المُستخدم ملء الحقل قبل أن يتمكن من إرسال النموذج، وهذا ما يسمح باستبدال آلية التحقق من الحقول التي عادة ما نقوم بها باستخدام JavaScript، وهو ما يُحسن من تجربة المُستخدم قليلا كما أنه يُجنبنا عناء التحقق من الحقول بأنفسنا. خاصية required هي خاصية منطقية ويتم استخدامها بنفس طريقة استخدام autofocus على النحو التالي:</p><pre class="html ipsCode prettyprint">&lt;input type="text" id="given-name" name="given-name" required&gt;</pre><p dir="rtl">لا يدعم خاصيةَ required سوى المتصفحات التالية: Opera 9.5+، Firefox 4+، Safari 5+، IE10 و Chrome5+، وعليه فإنك قد تحتاج إلى كتابة سكربت للتحقق من المدخلات على المُتصفحات/الإصدارات التي لا تدعمها (خاصة IE).</p><p dir="rtl">تُظهر كلا من متصفحات Opera، Chrome وFirefox رسالة خطأ في حال جرب المُستخدم إرسال النموذج من دون ملء الحقول المطلوبة، وتظهر رسائل الخطأ هذه مكتوبة بنفس اللغة التي يستخدمها المُستخدم على المتصفح (يعني إن كنت تستخدم الإصدار الفرنسي من متصفحك المُفضل فتسظهر رسالة الخطأ بالفرنسية). لا يقوم مُتصفح Safari بإظهار رسالة خطأ، وإنما ينقل التركيز Focus إلى الحقل المعني بالخطأ.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/Form-field-with-required-attribute-displaying-a-browser-generated-error-message-in-Opera.png"><img alt="Form-field-with-required-attribute-displaying-a-browser-generated-error-message-in-Opera" src="http://www.webtuts.me/wp-content/uploads/2013/06/Form-field-with-required-attribute-displaying-a-browser-generated-error-message-in-Opera.png"></a></dt><dd>حقل يملك خاصية required ورسالة الخطأ التي تطالب بملئه على مُتصفح opera</dd></dl></div><p dir="rtl">يتحكم كل مُتصفح في مظهر رسالة الخطأ وبالتالي فإن شكلها يختلف من مُتصفح إلى آخر، لكنه من غير المُمكن حاليا التحكم في هذا المظهر عبر CSS، إلا أن Chrome تُوفر آلية للقيام بذلك والتي يُمكن التعرف عليها بقراءة <a rel="external nofollow" href="http://www.broken-links.com/2011/06/16/styling-html5-form-validation-errors/">هذا المقال</a>. يبقى التحكم في مظهر الحقل المعني برسالة الخطأ مُمكنا باستخدام <a rel="external nofollow" href="http://html5doctor.com/css3-pseudo-classes-and-html5-forms/">شبه الفئة required:</a> إضافة إلى إمكانية تغيير رسالة الخطأ ومظهرها بالاستعانة بـ setCustomValidity الخاصة بـ JavaScript.</p><p dir="rtl">هناك أمر واحد يجب أخذه بالحسبان وهو أن عملية التحقق التي يقوم بها المُتصفح لدى استخدامك لهذه الخاصية لا تُغنيك من القيام بعملية تحقق على جانب الخادم من تطبيقك.</p><p dir="rtl">للمزيد حول التحكم في مظهر نماذج HTML5:</p><p dir="rtl"><a rel="external nofollow" href="http://www.broken-links.com/2011/03/28/html5-form-validation/">HTML5 Form Validation</a></p><p dir="rtl"><a rel="external nofollow" href="http://www.brucelawson.co.uk/2013/on-the-styling-of-forms/">On the styling of forms</a></p><h3 dir="rtl">pattern</h3><p dir="rtl">هذه الخاصية من شأنها أن تثير اهتمام الكثير من المُطورين. تقوم خاصية pattern بالتحقق من توافق قيمة الحقل مع تعبير قياسي (regular expression) خاصة بـ Javascript. تسمح هذه الخاصية من التحقق من أنماط مُعينة مما يتيح مثلا التدقيق في معرفات مُنتجات، أرقام فواتير، أرقام هواتف وما إلى ذلك. يُمكنك استخدام pattern للتحقق من أي نمط تريده.</p><p dir="rtl">إليكم مثالا حول كيفية استخدامها:</p><pre class="html ipsCode prettyprint">&lt;label&gt;Product Number:
&lt;input pattern="[0-9][A-Z]{3}" name="product" type="text" title="Single digit followed by three uppercase letters."/&gt;
&lt;/label&gt;</pre><p>النمط المُبين في هذا المثال ينص على أن مُعرف كل منتج يجب أن يبدأ برقم واحد متبوع بثلاث حروف كبيرة (uppercase letters). يُمكنك أن تجد قائمة بأكثر الأنماط شيوعا على موقع <a rel="external nofollow" href="http://html5pattern.com/Names">HTML5 Pattern</a>.</p><p dir="rtl">مثلما هو الحال مع required فإن المتصفحات الوحيدة التي تدعم pattern هي: Opera 9.5+، Firefox4+ ،Safari5+، IE10 وChrome5+، لكن مع التطور السريع لسوق المتصفحات فإنه من المحتمل أن تدعمها باقي المتصفحات لاحقا.</p><h3 dir="rtl">خاصية list والعنصر datalist</h3><p dir="rtl">تسمح خاصية list بربط حقل مُعين بقائمة من الخيارات. يجب أن تكون قيمة الخاصية list متطابقة مع خاصية ID المُتعلقة بالعنصر datalist الموجود في نفس الصفحة. تُعتبر datalist عنصرا جديدا في HTML5 والتي تُمثل قائمة من الخيارات التي يُمكن ربطها بأحد عناصر النموذج، والتي تُعطي نتيجة مشابهة لما يحدث لدى استخدامك لخانة البحث على مُتصفحك، حيث يتم عرض خيارات لدى كتابة الكلمات المُراد البحث عنها.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/Google-search-autosuggestions-in-Safari.png"><img alt="Google-search-autosuggestions-in-Safari" src="http://www.webtuts.me/wp-content/uploads/2013/06/Google-search-autosuggestions-in-Safari.png"></a></dt><dd>اقتراحات محرك بحث Google على متصفح Safari</dd></dl></div><p dir="rtl">المثال التالي يُبين كيفية استخدام كلا من list وdatalist:</p><pre class="html ipsCode prettyprint">&lt;label&gt;Your favorite fruit:
&lt;datalist id="fruits"&gt;
  &lt;option value="Blackberry"&gt;Blackberry&lt;/option&gt;
  &lt;option value="Blackcurrant"&gt;Blackcurrant&lt;/option&gt;
  &lt;option value="Blueberry"&gt;Blueberry&lt;/option&gt;
  &lt;!-- … --&gt;
&lt;/datalist&gt;
If other, please specify:
  &lt;input type="text" name="fruit" list="fruits"&gt;
&lt;/label&gt;</pre><p dir="rtl">يُمكن توفير تراجع أكثر رشاقة (superior graceful degradation) من مُجرد توفير عنصر option وذلك عبر إضافة عنصر select داخل الـ datalist. هذه الطريقة التي <a rel="external nofollow" href="http://adactio.com/journal/4272/">ابتكرها Jeremy Keith</a> تتوافق بشكل مثالي مع مبادئ تصميم HTML5 التي تحدثنا عنها من قبل:</p><pre class="html ipsCode prettyprint">&lt;label&gt;Your favorite fruit:
&lt;datalist id="fruits"&gt;
  &lt;select name="fruits"&gt;
    &lt;option value="Blackberry"&gt;Blackberry&lt;/option&gt;
    &lt;option value="Blackcurrant"&gt;Blackcurrant&lt;/option&gt;
    &lt;option value="Blueberry"&gt;Blueberry&lt;/option&gt;
    &lt;!-- … --&gt;
  &lt;/select&gt;
If other, please specify:
&lt;/datalist&gt;
  &lt;input type="text" name="fruit" list="fruits"&gt;
&lt;/label&gt;</pre><p dir="rtl">المتصفحات التي تدعم List وdatalist هي: Opera 9.5+ (الصورة المُبينة أسفله)، Chrome 20+، IE10، وFirefox4+.</p><div><dl><dt><a rel="external nofollow" href="http://www.webtuts.me/wp-content/uploads/2013/06/The-datalist-element-rendered-in-Opera.png"><img alt="The-datalist-element-rendered-in-Opera" src="http://www.webtuts.me/wp-content/uploads/2013/06/The-datalist-element-rendered-in-Opera.png"></a></dt><dd>عُنصر datalist كما يظهر على مُتصفح Opera</dd></dl></div><h3 dir="rtl">multiple</h3><p dir="rtl">يُمكننا أن نُحسن المثال السابق عبر الاستعانة بخاصية multiple والتي تسمح للمستخدم باختيار أكثر من قيمة واحدة من الـ datalist، ليصبح المثال السابق كالتالي:</p><pre class="html ipsCode prettyprint">&lt;label&gt;Your favorite fruit:
&lt;datalist id="fruits"&gt;
  &lt;select name="fruits"&gt;
    &lt;option value="Blackberry"&gt;Blackberry&lt;/option&gt;
    &lt;option value="Blackcurrant"&gt;Blackcurrant&lt;/option&gt;
    &lt;option value="Blueberry"&gt;Blueberry&lt;/option&gt;
    &lt;!-- … --&gt;
  &lt;/select&gt;
If other, please specify:
&lt;/datalist&gt;
  &lt;input type="text" name="fruit" list="fruits" multiple&gt;
&lt;/label&gt;</pre><p dir="rtl">لا يقتصر استخدام multiple مع datalist فقط، بل يُمكن استخدامها مع عدة حالات أخرى خاصة إذا ما تعلق الأمر مثلا بإدخال عناوين بريد إلكتروني أو لدى رفع أكثر من ملف كما هو مُبين في المثال التالي:</p><pre class="html ipsCode prettyprint">&lt;label&gt;Upload files:
&lt;input type="file" multiple name="upload"&gt;&lt;/label&gt;</pre><p dir="rtl">يدعم multiple المُتصفحات التالية: Firefox3.6+، Safari4+،  Opera11.5+، Internet Explorer 10 وChrome4+.</p><p dir="rtl">تعليق المُترجم: لم يتسن لي تجربة آلية عمل multiple مع غير الملفات (يعني الحقول النصية فقط)، إن كنت تعلم كيف يتم القيام بذلك فاترك تعليقا حول الأمر تُبين فيها ذلك.</p><h3 dir="rtl">novalidate وformnovalidate</h3><p dir="rtl">تُشير الخاصيتان novalidate وformnovalidate بأنه  يجب على المُتصفح أن لا يقوم بالتحقق من محتويات حقول النموذج لدى إرساله. كلا الخاصيتين منطقيتان boolean. يُمكن استخدام formnovalidate مع كل من أزرار الإرسال submit أو حقول الصور، أما خاصية novalidate فلا يُمكن استخدامها سوى مع العنصر form.</p><p dir="rtl">قد تتساءل ما هي الفائدة المرجوة من عدم التحقق من محتويات الحقول لدى إرسال النموذج، يُمكن استخدام formnovalidate على زر لحفظ بيانات نموذج مُعين دون الحاجة إلى التحقق من محتوياته (لإكمال النموذج لاحقا على سبيل المثال)، في هذه الحالة سنتمكن من حفظ النموذج بالرغم من أنه غير مُكتمل الحقول رغم أن هذه الحقول مطلوبة required لدى القيام بإرسال النموذج للمعالجة النهائية.</p><p dir="rtl">أما فيما يخص novalidate فُيمكن استخدامها مثلا في الحالات التي نود أن لا يتم التحقق من حقول النموذج لكننا نود الاستفادة من التحسينات الخاصة بتجربة المُستخدم والتي تقدمها خواص HTML5 الجديدة (نود مثلا أن يتم إظهار لوحة مفاتيح رقمية للمستخدمين عبر الهواتف الذكية لدى انتقالهم إلى حقل مُعين لكن لا نود أن يتم اقتصار ما يقومون بإدخاله على الأرقام فقط).</p><p dir="rtl">المثال التالي يُبين كيفية استخدام formnovalidate:</p><pre class="html ipsCode prettyprint">&lt;form action=”process.php”&gt;
    &lt;label for=”email”&gt;Email:&lt;/label&gt;
    &lt;input type=”email” name=”email” required&gt;
    &lt;input type=”submit” formnovalidate value=”Submit”&gt;
&lt;/form&gt;</pre><p dir="rtl">المثال التالي يخص حول استخدام novalidate:</p><pre class="html ipsCode prettyprint">&lt;form action=”process.php” novalidate&gt;
      &lt;label for=”email”&gt;Email:&lt;/label&gt;
      &lt;input type=”email”  name=”email”  required&gt;
      &lt;input type=”submit” value=”Submit”&gt;
&lt;/form&gt;</pre><p dir="rtl">form</p><p dir="rtl">يتم استخادم خاصية form لربط كل من input ،select أو textarea بنموذج مُعين (النموذج الذي تتبعه). استخدام خاصية form يسمح للمكونات سابقة الذكر أن لا تكون ذُرّية مباشرة (direct children) للنموذج الذي تنتمي إليه، مما يسمح بوضعه في مكان آخر داخل نفس الصفحة. قد يكون الاستخدام الأكثر شيوعا لهذه الخاصية هو ربط الأزرار الموجودة داخل جداول بالنماذج.</p><pre class="html ipsCode prettyprint">&lt;input type="button" name="sort-l-h" form="sort"&gt;</pre><p> </p><h3 dir="rtl">formaction، formenctype، formmethod وformtarget</h3><p dir="rtl">لدى كل من Formaction، formenctype، formmethod وformtarget ما يُقابلها من خصائص form والتي سبق لك أن تعاملت معها في HTML4. تم استحداث هذه الخصائص بشكل أساسي لأنه من المُمكن أن نحتاج في نماذجنا actions مختلفة تختلف باختلاف الأزرار التي نقوم بإرسال النموذج من خلالها بدل أن نقوم بإنشاء أكثر من نموذج للقيام بذلك.</p><p dir="rtl">إليكم وصفا سريعا لهذه الخصائص الجديدة:</p><h4 dir="rtl">formaction</h4><p dir="rtl">تحدد خاصية formaction  الملف أو التطبيق الذي سيتولى مهمة استقبال النموذج لدى إرساله حيث أنها تشغل نفس الوظيفة التي تشغلها خاصية action التي نضيفها إلى العنصر form. يقتصر استخدامها على الأزرار فقط سواء كانت submit أو صورا (type="submit"  أو  type="image"). لدى إرسال النموذج يقوم المُتصفح بالتحقق أولا من وجود خاصية formaction وفي حال ما إذا لم يجدها يقوم بالبحث حينها على الخاصية action.</p><pre class="html ipsCode prettyprint">&lt;input type="submit" value="Submit" formaction="process.php"&gt;</pre><h4 dir="rtl">formenctype</h4><p dir="rtl">تُحدد خاصية formenctype الطريقة التي يتم ترميز البيانات باستخدام POST. لهذه الخاصية نفس مفعول خاصية enctype الخاصة بالعنصر form ويقتصر استخدامها على الأزرار فقط سواء كانت submit أو صورا (type="submit"  أو  type="image"). إذا لم يتم تضمين هذه الخاصية فإنه يتم اعتماد قيمتها القياسية application/x-www-formurlencoded .</p><pre class="html ipsCode prettyprint">&lt;input type="submit" value="Submit" formenctype="application/x-www-form-urlencoded"&gt;</pre><h4 dir="rtl">Formmethod</h4><p dir="rtl">تُحدد خاصية formmethod فعل HTTP المُستخدم لإرسال النموذج  (GET،  POST،  PUTأو  DELETE)، لهذه الخاصية نفس مفعول خاصية method الخاصة بالعُنصر form، ويقتصر استخدامها على الأزرار فقط سواء كانت submit أو صورا (type="submit"  أو  type="image").</p><pre class="html ipsCode prettyprint">&lt;input type="submit" value="Submit" formmethod="POST"&gt;</pre><h4 dir="rtl">Formtarget</h4><p dir="rtl">تُحدد خاصية formtarget النافذة التي ستظهر نتيجة النموذج، لهذه الخاصية نفس مفعول خاصية target الخاصة بالعُنصر form، ويقتصر استخدامها على الأزرار فقط سواء كانت submit أو صورا (type="submit"  أو  type="image").</p><pre class="html ipsCode prettyprint">&lt;input type="submit" value="Submit" formtarget="_self"&gt;</pre><h2 dir="rtl">خلاصة</h2><p dir="rtl">استعرضنا في هذا المقال جُملة من الخصائص الجديدة التي تساعد على توفير تجربة مُستخدم أفضل للزائر وتساعدك على تقليص زمن كتابة نماذجك، لا تزال هناك بعضٌ من الخصائص الجديدة والتي سنتسعرضها في مقال قادم مع جُملة من أنواع المُدخلات الجديدة.</p><p dir="rtl">يُمكنك أن تجد نموذجا تجريبيا يستخدم بعضا من الأمثلة التي استعرضناها في هذا المقال <a rel="external nofollow" href="http://webtuts.me/codes/forms/forms-example.html">هنا</a>.</p><p dir="rtl">أشرنا خلال هذا المقال إلى المتصفحات التي تدعم الخواص التي استعرضناها، لكن مع الإصدارات الجديدة لكل متصفح والتي يتم إطلاقها بوتيرات متسارعة فإنه من الصعب معرفة ما الذي يدعمه هذا المتصفح وما الذي لا يدعمه ذاك المتصفح، لكن إن أردت البقاء على اطلاع فعليك زيارة المواقع التالية: <a rel="external nofollow" href="http://caniuse.com/">can I use …</a>، <a rel="external nofollow" href="http://fmbip.com/litmus/">FindMeByIP</a> ومحرك بحث <a rel="external nofollow" href="http://www.wufoo.com/html5/">Wufoo الخاص بالـ HTML5</a>.</p><p dir="rtl">ترجمة –وبتصرف- للمقال <a rel="external nofollow" href="http://html5doctor.com/html5-forms-introduction-and-new-attributes/">HTML5 forms introduction and new attributes</a> لصاحبه <a rel="external nofollow" href="https://twitter.com/Rich_Clark">Richard Clark</a></p><p dir="rtl">هذا المقال عبارة عن مُقتطف من الفصل السادس من كتاب <a rel="external nofollow" href="http://thewebevolved.com/">Beginning HTML5 and CSS3: The Web Evolved</a>.</p><p>تعليق المترجم: قد تكون ترجمة بعض المُصطلحات التقنية في هذا المقال غير دقيقة، أو أن هناك ترجمات أفضل لها، إن لاحظت أيا منها فلا تتردد في مراسلتي أو الإشارة إليها في التعليقات.</p>
]]></description><guid isPermaLink="false">4</guid><pubDate>Sun, 02 Jun 2013 15:06:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x645;&#x643;&#x62A;&#x628;&#x629; Modernizr</title><link>https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-modernizr-r3/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/modernizr_480x300.png.be0a983f15a38e069db857859f9f63ba.png" /></p>

<p dir="rtl">
	<strong>Modernizr</strong> هي مكتبة JavaScript  تقوم باكتشاف ميزات <strong>HTML5</strong> و<strong>CSS3</strong> التي يدعمها متصفح الزائر. قيامها بذلك بُتيح للمطور معرفة الخواص والتقنيات الجديدة المدعومة بشكل مُضمن في المتصفح والتي بإمكانه استخدامها بشكل مُباشر إضافة إلى تلك التي لا يدعمها، والتي يجب عليه أن يدعمها بطريقة تراجعية <strong>Fallback</strong>. يُطلق على هذه التقنية اسم اكتشاف الميزات (<strong>الخاصة</strong>) والتي تُعتبر تقنية أنجح بكثير من تقنية "التعرف على المتصفح" (browser sniffing).
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="modernizr-logo.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="96993" data-unique="tiqc4v3in" src="https://academy.hsoub.com/uploads/monthly_2022_04/modernizr-logo.jpg.f1e09316697e6c1b4c367f4de6c8d96a.jpg" style=""></p>

<p dir="rtl">
	تُعتبر Modernizr في غاية الأهمية لدى استكشاف خواص CSS3 المدعومة على المتصفح، لكننا سنركز في هذا المقال على HTML5 فقط، رغم أن مبدأ عمل المكتبة هو نفسه مع كلي الأمرين.
</p>

<p dir="rtl">
	تجدر الإشارة إلى أن Modernizr لا تقوم بتعويض النقص الناتج عن عدم دعم المتصفح لبعض الخواص أو ما يُعرف بالـ <a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills" rel="external nofollow">Polyfills</a>، كل ما تقوم بها المكتبة هو استكشاف إن كان المتصفح يدعم خاصية مُعينة من عدمه، لكنه يبقى بإمكانك استخدام Modernizr كجزء من آلية تعويض ذلك النقص.
</p>

<p dir="rtl">
	لا يدعم الإصدار الثامن من متصفح Internet Explorer والإصدارات التي تسبقه الخواص الجديدة للـ HTML5 بشكل قياسي، ولهذا إن احتجت دعم هذه المتصفحات فإنه يجب عليك تعويض هذا النقص ببعض الـ JavaScript. يُمكنك القيام بذلك باستخدام الشفرة التي سيلي استعراضها، كما يُمكنك القيام بذلك باستخدام <a href="https://code.google.com/p/html5shiv/" rel="external nofollow">HTML5 Shiv</a> الخاصة بـ ‎<a href="https://twitter.com/rem" rel="external nofollow">@rem</a> والتي تشمل جميع الخواص الجديدة.
</p>

<p dir="rtl">
	يساعدك Modernizr في القيام بذلك، وبالتالي فإن المرور عبر تضمين الـ Shiv غير ضروري.
</p>

<h2>
	البداية
</h2>

<p dir="rtl">
	بداية سنحتاج إلى ملف HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_51_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;title&gt;</span><span class="pln">Hello Modernizr</span><span class="tag">&lt;/title&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">"modernizr.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;/body&gt;</span><span class="pln">

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

<p>
	كما هو ظاهر في هذه الشفرة فإننا سنحتاج إلى ملف <span style="font-family:'courier new', courier, monospace;">modernizr.js</span> والذي يُمكنك <a href="http://www.modernizr.com/download/" rel="external nofollow">بناء نسخة منه ومن ثم تحميله</a> بناء على الخواص التي ترغب من التحقق من دعمها. يُمكنك القيام بذلك عبر اختيار Production  (الصورة الأولى) ومن ثم اختيار تلك الخواص مثلما هو ظاهر في الصورة الثانية. هذا الأمر يسمح باستخدام ملف صغير الحجم لأننا لا نقوم بتضمين جميع الخواص التي يُمكن لـ Modernizr استكشافها. يُوفر الموقع نسخة تطوير خاصة بالمكتبة، لكنه قبل أن ترفع موقعك إلى خادمك الخاص فإنك ستحتاج إلى ملف Production الذي يستكشف الخواص التي تحتاج استكشافها فقط.
</p>

<p style="text-align: center;">
	<img alt="download-modernizr.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="96994" data-unique="802kvjf11" src="https://academy.hsoub.com/uploads/monthly_2022_04/download-modernizr.jpg.d9d13fa2e1fff3e148f284ef63068d4c.jpg" style=""></p>

<p style="text-align: center;">
	خيارا تحميل Modernizr
</p>

<div class="mceTemp">
	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96995" href="https://academy.hsoub.com/uploads/monthly_2022_04/download-modernizr-2.jpg.a9c1d2bb357966becb05fcfa225a4abb.jpg" rel=""><img alt="download-modernizr-2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="96995" data-unique="g5kk38i5v" src="https://academy.hsoub.com/uploads/monthly_2022_04/download-modernizr-2.thumb.jpg.f2794608d656d3697df12b39807a3230.jpg" style="width: 550px; height: auto;"></a>
	</p>

	<p style="text-align: center;">
		اختيار خواص ومن ثم بناء ملف Modernizr
	</p>
</div>

<p dir="rtl">
	لاحظ أيضا في السطر الثاني في ملف HTML آنف الذكر وجود صنف <span style="font-family:'courier new', courier, monospace;">no-js</span> في وسم <span style="font-family:'courier new', courier, monospace;">&lt;html&gt;</span>. يقوم  Modernizr باستبدال هذا الصنف بصنف js والذي يُمكن أن يكون له فائدة في ملف CSS الخاص بك. إلى جانب صنف js يُضيف Modernizr أصنافا لكل الخواص التي يدعمها المتصفح، وللخواص التي لا يدعمها يُضيف أصنافا تُسبق أسماؤها بـ <span style="font-family:'courier new', courier, monospace;">no-</span>.
</p>

<p dir="rtl">
	إليك مثالين عن الأصناف التي يُضيفها Modernizr على كل من متصفحي Chrome 16 و IE9:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="" title="الخواص التي قام Modernizr باستكشافها على متصفح Chrome 16">
<span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"js flexbox canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths"</span><span class="tag">&gt;</span></pre>

<p>
	 
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="" title="الخواص التي قام Modernizr باستكشافها على متصفح IE9">
<span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"js no-flexbox canvas canvastext no-webgl no-touch geolocation postmessage no-websqldatabase no-indexeddb hashchange no-history draganddrop no-websockets rgba hsla multiplebgs backgroundsize no-borderimage borderradius boxshadow no-textshadow opacity no-cssanimations no-csscolumns no-cssgradients no-cssreflections csstransforms no-csstransforms3d no-csstransitions fontface generatedcontent video audio localstorage sessionstorage no-webworkers no-applicationcache svg inlinesvg smil svgclippaths"</span><span class="tag">&gt;</span></pre>

<h2>
	استكشاف العناصر
</h2>

<p dir="rtl">
	يقوم Modernizr بإنشاء كائن جافاسكربت عام (Global Object)  تحت اسم <span style="font-family:'courier new', courier, monospace;">Modernizr</span> مما يسمح لنا بالقيام باستعلامات حول مختلف خواص properties المتعلقة به وذلك عبر مناداة <span style="font-family:'courier new', courier, monospace;">Modernizr.featurename</span>  (أين featurename هي اسم الخاصية المراد التأكد من دعمها على المتصفح). وبالتالي إن أردنا مثلا التأكد إن كان المتصفح يدعم <span style="font-family:'courier new', courier, monospace;">canvas</span> فإننا نكتب التالي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</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">"This browser supports HTML5 canvas!"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

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

<p dir="rtl">
	بطبيعة الحال يُمكن أيضا التحقق ما إذا كان المتصفح لا يدعم خاصية مُعينة على النحو التالي:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</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">"This browser supports HTML5 canvas!"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    alert</span><span class="pun">(</span><span class="str">"no canvas :("</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<p dir="rtl">
	أو اختصار الأمر على النحو التالي:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;script&gt;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</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">"No canvas here"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

<h2>
	استكشاف الخواص وتعويض النقائص باستخدام YepNope
</h2>

<p dir="rtl">
	استعرضنا في المثال السابق أبسط طريقة لاستكشاف خواص المتصفح. الآن ماذا لو أردت التحقق من دعم المتصفح لخاصية مُعينة ثم أردت الاستعانة بالـ polyfill لجعل المتصفح يعمل بشكل أفضل؟ هذا ما يُمكنك القيام به لدى استخدامك لـ <a href="http://yepnopejs.com/" rel="external nofollow">YepNope</a>.
</p>

<p dir="rtl">
	<strong>YepNope</strong> عبارة عن أداة تحميل شرطية conditional loader، مما يعني بأنها لن تقوم بتحميل سوى السكربتات التي يحتاجها المُتصفح. تم تضمين YepNope مُباشرة ضمن Modernizr وبالتالي لا حاجة لك للتفكير أو القيام بتحميل أو الربط مع مكتبة Javascript أُخرى.
</p>

<h3 dir="rtl">
	لكن كيف نستعملها؟
</h3>

<p dir="rtl">
	سنقوم باستخدام Canvas كمثال هنا أيضا. يرغب المطورون عادة بدعم (القيام بـ Fallback لـ) المتصفحات التي لا تدعمها مثل IE8 أو الإصدارات السابقة له. الطريقة التقليدية للقيام بذلك هو ربط صفحة الـ HTML خاصتك بسكربت Polyfill يقوم بذلك كـ <a href="http://flashcanvas.net/" rel="external nofollow">FlashCanvas</a> مثلا:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"http://flashcanvas.net/bin/flashcanvas.js"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	المشكل مع هذا الحل هو أن كل المتصفحات ستقوم بتحميل هذا السكربت، رغم أن ذلك غير مطلوب ولا فائدة تُرجى منه. هناك من يرى أن وضع السكربت في تعليق شرطي conditional comment يحل هذا المشكل، لكن إن كان بإمكاننا إبقاء السكربت خارج شفرة الصفحة بشكل كامل فسيكون ذلك أفضل بكثير، وهنا يأتي دور  <span style="font-family:'courier new', courier, monospace;">Modernizr.load()‎</span> كما سبق ذكره فإنه تم تضمين YepNope داخل Modernizr وبالتالي فإنه من الممكن التحقق من خاصية مُعينة ومن ثم توفير Polyfill خاصة بها إن لم تكن مدعومة.
</p>

<p dir="rtl">
	تجدر الإشارة إلى أنه لا يتم تضمين <span style="font-family:'courier new', courier, monospace;">()load.</span> بشكل قياسي في ملف development، وبالتالي فإنه يجب عليك تضمينه لدى قيامك بـ'بناء' (build) الملف.
</p>

<p dir="rtl">
	الاستعمال القاعدي للدالة <span style="font-family:'courier new', courier, monospace;">()load.</span> يخص التحقق من خاصية مُعنية إن كانت مدعومة (yep) أو لا(nope). في المثال التالي سيقوم Modernizr بالتحقق من دعم Canvas وفي حال ما إذا لم تكن مدعومة، يقوم بتحميل FlashCanvas:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">load</span><span class="pun">({</span><span class="pln">

test</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">canvas</span><span class="pun">,</span><span class="pln">

nope</span><span class="pun">:</span><span class="pln"> </span><span class="str">'http://flashcanvas.net/bin/flashcanvas.js'</span><span class="pln">

</span><span class="pun">});</span></pre>

<p dir="rtl">
	إن كنت تملك IE8 على جهازك، الق نظرة على لسان تبويب Network في الـ Developer tools، ستلاحظ أن المتصفح يقوم بتحميل وتهيئة flashcanvas.js.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="ie8-network.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="96996" data-unique="dm8fl0d99" src="https://academy.hsoub.com/uploads/monthly_2022_04/ie8-network.jpg.9dab30a832998cd612c2bb0c9170fcce.jpg" style="width: 700px; height: auto;"></p>

<p dir="rtl" style="text-align: center;">
	تحميل FlashCanvas في IE8
</p>

<p dir="rtl">
	إليكم الآن مثالا أكثر فائدة والذي يقوم بالتحقق من دعم <span style="font-family:'courier new', courier, monospace;">&lt;input type="date"&gt;</span> ومن ثم تحميل ملفي jQuery وملف CSS لإنشاء مختار للتواريخ Data picker:
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"modernizr.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">

</span><span class="tag">&lt;script&gt;</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">load</span><span class="pun">({</span><span class="pln">

test</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">inputtypes</span><span class="pun">.</span><span class="pln">date</span><span class="pun">,</span><span class="pln">

nope</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'jquery-ui.css'</span><span class="pun">],</span><span class="pln">

complete</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</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="str">'input[type=date]'</span><span class="pun">).</span><span class="pln">datepicker</span><span class="pun">({</span><span class="pln">

dateFormat</span><span class="pun">:</span><span class="pln"> </span><span class="str">'yy-mm-dd'</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></pre>

<p>
	كما هو ظاهر من هذا السكربت، ستقوم الصفحة بالتحقق من دعم <span style="font-family:'courier new', courier, monospace;">&lt;input type="date"‎&gt;</span>، وفي حالة ما إذا لم تكن مدعومة، ستقوم بتحميل ملفي jQuery وملف CSS (في هذا المثال يُفترض بملف CSS أن يكون محليا). بعد الفراغ من ذلك (on complete) تتم مناداة الإضافة مع كل <span style="font-family:'courier new', courier, monospace;">&lt;input type="date"‎&gt;</span> الموجودة في الـ DOM. سيتم تحميل ملفات jQuery في العديد من المتصفحات، لكنه لن يتم ذلك على Opera (أو على أحدث إصدارات Chrome).
</p>

<p style="text-align: center;">
	<img alt="calendar-firefox.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96997" data-unique="umixh1h4i" src="https://academy.hsoub.com/uploads/monthly_2022_04/calendar-firefox.png.275fd062a73439340de8e8b1325adc84.png" style="width: 300px; height: auto;"></p>

<p style="text-align: center;">
	عنصر منتقي التاريخ من jQuery  في متصفح فيرفوكس
</p>

<p style="text-align: center;">
	<img alt="calendar-opera.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96998" data-unique="nr4l5zovh" src="https://academy.hsoub.com/uploads/monthly_2022_04/calendar-opera.png.a45f9c7d2abfa4452cd8fdf7d0e3aa1c.png" style="width: 300px; height: auto;"></p>

<p style="text-align: center;">
	عنصر منتقي التاريخ الأصلي في متصفح أوبرا
</p>

<p dir="rtl">
	نعتظهر الصورتان السابقتان الاختلافات الناتجة عن تحميل المتصفح لإضافة jQuery في الأول ودعمه للخاصية في الثاني.
</p>

<p dir="rtl">
	ويظهر الأمر أيضا بشكل واضح في قائمة الملفات التي يقوم كل متصفح بتحميلها:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="resources-firefox.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96999" data-unique="sfosxgnp1" src="https://academy.hsoub.com/uploads/monthly_2022_04/resources-firefox.png.659f7fb719beece861d0e30d173b181f.png" style=""></p>

<p dir="rtl" style="text-align: center;">
	تحميل موارد عنصر منتقي التاريخ في متصفح فيرفوكس
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="resources-opera.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97000" data-unique="0tuo3yx7t" src="https://academy.hsoub.com/uploads/monthly_2022_04/resources-opera.png.3b7b8c8ce8b41a3b3d969b16a7b1b878.png" style=""></p>

<p dir="rtl" style="text-align: center;">
	تحميل عنصر منتقي التاريخ في متصفح أوبرا
</p>

<p dir="rtl">
	لاحظوا هنا أن المتصفح يقوم بتحميل ملفي jQuery مرتين، وهو <a href="http://yepnopejs.com/#twice" rel="external nofollow">سلوك طبيعي لمكتبة YepNope</a>، ولذلك لا تقلق من الأمر فهو طبيعي.
</p>

<p dir="rtl">
	يُمكنك القيام بأكثر مما قُمنا به في هذين المثالين مع مكتبة YepNope. إليك المثال التالي <a href="http://yepnopejs.com/#testObject" rel="external nofollow">والمأخوذ مباشرة من موقع المكتبة</a> والذي سيتعرض كافة الخواص الممكنة لها (كل الخواص ليست مطلوبة):
</p>

<pre class="javascript ipsCode prettyprint prettyprinted" style="">
<span class="pln">yepnope</span><span class="pun">([{</span><span class="pln">

test </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* boolean(ish) - Something truthy that you want to test */</span><span class="pun">,</span><span class="pln">

yep </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* array (of strings) | string - The things to load if test is true */</span><span class="pun">,</span><span class="pln">

nope </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* array (of strings) | string - The things to load if test is false */</span><span class="pun">,</span><span class="pln">

both </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* array (of strings) | string - Load everytime (sugar) */</span><span class="pun">,</span><span class="pln">

load </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* array (of strings) | string - Load everytime (sugar) */</span><span class="pun">,</span><span class="pln">

callback </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* function ( testResult, key ) | object { key : fn } */</span><span class="pun">,</span><span class="pln">

complete </span><span class="pun">:</span><span class="pln"> </span><span class="com">/* function */</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></pre>

<h2>
	الخلاصة
</h2>

<p dir="rtl">
	Modernizr عبارة عن مكتبة استكشافية في غاية القوة، تسمح لك بالتحقق من إن كان المتصفح يدعم الخواص التي ترغب في استعمالها على صفحاتك، وبناء على ذلك تقوم الصفحات باستخدام تلك الخواص كما تدعمها تلك المتصفحات أو تقوم بالاستعانة بـ polyfill لتعويض النقص الناجم عن قصور المتصفح المستخدم في استعراض تلك الصفحات. قمنا في هذا المقال باستعراض كيفية إنشاء ملف Modernizr ومن ثم استخدامه بطريقتين مختلفين: استخدام كائن Modernizr بشكل مباشر (<span style="font-family:'courier new', courier, monospace;">Modernizr.&lt;featurename&gt;</span>) أو الاستعانة بـ YepNope.
</p>

<p dir="rtl">
	ترجمة –وبتصرف- للمقال: <a href="http://html5doctor.com/using-modernizr-to-detect-html5-features-and-provide-fallbacks/" rel="external nofollow">Using Modernizr to detect HTML5 features and provide fallbacks</a> لصاحبه: <a href="https://twitter.com/leads" rel="external nofollow">Tom Leadbetter</a>
</p>
]]></description><guid isPermaLink="false">3</guid><pubDate>Mon, 20 May 2013 14:58:00 +0000</pubDate></item></channel></rss>
