توفّر واجهة برمجة التطبيقات URLSearchParams
واجهة متّسقة
لإدخال أجزاء عنوان URL، كما تسمح بالتلاعب البسيط
بسلسلة طلب البحث (الجزء الذي يأتي بعد ?
).
يستخدم المطوّرون عادةً التعبيرات العادية وتقسيم السلاسل لاستخراج مَعلمات طلب البحث
من عنوان URL. لنكن صادقين مع أنفسنا، هذا ليس أمرًا ممتعًا.
وقد يكون من الصعب إجراء ذلك بدقة وبدون أخطاء. من أسراري الخفية أنّني أعدت استخدام
get|set|removeURLParameter
الطرق المساعِدة نفسها في العديد من تطبيقات Google.com الكبيرة، بما في ذلك Google Santa Tracker وموقع Google I/O 2015 الإلكتروني.
لقد حان الوقت لتوفير واجهة برمجة تطبيقات مناسبة تُجري هذه الإجراءات نيابةً عنا.
واجهة برمجة التطبيقات URLSearchParams
ينفِّذ الإصدار 49 من Chrome URLSearchParams
من مواصفات عناوين URL، وهي واجهة برمجة تطبيقات مفيدة للتعامل مع مَعلمات طلب البحث في عناوين URL. أرى أنّ URLSearchParams
هي بديل ملائم لعناوين URL، تمامًا كما كان FormData
بديلاً مناسبًا للنماذج.
ما هي الإجراءات التي يمكنك اتّخاذها؟ باستخدام سلسلة عنوان URL، يمكنك بسهولة استخراج قيم المَعلمات:
// Can also constructor from another URLSearchParams
const params = new URLSearchParams('q=search+string&version=1&person=Eric');
params.get('q') === "search string"
params.get('version') === "1"
Array.from(params).length === 3
for (let p of params) {
console.log(p);
}
ضبط قيمة مَعلمة:
params.set('version', 2);
إلحاق قيمة أخرى بمَعلمة حالية:
params.append('person', 'Tim');
params.getAll('person') === ['Eric', 'Tim']
حذف مَعلمات:
params.delete('person');
العمل مع عناوين URL
في معظم الأحيان، من المحتمل أن تعمل مع عناوين URL كاملة أو تعدِّل عنوان URL
لتطبيقك. يمكن أن تكون طريقة وضع التصميم URL
مفيدة بشكل خاص في الحالات التالية:
const url = new URL('https://example.com?foo=1&bar=2');
const params = new URLSearchParams(url.search);
params.set('baz', 3);
params.has('baz') === true
params.toString() === 'foo=1&bar=2&baz=3'
لإجراء تغييرات فعلية على عنوان URL، يمكنك الحصول على المَعلمات وتعديل قيمها، ثم استخدام history.replaceState
لتعديل عنوان URL.
// URL: https://example.com?version=1.0
const params = new URLSearchParams(location.search);
params.set('version', 2.0);
window.history.replaceState({}, '', `${location.pathname}?${params}`);
// URL: https://example.com?version=2.0
لقد استخدمتُ هنا سلاسل النماذج في ES6 لإعادة إنشاء عنوان URL معدَّل من مسار عنوان URL الحالي للتطبيق والمَعلمات المعدَّلة.
الدمج مع عناوين URL لأماكن أخرى
يؤدي إرسال FormData
في طلب واجهة برمجة التطبيقات fetch()
تلقائيًا إلى إنشاء نص مكوّن من أجزاء متعددة.
إذا كنت بحاجة إلى ذلك، يوفّر URLSearchParams
آلية بديلة لبيانات POST
التي يتم ترميزها باستخدام ترميز URL بدلاً من تنسيق MIME المتعدّد الأجزاء.
const params = new URLSearchParams();
params.append('api_key', '1234567890');
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
على الرغم من أنّه لم يتم تنفيذه بعد في Chrome، يتم دمج URLSearchParams
أيضًا
مع علامة URL
وعلامة a
. يتوافق كلاهما مع الصديق الجديد من خلال توفير
خاصية للقراءة فقط، .searchParams
للوصول إلى مَعلمات الطلب:
const url = new URL(location);
const foo = url.searchParams.get('foo') || 'somedefault';
تحصل الروابط أيضًا على سمة .searchParams
:
const a = document.createElement('a');
a.href = 'https://example.com?filter=api';
// a.searchParams.get('filter') === 'api';
رصد الميزات وتوافق المتصفّح
يتيح حاليًا الإصدار 49 من Chrome والإصدار 44 من Firefox والإصدار 36 من Opera استخدام URLSearchParams
.
if ('URLSearchParams' in window) {
// Browser supports URLSearchParams
}
بالنسبة إلى polyfills، أنصح باستخدام الرابط github.com/WebReflection/url-search-params.
عرض توضيحي
جرِّب العينة.
للاطّلاع على URLSearchParams
في تطبيق حقيقي، يمكنك الاطّلاع على أداة إنشاء مجموعات الرموز التعبيرية لتصميم المواد من Polymer. لقد استخدمتُها لإعداد الحالة الأولية للتطبيق من رابط لصفحة في التطبيق. ميزة مفيدة جدًا :)