Łatwe manipulowanie adresami URL za pomocą parametru URLSearchParams

Interfejs API URLSearchParams zapewnia spójny interfejs fragmentów adresu URL i umożliwia łatwe wprowadzanie zmian w ciągu zapytania (te po ?).

Deweloperzy tradycyjnie używają wyrażeń regularnych i dzielenia ciągu znaków, aby wyodrębniać parametry zapytania z adresu URL. Jeśli jesteśmy szczerzy, to nie jest to przyjemne. Może to być uciążliwe i podatne na błędy. Jednym z moich mrocznych sekretów jest to, że w kilku dużych aplikacjach na Google.com, w tym w Świątecznym Śledźcie Świętego Mikołaja Google i w witrynie internetowej Google I/O 2015, używam tych samych get|set|removeURLParameter metod pomocniczych.

Nadszedł czas na odpowiedni interfejs API, który zrobi to za nas.

Interfejs URLSearchParams API

Wypróbuj wersję demonstracyjną

Chrome 49 wdraża interfejs API URLSearchParamsspecyfikacji adresów URL. Jest to interfejs API przydatny do manipulowania parametrami zapytania adresu URL. Uważam, że URLSearchParams jest taką samą wygodą dla adresów URL jak FormData dla formularzy.

Co można z nim zrobić? Mając adres URL, możesz łatwo wyodrębnić wartości parametrów:

// 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);
}

ustaw wartość parametru:

params.set('version', 2);

dodać inną wartość do istniejącego parametru:

params.append('person', 'Tim');
params.getAll('person') === ['Eric', 'Tim']

usunąć parametry:

params.delete('person');

Praca z adresami URL

W większości przypadków będziesz prawdopodobnie pracować z pełnymi adresami URL lub modyfikować adres URL aplikacji. Konstruktor URL może być szczególnie przydatny w tych przypadkach:

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'

Aby wprowadzić zmiany w adresie URL, możesz pobrać parametry, zaktualizować ich wartości, a następnie użyć history.replaceState, aby zaktualizować adres 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

W tym przykładzie użyłem ciągów szablonu ES6, aby odtworzyć zaktualizowany adres URL z dotychczasowej ścieżki adresu URL aplikacji i zmodyfikowanych parametrów.

Integracja z innymi adresami URL miejsc

Domyślnie wysłanie FormData w żądaniu interfejsu API fetch() powoduje utworzenie treści wieloczęściowej. W razie potrzeby funkcja URLSearchParams udostępnia mechanizm alternatywny dla danych POST, który jest zakodowany w adresie URL zamiast wieloczęściowego MIME.

const params = new URLSearchParams();
params.append('api_key', '1234567890');

fetch('https://example.com/api', {
    method: 'POST',
    body: params
}).then(...)

Chociaż nie jest jeszcze implementowany w Chrome, URLSearchParams integruje się też z konstruktorem URL i tagami a. Oba te rozwiązania obsługują naszego nowego kumpla, udostępniając właściwości tylko do odczytu .searchParams do uzyskiwania dostępu do parametrów zapytania:

const url = new URL(location);
const foo = url.searchParams.get('foo') || 'somedefault';

Linki mają też właściwość .searchParams:

const a = document.createElement('a');
a.href = 'https://example.com?filter=api';

// a.searchParams.get('filter') === 'api';

Wykrywanie funkcji i obsługa przeglądarek

Obecnie URLSearchParams jest obsługiwana w Chrome 49, Firefox 44 i Opera 36.

if ('URLSearchParams' in window) {
    // Browser supports URLSearchParams
}

W przypadku polyfill zaleca się użycie tego na stronie github.com/WebReflection/url-search-params.

Prezentacja

Wypróbuj przykładowy dokument.

Aby zobaczyć URLSearchParams w aplikacji, skorzystaj z Generatora zestawów ikon z użyciem języka Material Design firmy Polymer. Użyłem go do skonfigurowania początkowego stanu aplikacji z precyzyjnego linku. Przydatne :)