URLSearchParams
API یک رابط ثابت برای بیتها و تکههای URL فراهم میکند و امکان دستکاری بیاهمیت رشته پرس و جو را فراهم میکند (این موارد بعد از ?
).
به طور سنتی، توسعه دهندگان از regex و تقسیم رشته برای بیرون کشیدن پارامترهای پرس و جو از URL استفاده می کنند. اگر همه ما با خودمان صادق باشیم، جالب نیست. درست شدن می تواند خسته کننده و مستعد خطا باشد. یکی از رازهای تاریک من این است که از همان روشهای کمکی get|set|removeURLParameter
در چندین برنامه بزرگ Google.com از جمله Google Santa Tracker و Google I/O 2015 استفاده مجدد کردهام.
وقت آن است که یک API مناسب داشته باشیم که این کارها را برای ما انجام دهد!
URLSearchParams API
Chrome 49 URLSearchParams
از مشخصات URL پیادهسازی میکند، یک API که برای بررسی پارامترهای جستجوی 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()
API یک بدنه چند بخشی ایجاد می کند. اگر به آن نیاز دارید، URLSearchParams
مکانیزمی جایگزین برای دادههای POST فراهم میکند که به جای چندبخشی urlencod شدهاند.
const params = new URLSearchParams();
params.append('api_key', '1234567890');
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
اگرچه هنوز در کروم پیادهسازی نشده است، 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';
تشخیص ویژگی و پشتیبانی مرورگر
در حال حاضر، Chrome 49، Firefox 44، و Opera 36 از URLSearchParams
پشتیبانی میکنند.
if ('URLSearchParams' in window) {
// Browser supports URLSearchParams
}
برای polyfills، من یکی را در github.com/WebReflection/url-search-params توصیه می کنم.
نسخه ی نمایشی
نمونه را امتحان کنید!
برای دیدن URLSearchParams
در یک برنامه دنیای واقعی، Iconset Generator طراحی مواد پلیمر را بررسی کنید. من از آن برای تنظیم وضعیت اولیه برنامه از یک پیوند عمیق استفاده کردم. خیلی خوش دست :)