API URLSearchParams
menyediakan antarmuka
yang konsisten untuk bit dan potongan URL, serta memungkinkan manipulasi
string kueri dengan mudah (yang terjadi setelah ?
).
Biasanya, developer menggunakan ekspresi reguler dan pemisahan string untuk mengambil parameter
kueri dari URL. Jika kita semua jujur pada diri sendiri, itu tidak menyenangkan.
Hal ini bisa merepotkan dan rawan kesalahan untuk memperbaikinya. Salah satu rahasia gelap saya adalah saya telah menggunakan kembali
get|set|removeURLParameter
metode bantuan yang sama di beberapa aplikasi besar Google.com, termasuk Google Pelacak Sinterklas dan web Google I/O 2015.
Saatnya membuat API yang tepat yang akan melakukannya untuk kita!
API URLSearchParams
Chrome 49 mengimplementasikan URLSearchParams
dari spesifikasi URL, sebuah API yang berguna untuk mengutak-atik parameter kueri URL. Saya menganggap URLSearchParams
sebagai kenyamanan yang setara dengan URL
seperti halnya FormData
untuk formulir.
Jadi, apa yang dapat dilakukan dengan model tersebut? Dengan mempertimbangkan string URL, Anda dapat dengan mudah mengekstrak nilai parameter:
// 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);
}
set sebuah nilai parameter:
params.set('version', 2);
append nilai lain untuk parameter yang ada:
params.append('person', 'Tim');
params.getAll('person') === ['Eric', 'Tim']
delete parameter:
params.delete('person');
Menangani URL
Biasanya, Anda mungkin akan menggunakan URL lengkap atau mengubah URL aplikasi. Konstruktor URL
dapat sangat berguna untuk kasus-kasus berikut:
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'
Untuk melakukan perubahan aktual pada URL, Anda dapat mengambil parameter, memperbarui nilainya, lalu menggunakan history.replaceState
untuk memperbarui 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
Di sini, saya telah menggunakan string template ES6 untuk merekonstruksi URL yang telah diupdate dari jalur URL aplikasi yang ada dan parameter yang dimodifikasi.
Integrasi dengan URL tempat lain digunakan
Secara default, mengirim FormData
dalam permintaan API fetch()
akan membuat isi multibagian.
Jika Anda membutuhkannya, URLSearchParams
menyediakan mekanisme alternatif untuk data POST
yang dienkode dengan URL, bukan multibagian mime.
const params = new URLSearchParams();
params.append('api_key', '1234567890');
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
Meskipun belum diterapkan di Chrome, URLSearchParams
juga terintegrasi
dengan konstruktor URL
dan tag a
. Keduanya mendukung rekan baru kita dengan memberikan
properti hanya baca, .searchParams
untuk mengakses parameter kueri:
const url = new URL(location);
const foo = url.searchParams.get('foo') || 'somedefault';
Link juga mendapatkan properti .searchParams
:
const a = document.createElement('a');
a.href = 'https://example.com?filter=api';
// a.searchParams.get('filter') === 'api';
Deteksi fitur dan dukungan browser
Saat ini, Chrome 49, Firefox 44, dan Opera 36 mendukung URLSearchParams
.
if ('URLSearchParams' in window) {
// Browser supports URLSearchParams
}
Untuk polyfill, saya merekomendasikan yang ada di github.com/WebReflection/url-search-params.
Demo
Coba contohnya.
Untuk melihat URLSearchParams
di aplikasi dunia nyata, lihat Generator Ikonset desain material Polymer. Saya menggunakannya untuk menyiapkan status awal aplikasi dari deep link. Cukup bermanfaat :)