В этой статье мы покажем, как получить параметры URL с помощью JavaScript как анализировать эти параметры и манипулировать ими.
Ключевые моменты:
- Параметры URL, или параметры строки запроса, используются для передачи небольших объемов данных со страницы на страницу или от клиента к серверу через URL. Они могут содержать такую полезную информацию, как поисковые запросы, информация о продукте, предпочтения пользователя, реферальные ссылки и многое другое.
- Интерфейс URLSearchParams в современных браузерах позволяет легко разбирать параметры URL и манипулировать ими, используя такие методы, как get() для возврата первого значения, связанного с заданным параметром поиска, has() для проверки существования определенного параметра и getAll() для возврата всех значений, связанных с определенным параметром.
- Для устаревших браузеров существует полифилл (polyfill), или разработчики могут создать собственную функцию разбора строки запроса, которая принимает строку запроса URL и возвращает данные в формате объекта.
- Важно отметить, что формат параметров URL не является четко определенным и может варьироваться, поэтому разработчикам следует тестировать и корректировать свой код в соответствии с конкретными случаями использования. Если требуется более сложная работа с URL, можно воспользоваться специальными библиотеками, такими как query-string и Medialize URI.js.
Как получить параметры URL
В современных браузерах это стало намного проще благодаря интерфейсу URLSearchParams. Он определяет множество вспомогательных методов для работы со строкой запроса в URL.
Предположим, что наш URL-адрес имеет следующий вид https://example.com/?product=shirt&color=pink&ref=p792&newuser&size=s, мы можем получить строку запроса, используя window.location.search:
const queryString = window.location.search; console.log(queryString); //?product=shirt&color=pink&ref=p792&newuser&size=s
Затем мы можем разобрать параметры строки запроса с помощью URLSearchParams:
const urlParams = new URLSearchParams(queryString);
Затем мы можем вызвать любой из его параметров на полученном результате.
Например, URLSearchParams.get() вернет первое значение, связанное с заданным параметром поиска:
const product = urlParams.get('product')
console.log(product);
// shirt
const color = urlParams.get('color')
console.log(color);
// pink
const refLink = urlParams.get('ref')
console.log(refLink);
// p792
const newUser = urlParams.get('newuser')
console.log(newUser);
// получим пустую строку
Другие полезные методы
Проверка наличия параметра
Вы можете использовать URLSearchParams.has(), чтобы проверить, существует ли определенный параметр:
console.log(urlParams.has('product'));
// true
console.log(urlParams.has('paymentmethod'));
// false
Получение всех значений конкретного параметра
Вы можете использовать URLSearchParams.getAll(), чтобы вернуть все значения, связанные с определенным параметром:
console.log(urlParams.getAll('size'));
// [ 's' ]
//Программно добавляем параметр для size.
urlParams.append('size', 'xxl');
console.log(urlParams.getAll('size'));
// [ 's', 'xxl' ]
Перебор параметров
URLSearchParams также предоставляет некоторые знакомые методы итератора Object, позволяющие выполнять итерации (перебор) по ключам, значениям и записям:
const
keys = urlParams.keys(),
values = urlParams.values(),
entries = urlParams.entries();
for (const key of keys) console.log(key);
// product, color, newuser, size
for (const value of values) console.log(value);
// shirt, pink, , p792, s
for(const entry of entries) {
console.log(`${entry[0]}: ${entry[1]}`);
}
// product: shirt
// color: pink
// newuser:
// ref: p792
// size: s
Поддержка браузерами получения параметров URL
Все современные браузеры хорошо поддерживают URLSearchParams.
Создание собственной функции перебора (parsing) строк запросов
Давайте оставим URL, который мы использовали в предыдущем разделе:
https://example.com/?product=shirt&color=pink&ref=p792&newuser&size=s
Представленная ниже функция, которая позволит получить все параметры URL в виде аккуратного объекта:
function getAllUrlParams(url) {
// получить строку запроса из url (необязательно) или окна
var queryString = url ? url.split('?')[1] : window.location.search.slice(1);
// здесь будем хранить параметры
var obj = {};
// если строка запроса существует
if (queryString) {
// Запись после символа # не является частью строки запроса, поэтому избавляемся от нее
queryString = queryString.split('#')[0];
// Делим строку запроса на составные части
var arr = queryString.split('&');
for (var i = 0; i < arr.length; i++) {
// разделяем ключи и значения
var a = arr[i].split('=');
// установите имя и значение параметра (используйте 'true', если он пуст)
var paramName = a[0];
var paramValue = typeof (a[1]) === 'undefined' ? true : a[1];
// (необязательно) сохраните последовательность регистров
paramName = paramName.toLowerCase();
if (typeof paramValue === 'string') paramValue = paramValue.toLowerCase();
// если имя параметра заканчивается квадратными скобками, например, colors[] или colors[2]
if (paramName.match(/\[(\d+)?\]$/)) {
// создайте ключ, если он не существует
var key = paramName.replace(/\[(\d+)?\]/, '');
if (!obj[key]) obj[key] = [];
// if it's an indexed array e.g. colors[2]
if (paramName.match(/\[\d+\]$/)) {
// получить значение индекса и добавить запись в соответствующую позицию
var index = /\[(\d+)\]/.exec(paramName)[1];
obj[key][index] = paramValue;
} else {
// иначе добавьте значение в конец массива
obj[key].push(paramValue);
}
} else {
// мы работаем со строкой
if (!obj[paramName]) {
// если его не существует, создайте свойство
obj[paramName] = paramValue;
} else if (obj[paramName] && typeof obj[paramName] === 'string'){
// Если свойство существует и является строкой, преобразуем его в массив
obj[paramName] = [obj[paramName]];
obj[paramName].push(paramValue);
} else {
// в противном случае добавим свойство
obj[paramName].push(paramValue);
}
}
}
}
return obj;
}
В итоге вы получите:
getAllUrlParams().product; // 'shirt'
getAllUrlParams().color; // 'pink'
getAllUrlParams().ref; // 'p792'
getAllUrlParams().newuser; // true
getAllUrlParams().size; // 's'
getAllUrlParams().nonexistent; // undefined
getAllUrlParams('http://test.com/?a=abc').a; // 'abc'
Также можете узнать как динамично создать элемент скрипт на сайте.