شرح الوسم IFrame (تضمين محتوى من موقع أخر) | HTML
شرح وسم Iframe (تضمين الصفحات)
يُعد وسم Iframe من أقوى وأهم الوسوم في لغة HTML، حيث يسمح لك بعرض صفحة ويب كاملة داخل صفحة ويب أخرى. يستخدم هذا الوسم بكثرة لعرض الخرائط، الفيديوهات (مثل يوتيوب)، الإعلانات، أو حتى تطبيقات ويب مصغرة داخل موقعك. هذا الدرس سيشرح كل تفصيلة صغيرة وكبيرة حول هذا الوسم وكيفية التعامل معه باحترافية وأمان.
مفهوم Iframe وأساسيات الاستخدام
الوسم <iframe> هو اختصار لـ "Inline Frame" أي "إطار مضمن". وهو يسمح بإنشاء نافذة داخل صفحتك تعرض محتوى من مصدر آخر.
الخصائص الأساسية (Attributes)
- الوسم
<iframe>: هو الوسم الحاوي، ويجب أن يكون له وسم إغلاق. - الخاصية
src: (Source) هي أهم خاصية، حيث نضع فيها رابط الصفحة (URL) التي نريد عرضها داخل الإطار. - الخاصية
title: تستخدم لوصف محتوى الإطار. هذه الخاصية بالغة الأهمية لبرامج قراءة الشاشة (Screen Readers) لمساعدة ذوي الإعاقة البصرية على فهم محتوى الإطار. - ملاحظة هامة: بعض المواقع الكبرى (مثل Google و Facebook) تمنع عرض صفحاتها داخل iframe في مواقع أخرى لأسباب أمنية (تسمى الحماية من Clickjacking)، لذا قد لا تعمل بعض الروابط إذا جربتها.
مثال (1): البنية الأساسية
<h2>صفحة ويب داخلية</h2>
<!-- إطار بسيط يعرض موقعاً آخر -->
<iframe
src="https://www.wikipedia.org/"
title="موقع ويكيبيديا">
</iframe>
<p>لاحظ كيف يظهر الموقع أعلاه داخل صندوق في صفحتنا.</p>
اختر - ما هي الخاصية المسؤولة عن تحديد رابط الموقع الذي سيظهر داخل الـ Iframe؟
(أ) href. (ب) link. (ج) src. (د) source.
الإجابة: (ج) src. (وهي اختصار لـ Source وتعني المصدر).
التحكم في الأبعاد والمظهر (Styling)
افتراضياً، يظهر الـ iframe بحدود سميكة وأبعاد صغيرة. يمكننا التحكم في ذلك باستخدام خصائص HTML القديمة أو يفضل استخدام CSS.
تغيير الطول والعرض وإزالة الحدود
- الخاصية
width: لتحديد عرض الإطار (يمكن بالبكسل px أو النسبة المئوية %). - الخاصية
height: لتحديد ارتفاع الإطار. - إزالة الإطار (Border): قديماً كانت تستخدم خاصية
frameborder="0"، ولكن الطريقة الحديثة والصحيحة هي استخدام CSS عن طريقstyle="border: none;". - تغيير شكل الإطار: يمكنك بدلاً من إزالته، تلوينه وتغيير شكله باستخدام CSS Border (مثل
border: 2px solid red;).
مثال (2): تنسيق الـ Iframe
<!-- إطار بعرض 100% وارتفاع 500 بكسل وبدون حدود -->
<iframe
src="https://www.example.com"
title="موقع تجريبي"
width="100%"
height="500"
style="border: none;">
</iframe>
<!-- إطار بحدود ملونة -->
<iframe
src="demo_page.html"
width="300"
height="200"
style="border: 3px dashed blue;">
</iframe>
اختر - ما هي أفضل طريقة حديثة لإزالة الحدود (Border) المحيطة بالـ Iframe؟
(أ) استخدام السمة remove-border. (ب) استخدام CSS style="border:none". (ج) استخدام السمة frameborder="0". (د) مسح وسم الإغلاق.
الإجابة: (ب) استخدام CSS style="border:none". (الطريقة الأخرى قديمة وغير مفضلة في HTML5).
فتح الروابط داخل الإطار (Targeting)
يمكن استخدام الـ iframe كـ "هدف" (Target) للروابط. بمعنى، عند الضغط على رابط في صفحتك، تفتح الصفحة الجديدة داخل الـ iframe الموجود في نفس الصفحة بدلاً من فتح نافذة جديدة.
كيفية الربط بين الرابط والـ Iframe
- الخاصية
nameفي Iframe: يجب أولاً إعطاء اسم مميز للإطار باستخدام الخاصيةname="myFrameName". - الخاصية
targetفي الرابط (Anchor): في وسم الرابط<a>، نستخدم الخاصيةtargetونضع فيها نفس الاسم الذي اخترناه للإطار. - عند الضغط على الرابط، سيبحث المتصفح عن iframe يحمل هذا الاسم ويقوم بتحميل الرابط بداخله.
مثال (3): قائمة روابط تفتح في نافذة واحدة
<!-- الروابط التي تتحكم في الإطار -->
<p>اختر موقعاً لعرضه:</p>
<ul>
<li><a href="https://www.wikipedia.org" target="content_frame">فتح ويكيبيديا</a></li>
<li><a href="https://www.bing.com" target="content_frame">فتح محرك بينج</a></li>
</ul>
<!-- الإطار الذي سيعرض المحتوى -->
<!-- لاحظ الاسم هنا يطابق الـ target في الروابط -->
<iframe
src="about:blank"
name="content_frame"
width="100%"
height="400"
style="border:1px solid #ccc;">
</iframe>
اختر - لكي يفتح الرابط داخل iframe محدد، يجب أن تتطابق قيمة _____ في الرابط مع قيمة _____ في الـ iframe.
(أ) src مع href. (ب) target مع name. (ج) id مع class. (د) alt مع title.
الإجابة: (ب) target مع name. (نضع اسم الإطار في خاصية target للرابط).
الحماية والأمان (Sandbox Attribute)
تضمين محتوى خارجي يمثل خطراً أمنياً محتملاً، لأن الصفحة المضمنة قد تحتوي على أكواد خبيثة، أو تحاول سرقة بيانات، أو تفتح نوافذ منبثقة (Pop-ups) مزعجة. هنا يأتي دور خاصية sandbox.
كيف يعمل Sandbox؟
- عند إضافة كلمة
sandboxفقط للوسم، يتم تفعيل أقصى درجات القيود. يتم منع السكربتات (JS)، منع النماذج (Forms)، ومنع النوافذ المنبثقة. - يمكنك تخفيف هذه القيود بإضافة قيم محددة داخل الخاصية (سماحيات).
- يعتبر هذا "صندوق رملي" يعزل الكود المضمن عن موقعك الأصلي لحمايته.
قيم Sandbox المتاحة
| القيمة (Value) | الوظيفة (السماحية) |
|---|---|
| (فارغة) sandbox="" | تطبق جميع القيود (لا سكربتات، لا نماذج، لا وصول للكوكيز). |
| allow-scripts | تسمح بتشغيل ملفات JavaScript داخل الإطار (ولكن لا تسمح بتغيير محتوى النافذة الأم). |
| allow-same-origin | تسمح للإطار بأن يُعامل وكأنه من نفس الموقع (يسمح بالوصول للكوكيز والتخزين المحلي). *خطر إذا كان المصدر غير موثوق*. |
| allow-forms | تسمح بإرسال البيانات عبر النماذج (Forms) داخل الإطار. |
| allow-popups | تسمح للصفحة المضمنة بفتح نوافذ منبثقة (مثل window.open). |
| allow-top-navigation | تسمح للصفحة المضمنة بتغيير رابط الصفحة الرئيسية (الأم) كاملة. |
مثال (4): استخدام Sandbox
<!-- إطار مقيد تماماً: لا جافاسكريبت ولا نماذج -->
<iframe src="unknown_site.html" sandbox></iframe>
<!-- إطار يسمح فقط بالجافاسكريبت والنماذج -->
<iframe
src="game_app.html"
sandbox="allow-scripts allow-forms">
</iframe>
اختر - إذا قمت بإضافة خاصية sandbox للـ iframe ولكنك أردت السماح بتشغيل أكواد JavaScript بداخله، ماذا تضيف؟
(أ) allow-js. (ب) enable-scripts. (ج) allow-scripts. (د) no-sandbox.
الإجابة: (ج) allow-scripts. (هذه القيمة تفتح القيد الخاص بالسكربتات).
تضمين الوسائط (YouTube & Maps) والتحميل الكسول
أكثر استخدامات الـ iframe شيوعاً هو تضمين فيديوهات يوتيوب وخرائط جوجل. توفر هذه المنصات أكواد جاهزة للنسخ، ولكن من المهم فهم بعض الخصائص الإضافية.
تضمين يوتيوب وسمات خاصة
- allowfullscreen: هذه الخاصية تسمح للفيديو بأن يملأ الشاشة عند الضغط على زر التكبير. بدونها لن يعمل زر Fullscreen.
- الخاصية
loading="lazy": هذه خاصية حديثة ورائعة للأداء. تعني أن المتصفح لن يقوم بتحميل محتوى الـ iframe إلا عندما ينزل المستخدم (Scroll) ويقترب من مكان الإطار. هذا يسرع تحميل صفحتك بشكل كبير جداً.
مثال (5): فيديو يوتيوب مع تحميل كسول
<!-- تضمين فيديو يوتيوب -->
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
loading="lazy">
</iframe>
<!-- تضمين خريطة جوجل -->
<iframe
src="https://www.google.com/maps/embed?..."
width="600"
height="450"
style="border:0;"
allowfullscreen=""
loading="lazy">
</iframe>
اختر - ما فائدة استخدام الخاصية loading="lazy" مع الـ iframe؟
(أ) تمنع تحميل الفيديو نهائياً. (ب) تسرع تحميل الصفحة بتأجيل تحميل الإطار حتى يصل المستخدم إليه. (ج) تجعل الفيديو يعمل ببطء. (د) تقوم بتشغيل الفيديو تلقائياً.
الإجابة: (ب) تسرع تحميل الصفحة بتأجيل تحميل الإطار حتى يصل المستخدم إليه. (تحسين الأداء Performance).