Łatwe manipulowanie adresami URL za pomocą parametru URLSearchParams

Interfejs URLSearchParams API zapewnia spójny interfejs do bitów i fragmentów adresu URL oraz umożliwia proste manipulowanie ciągiem zapytania (który następuje po ?).

Dawniej deweloperzy używają wyrażeń regularnych i podziału ciągów znaków, aby wyodrębniać parametry zapytania z adresu URL. Jeśli jesteśmy szczerzy wobec siebie, nie jest to przyjemne. Naprawienie błędów może być żmudne, a wprowadzanie ich w błędzie jest podatne. Jednym z moich mrocznych sekretów jest to, że udało mi się ponownie wykorzystać te same get|set|removeURLParameter metody pomocnicze w kilku rozbudowanych aplikacjach na Google.com, w tym w Trasych Świętego Mikołaja w Google i na stronie Google I/O 2015.

Czas na odpowiedni interfejs API, który zrobi to za nas!

Interfejs API URLSearchParams

Wypróbuj wersję demonstracyjną

Chrome 49 implementuje URLSearchParams ze specyfikacji adresu URL, czyli interfejsu API, który przydaje się podczas pracy z parametrami zapytania w adresie URL. Uważam, że URLSearchParams to odpowiednik udogodnień adresów URL, tak jak FormData w przypadku formularzy.

Co można z nim zrobić? Na podstawie podanego adresu 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);

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

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

usuń parametr(y):

params.delete('person');

Praca z adresami URL

Zwykle pracujesz z pełnymi adresami URL lub modyfikując 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ć rzeczywiste zmiany w adresie URL, możesz pobrać parametry, zaktualizować ich wartości, a potem zaktualizować adres URL za pomocą funkcji history.replaceState.

// 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 miejscu wykorzystałem ciągi tekstowe szablonu ES6 do zrekonstruowania zaktualizowanego adresu URL na podstawie istniejącej ścieżki adresu URL aplikacji i zmodyfikowanych parametrów.

Integracja z adresami URL innych miejsc

Domyślnie wysłanie żądania FormData w żądaniu interfejsu API fetch() powoduje utworzenie wieloczęściowej treści. W razie potrzeby URLSearchParams udostępnia alternatywny mechanizm dla danych POST zakodowanych w postaci adresu URL, zamiast stosowania metody wieloczęściowej MIME.

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

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

Chociaż nie został on jeszcze wdrożony w Chrome, URLSearchParams integruje się również z konstruktorem URL i tagami a. Obie funkcje obsługują naszego nowego znajomego, udostępniając właściwość 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 otrzymują 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 Chrome 49, Firefox 44 i Opera 36 obsługują język URLSearchParams.

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

W przypadku elementów polyfill zalecamy użycie tej dostępnej na stronie github.com/WebReflection/url-search-params.

Demonstracyjny

Wypróbuj przykład.

Aby zobaczyć, jak wygląda URLSearchParams w rzeczywistej aplikacji, wypróbuj Generator ikonset interfejsu Material Design Polymer. Plik został użyty do skonfigurowania stanu początkowego aplikacji na podstawie precyzyjnego linku. Przydatne :)