انتقل إلى محتوى الدرس
الدرس 84
دورة جافا سكريبت

كائن الرابط window location في JavaScriptJavaScript Window Location Object

أتقن التعامل مع كائن الرابط window.location في JavaScript: فكك أجزاء العنوان وحلل الاستعلامات عبر URLSearchParams وقارن بين assign وreplace واحمِ تطبيقك من التوجيه المفتوح.
أقسام الدرس
5
الأمثلة
3
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
4,307
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

يتوفر الكائن Location عبر window.location (أو document.location)، ويتولى تفكيك عنوان الصفحة الحالي تلقائياً إلى خصائص منظمة جاهزة للقراءة تغنيك تماماً عن التقطيع النصي اليدوي المعرض للأخطاء.

فعند وجود رابط كامل مثل https://www.closetag.com/tutorials/js?level=2#quiz، يقابل كل جزء من البروتوكول واسم النطاق والمسار ومعاملات الاستعلام والمرساة خاصيةً مستقلةً وواضحة على الكائن location.

مخطط تشريح أجزاء الرابط في كائن window.location: الأصل origin والمسار pathname والاستعلام search والمرساة hash

يوضح الجدول التالي أهم خصائص قراءة أجزاء الرابط على الكائن window.location لعنوان مثل https://app.example.com:8443/shop/items?sort=price#top:

الخاصيةالقيمة الراجعةملاحظة دقيقة
location.hrefسلسلة الرابط الكاملةإسناد رابط جديد إليها يوجّه الصفحة فوراً
location.origin"https://app.example.com:8443"للقراءة فقط (البروتوكول + المضيف + المنفذ)
location.protocol"https:"ينتهي دائماً بنقطتين رأسيتين :
hostname مقابل hostبدون المنفذ مقابل شامل المنفذhost يشمل رقم المنفذ بينما hostname يقتصر على الاسم
location.pathname"/shop/items"المسار الداخلي بدون الاستعلام أو المرساة
search وhash"?sort=price" و"#top"تُرجع نصاً فارغاً "" عند غيابها من الرابط
JavaScript
const out = document.getElementById('loc-out');
const parts = [
  'protocol: ' + window.location.protocol,
  'origin: ' + window.location.origin,
  'pathname: ' + window.location.pathname,
  'href length: ' + window.location.href.length
];
out.textContent = parts.join('\n');

تجنب تقسيم نص location.search يدوياً عبر split("&")؛ فالتقسيم اليدوي يفشل مع المسافات المرمّزة (%20 أو +) وكلمات البحث العربية وتكرار المفاتيح. بدلاً من ذلك، مرر النص مباشرةً إلى الباني القياسي new URLSearchParams(window.location.search):

  • params.get("q"): تقرأ القيمة وتفك ترميزها تلقائياً (أو تُرجع null عند غيابها).
  • params.has("featured"): تتحقق منطقياً من وجود المعامل في الرابط.
  • params.set("page", "2") مع params.toString(): تبني نص استعلام مرمّز ونظيف بأمان تام.
JavaScript
const sampleQuery = '?topic=bom+location&page=3&lang=ar';
const params = new URLSearchParams(sampleQuery);
params.set('page', '4');
document.getElementById('qp-out').textContent =
  'topic: ' + params.get('topic') + '\n' +
  'has lang: ' + params.has('lang') + '\n' +
  'next query: ?' + params.toString();

تنقل كلتا الدالتين window.location.assign(url) (وهي مكافئة لإسناد location.href = url) وwindow.location.replace(url) المتصفح إلى صفحة جديدة، غير أن بينهما فرقاً جوهرياً في التعامل مع زر الرجوع للخلف:

  • location.assign(url): تحفظ الصفحة الحالية في سجل التصفح، فيستطيع الزائر العودة إليها بالنقر على زر الرجوع.
  • location.replace(url): تستبدل الصفحة الحالية في السجل دون حفظها، وهي الخيار الأمثل بعد إتمام تسجيل الدخول حتى لا يعيد زر الرجوع المستخدم إلى شاشة دخول منتهية أو حلقة توجيه مفرغة!

يُعيد استدعاء window.location.reload() تحميل الصفحة الحالية من جديد (وتُستدعى قياسياً بلا أي معاملات لأن المتصفحات الحديثة أهملت المعامل القديم true).

قاعدة أمنية حاسمة (الوقاية من التوجيه المفتوح وDOM XSS): تقرأ كثير من المواقع معامل عودة بعد تسجيل الدخول مثل ?returnTo=/profile لتوجيه المستخدم إليه؛ فإذا زوّر مهاجم الرابط ليصبح ?returnTo=https://phish.example (ثغرة Open Redirect) أو ?returnTo=javascript:alert(1) (ثغرة DOM XSS)، فإن التوجيه الأعمى يوقع الضحية في الفخ فوراً! حلّل المسار دائماً عبر new URL(target, window.location.origin) واشترط تطابق الأصل parsed.origin === window.location.origin.

JavaScript
function safeReturnPath(rawTarget) {
  try {
    const base = 'https://closetag.com';
    const u = new URL(rawTarget, base);
    return u.origin === base ? u.pathname : '/home';
  } catch (err) {
    return '/home';
  }
}
document.getElementById('val-out').textContent =
  'Valid: ' + safeReturnPath('/courses') + '\n' +
  'Blocked: ' + safeReturnPath('https://evil.test/login');
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

فككت في هذا الدرس أجزاء العنوان عبر خصائص window.location، وحللت معاملات البحث بأمان عبر URLSearchParams، وقارنت بين assign() وreplace()، وحصّنت التوجيه ضد ثغرتي Open Redirect وروابط javascript: عبر فحص origin. الخطوة التالية: انتقل الآن إلى درس «كائن سجل التصفح window history في JavaScript» للتنقل عبر خطوات الجلسة بدوال back() وforward() وgo().

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 window.location.origin خاصية الأصل الأمني location.origin
نص للقراءة فقط يجمع البروتوكول واسم المضيف ورقم المنفذ للرابط الحالي.
للمراجعة
02 URLSearchParams واجهة تحليل معاملات الاستعلام URLSearchParams
واجهة قياسية تفكك وتقرأ وتُرمّز معاملات البحث في الرابط بأمان تام دون تقسيم نصي يدوي.
للمراجعة
03 location.replace() دالة الاستبدال بدون رجوع location.replace
توجه المتصفح إلى رابط جديد مع استبدال الصفحة الحالية في السجل لمنع الرجوع إليها بزر الخلف.
للمراجعة
04 Open Redirect Vulnerability ثغرة التوجيه المفتوح Open Redirect
ثغرة أمنية تنشأ عند تمرير رابط من مدخلات الزائر دون فحص أصله مما يوجه الضحية لموقع خارجي خبيث.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 URI URI
Uniform Resource Identifier
المعرف القياسي الموحد للموارد الذي ينظم صيغة الروابط والمسارات ومعاملات الاستعلام.
للمراجعة
02 HTTPS HTTPS
Hypertext Transfer Protocol Secure
بروتوكول نقل النص الفائق المشفر ويظهر بالقيمة "https:" داخل خاصية location.protocol.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. في مثال URLSearchParams، أضف السطر params.set("sort", "newest") وتحقق من ظهور المعامل المضاف في نص المخرجات.

  2. مرّر النص "//evil.test/phish" للدالة resolveSafeReturnPath() في محرر التجربة وتأكد من إحباطه وإرجاع المسار الآمن "/home".

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

للرابط "https://closetag.com/tutorials/js?tab=1#top"، ما القيمة التي ترجعها الخاصية window.location.pathname؟

02

ما القيمة الدقيقة التي ترجعها الخاصية window.location.protocol في صفحة مؤمنة ببروتوكول HTTPS؟

03

ما الواجهة القياسية المصممة لقراءة وفك ترميز معاملات البحث من window.location.search بنظافة وأمان؟

04

بماذا تختلف الدالة location.replace(url) عن الدالة location.assign(url)؟

05

الخاصية window.location.origin هي خاصية للقراءة فقط تجمع البروتوكول واسم المضيف والمنفذ.

06

أي دالة تعيد تحميل صفحة الويب الحالية بالصيغة القياسية في المتصفحات الحديثة؟

07

لماذا لا يكفي فحص target.startsWith("/") وحده لمنع ثغرة التوجيه المفتوح Open Redirect؟

08

ما الطريقة الهندسية الأأمن للتحقق من أن رابط التوجيه المتغير ينتمي لنفس موقعك الأصلي؟

09

إسناد مرساة قسم مثل "#section" إلى window.location.hash ينقل العرض للعنصر المطابق دون إعادة تحميل الصفحة من الخادم.

10

ماذا ترجع الدالة params.get("coupon") على كائن URLSearchParams إذا لم يكن المعامل "coupon" موجوداً في الرابط؟