Browser Object Model – BOM

BOM اختصار لـ Browser Object Model، وهو نموذج كائني (Object Model) يوفره المتصفح للتعامل مع النافذة والبيئة المحيطة بالصفحة (وليس المحتوى نفسه). يمكن القول إن BOM يمكّنك من الوصول إلى أشياء مثل:

  • النافذة (Window)
  • عناوين الصفحات
  • التنقل بين الصفحات
  • فتح نوافذ جديدة
  • التفاعل مع المستخدم (مثل alert)
  • معرفة معلومات عن الجهاز أو المتصفح
🧱 مكونات BOM الرئيسية:
1. window

هو الكائن الأساسي الذي يحتوي على كل شيء. كل كائن في BOM تقريبًا هو جزء من window.

مثال:
console.log(window.innerWidth);  // عرض النافذة
console.log(window.innerHeight); // ارتفاع النافذة
JavaScript

أو بدون كتابة window:

alert("مرحباً!"); // هي نفس window.alert("مرحباً!");
JavaScript
2. navigator

هو كائن مدمج في JavaScript يوفر معلومات حول المتصفح، مثل نوعه، نظام التشغيل، اللغة، دعم بعض الميزات، الاتصال، والمزيد

🔍 أهم خصائص navigator واستخداماتها:
الخاصيةالوصفمثال
navigator.userAgentمعلومات مفصلة عن المتصفح ونظام التشغيلnavigator.userAgent
navigator.languageلغة المتصفحnavigator.language
navigator.onLineهل المستخدم متصل بالإنترنت؟ (true/false)navigator.onLine
navigator.platformالنظام الذي يعمل عليه المتصفح (مثل Win32 أو Linux x86_64)navigator.platform
navigator.cookieEnabledهل الكوكيز مفعلة في المتصفح؟navigator.cookieEnabled
navigator.geolocationالوصول إلى موقع المستخدم الجغرافي (بإذن)navigator.geolocation.getCurrentPosition(...)
navigator.permissionsالوصول إلى صلاحيات المستخدم مثل المايك والكاميراnavigator.permissions.query({...})
navigator.hardwareConcurrencyعدد أنوية المعالجnavigator.hardwareConcurrency
navigator.clipboardقراءة وكتابة الحافظة (Clipboard)navigator.clipboard.writeText(...)
مثال:
console.log("المتصفح:", navigator.userAgent);
console.log("اللغة:", navigator.language);
console.log("النظام:", navigator.platform);
console.log("هل متصل بالإنترنت؟", navigator.onLine ? "نعم" : "لا");
JavaScript

التحقق من تفعيل الكوكيز:

if (navigator.cookieEnabled) {
  console.log("الكوكيز مفعلة ✅");
} else {
  console.log("الكوكيز غير مفعلة ❌");
}
JavaScript
5. نسخ نص إلى الحافظة:
navigator.clipboard.writeText("مرحبا بك!").then(() => {
  console.log("تم نسخ النص ✅");
});
JavaScript

⚠️ يحتاج HTTPS أو localhost وبعض الأذونات.

📌 ملاحظات مهمة:
  • بعض الخصائص قد تختلف حسب المتصفح.
  • بعض الخصائص تحتاج إذن من المستخدم (مثل الموقع الجغرافي، الحافظة).
  • لا يُستخدم navigator لجمع معلومات حساسة أو تتبع المستخدم بدون إذن.
3. location
✅ ما هو window.location؟

window.location هو كائن تابع لـ window يُستخدم للوصول إلى عنوان الصفحة الحالية (URL) أو تعديله أو إعادة التوجيه إلى صفحات أخرى.

بمعنى آخر: هو أداة للتحكم في رابط الصفحة.

📌 استخدامات window.location:
الاستخدامالوصف
قراءة عنوان الصفحةالحصول على الرابط الكامل الحالي
إعادة التوجيهتغيير عنوان الصفحة للانتقال لمكان آخر
تحديث الصفحةإعادة تحميل الصفحة الحالية
الوصول لأجزاء معينة من الرابطمثل البروتوكول، النطاق، المسار، …
🧱 خصائص window.location بالتفصيل:
1. href

يمثل الرابط الكامل (الرابط الكامل للصفحة).

console.log(location.href);
// مثال: "https://example.com/about?lang=ar#contact"
JavaScript

✅ يمكنك أيضًا تغيير الرابط به:

location.href = "https://google.com"; // ينقل المستخدم إلى جوجل
JavaScript
2. protocol

يعطي نوع البروتوكول المستخدم (http أو https).

console.log(location.protocol); // مثال: "https:"
JavaScript
3. host

يعطي النطاق + البورت (إن وجد).

console.log(location.host); // مثال: "example.com" أو "localhost:3000"
JavaScript
4. hostname

يعطي اسم النطاق فقط بدون البورت.

console.log(location.hostname); // مثال: "example.com"
JavaScript
5. port

يعيد رقم البورت المستخدم، إن وُجد.

console.log(location.port); // مثال: "3000"
JavaScript
6. pathname

يعطي المسار بعد اسم الموقع.

console.log(location.pathname);
// إذا كنت على: https://example.com/products/item
// الناتج سيكون: "/products/item"
JavaScript
7. search

يعطي الاستعلام الموجود في الرابط (Query String).

console.log(location.search);
// مثال: "?lang=ar&page=2"
JavaScript
8. hash

يعطي الجزء الموجود بعد # في الرابط (ويسمى Anchor).

console.log(location.hash);
// مثال: "#contact"
JavaScript
9. assign(url)

ينقل المستخدم إلى رابط جديد مع إمكانية العودة باستخدام زر الرجوع.

location.assign("https://openai.com");
JavaScript
10. replace(url)

ينقل المستخدم إلى رابط جديد بدون إمكانية الرجوع باستخدام زر الرجوع (يستبدل الصفحة الحالية).

location.replace("https://google.com");
JavaScript
11. reload(forceReload)

يعيد تحميل الصفحة.

  • إذا كانت true: يتم تجاهل الكاش.
  • إذا كانت false أو غير موجودة: يتم التحميل من الكاش.
location.reload();           // إعادة تحميل عادية
location.reload(true);       // إعادة تحميل من السيرفر (بدون كاش)
JavaScript

🧪 أمثلة عملية شاملة:

✅ مثال 1: عرض كل أجزاء الرابط

console.log("الرابط الكامل:", location.href);
console.log("البروتوكول:", location.protocol);
console.log("اسم النطاق:", location.hostname);
console.log("المسار:", location.pathname);
console.log("الاستعلام:", location.search);
console.log("الهاش:", location.hash);
JavaScript

✅ مثال 2: إعادة توجيه الزائر تلقائيًا بعد 5 ثواني

setTimeout(() => {
  location.href = "https://google.com";
}, 5000);
JavaScript

✅ مثال 3: رابط يحتوي على استعلامات – استخراج قيمة lang

// إذا كان الرابط مثلاً: https://example.com/?lang=ar
const queryString = location.search; // "?lang=ar"
const urlParams = new URLSearchParams(queryString);

console.log(urlParams.get("lang")); // "ar"
JavaScript

✅ مثال 4: تحديث الصفحة يدويًا بزر

<button onclick="location.reload()">إعادة تحميل الصفحة</button>
JavaScript

📌 ملخص سريع:

الخاصيةالوظيفة
hrefالرابط الكامل
protocolالبروتوكول (http / https)
hostالنطاق + البورت
hostnameاسم النطاق فقط
portرقم البورت (إن وُجد)
pathnameالمسار بعد النطاق
searchالاستعلام (Query string)
hashالهاش (بعد #)
assign(url)انتقال مع إمكانية الرجوع
replace(url)انتقال بدون إمكانية الرجوع
reload()إعادة تحميل الصفحة
4. history

يُستخدم للتنقل بين الصفحات التي زارها المستخدم داخل نفس الجلسة.

🧰 أهم خصائص ودوال history:
الخاصية / الدالةالوظيفة
history.lengthعدد الصفحات في سجل الجلسة
history.back()الانتقال إلى الصفحة السابقة (كأنك ضغطت زر الرجوع)
history.forward()الانتقال إلى الصفحة التالية (كأنك ضغطت زر التقدم)
history.go(n)الانتقال إلى صفحة معينة في السجل، حيث n هو عدد الصفحات للأمام أو الخلف
📌 استخدامات عملية:
🧪 1. معرفة عدد الصفحات في سجل الجلسة:
مثال:
console.log("عدد الصفحات في السجل:", history.length);
JavaScript

🔙 2. الانتقال للصفحة السابقة:

history.back(); // يعادل زر الرجوع في المتصفح
JavaScript
history.forward(); // يعادل زر التقدم في المتصفح
JavaScript

🔁 4. الانتقال بخطوات مخصصة:

history.go(-1); // صفحة للخلف
history.go(1);  // صفحة للأمام
history.go(-2); // صفحتين للخلف
JavaScript
  <button onclick="history.back()">⬅️ الرجوع</button>
  <button onclick="history.forward()">➡️ التقدم</button>
  <button onclick="history.go(-1)">🔙 صفحة للخلف</button>
JavaScript

history.length لا يعطي عدد كل صفحات التاريخ، فقط عدد الصفحات التي تم زيارتها في الجلسة الحالية لنفس التبويب.

history.go(0) تعني إعادة تحميل الصفحة الحالية.

لا يمكنك رؤية أو الوصول لمحتوى السجل لحماية خصوصية المستخدم، فقط تستطيع التنقل فيه.

5. screen

🧠 ما هو screen في JavaScript؟

هو كائن من كائنات BOM يوفر معلومات عن شاشة الجهاز مثل:

عمق الألوان

العرض الكامل للشاشة

الطول الكامل

مساحة العرض المتاحة (بعد خصم شريط المهام)

🧰 أهم خصائص screen:

الخاصيةالوصف
screen.widthعرض الشاشة (بالبكسل)
screen.heightارتفاع الشاشة (بالبكسل)
screen.availWidthالعرض المتاح (بدون شريط المهام مثل شريط ويندوز السفلي)
screen.availHeightالارتفاع المتاح
screen.colorDepthعمق الألوان (عادة 24 أو 32)
screen.pixelDepthعمق البكسل (عادة مساوية لـ colorDepth)
مثال:
console.log(screen.width);  // عرض الشاشة الكلي
console.log(screen.height); // ارتفاع الشاشة الكلي
JavaScript
6. alert, prompt, confirm

طرق للتفاعل مع المستخدم.

أمثلة:
alert("هذه رسالة تنبيه");
let name = prompt("ما اسمك؟");
let confirmed = confirm("هل أنت متأكد؟");
JavaScript
🧩 الفرق بين BOM و DOM
المقارنةBOMDOM
المعنىBrowser Object ModelDocument Object Model
الوظيفةالتعامل مع البيئة الخارجية للصفحةالتعامل مع محتوى الصفحة (HTML)
الأمثلةwindow, location, historydocument, getElementById, innerHTML

🧪 مثال عملي يدمج بين BOM و DOM

<button onclick="showInfo()">اعرض معلومات المتصفح</button>

<script>
  function showInfo() {
    alert("عرض الشاشة: " + screen.width + "x" + screen.height);
    alert("نوع المتصفح: " + navigator.userAgent);
    alert("الرابط الحالي: " + location.href);
  }
</script>
JavaScript