Avatar ·

Как получить значения параметров строки запроса (query string) в JavaScript?

Всем привет! Я новичок в JavaScript и столкнулся с такой задачей: у меня есть URL вида `https://example.com/page?name=John&age=30&city=NewYork`. Мне нужно получить значения параметров из строки запроса, например, чтобы извлечь имя пользователя (`name`) или возраст (`age`). Я пробовал парсить URL вручную с помощью `split('?')` и `split('&')`, но это кажется очень громоздким и ненадёжным, особенно если в значениях есть спецсимволы (например, `name=John%20Doe`). Также я слышал, что можно использовать `window.location.search`, но не понимаю, как из него вытащить конкретный параметр. Подскажите, пожалуйста, как правильно и просто получить значения query string в JavaScript? Желательно с примерами кода, чтобы я мог сразу применить. Заранее спасибо! <<>>

Основное решение: URLSearchParams (современный способ)

Самый простой и надёжный способ — использовать встроенный объект URLSearchParams. Он поддерживается всеми современными браузерами и Node.js (начиная с версии 18). Этот метод автоматически обрабатывает декодирование спецсимволов (например, %20 превращается в пробел).

// Пример URL: https://example.com/page?name=John&age=30&city=NewYork
const params = new URLSearchParams(window.location.search);

// Получить одно значение
const name = params.get('name'); // "John"
const age = params.get('age');   // "30"

// Получить все значения параметра (если он повторяется)
const cities = params.getAll('city'); // ["NewYork"]

// Проверить, существует ли параметр
if (params.has('name')) {
  console.log('Параметр name найден');
}

// Перебрать все параметры
params.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});

// Получить массив всех ключей
const keys = [...params.keys()]; // ["name", "age", "city"]

Что делать, если у вас не URL, а просто строка запроса?

Если у вас есть только строка запроса (например, из переменной), вы также можете использовать URLSearchParams:

const queryString = '?name=John%20Doe&age=30';
const params = new URLSearchParams(queryString);
console.log(params.get('name')); // "John Doe" (пробел корректно декодирован)

Как получить query string из текущего URL?

Используйте свойство window.location.search — оно возвращает часть URL после знака вопроса:

const searchString = window.location.search; // "?name=John&age=30"
const params = new URLSearchParams(searchString);

Важные моменты:

  • Декодирование: URLSearchParams автоматически декодирует закодированные символы (например, %20 → пробел, %26 → &).
  • Повторяющиеся параметры: Если один параметр встречается несколько раз (например, ?color=red&color=blue), используйте getAll('color').
  • Отсутствие параметра: Если параметра нет, get() вернёт null.
  • Совместимость: URLSearchParams не поддерживается в Internet Explorer. Если вам нужно поддерживать IE, используйте полифилл или старый метод (см. альтернативный ответ).

Пример полного использования на странице:

// HTML: <div id="output"></div>
const params = new URLSearchParams(window.location.search);
const output = document.getElementById('output');

output.innerHTML = `
  <p>Имя: ${params.get('name') || 'не указано'}</p>
  <p>Возраст: ${params.get('age') || 'не указан'}</p>
  <p>Город: ${params.get('city') || 'не указан'}</p>
`;
<<>>

Альтернативный метод: ручной парсинг с помощью регулярного выражения (для старых браузеров)

Если вам нужно поддерживать Internet Explorer или вы не можете использовать URLSearchParams, можно написать простую функцию для парсинга query string:

function getQueryParam(param) {
  const queryString = window.location.search.substring(1);
  const regex = new RegExp('[?&]' + param.replace(/[\[\]]/g, '\\$&') + '(=([^&#]*)|&|#|$)');
  const results = regex.exec(window.location.href);
  
  if (!results || !results[2]) return null;
  return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

// Использование:
const name = getQueryParam('name'); // "John"
console.log(name);

Дополнение: работа с хэшем (#)

Обратите внимание, что query string находится до символа #. Если в URL есть хэш (например, ?page=1#section), window.location.search вернёт только ?page=1. Для получения полной строки запроса вместе с хэшем используйте window.location.href и парсите вручную.

Когда использовать альтернативу?

  • Если вам нужно поддерживать очень старые браузеры (IE 11 и ниже).
  • Если вы работаете в среде, где нет URLSearchParams (например, старые версии Node.js до 18).
  • Если вы хотите больше контроля над процессом парсинга.

Но в 2024 году рекомендуется всегда использовать URLSearchParams — это стандартный, безопасный и производительный способ.