Back

Как получить URL-параметры с помощью JavaScript

Как получить URL-параметры с помощью JavaScript

URL-параметры (также называемые строками запроса) являются важной частью веб-разработки, позволяя передавать данные между страницами или от клиента к серверу. Независимо от того, создаете ли вы функцию поиска, обрабатываете отправку форм или отслеживаете пользовательские предпочтения, умение извлекать и использовать эти параметры является необходимым навыком.

В этой статье я покажу вам наиболее эффективные способы получения URL-параметров с помощью JavaScript, от современных подходов до устаревших решений.

Ключевые выводы

  • URLSearchParams — это современный, рекомендуемый способ работы с URL-параметрами
  • Используйте urlParams.get('param') для получения значения одного параметра
  • Используйте urlParams.has('param') для проверки существования параметра
  • Для старых браузеров реализуйте пользовательскую функцию парсинга
  • Всегда декодируйте значения параметров для обработки специальных символов
  • Учитывайте вопросы безопасности при использовании URL-параметров

Понимание URL-параметров

URL-параметры появляются после знака вопроса (?) в URL и форматируются как пары ключ-значение:

https://example.com/page?name=john&id=123

В этом примере есть два параметра: name со значением john и id со значением 123.

Современный подход: URLSearchParams

Самый простой и надежный способ работы с URL-параметрами в современных браузерах — использование интерфейса URLSearchParams.

Базовое использование

// Предполагаем URL: https://example.com/page?product=shirt&color=blue&size=m

// Получаем строку запроса
const queryString = window.location.search;

// Парсим строку запроса
const urlParams = new URLSearchParams(queryString);

// Получаем значение конкретного параметра
const product = urlParams.get('product'); // "shirt"
const color = urlParams.get('color');     // "blue"

Проверка существования параметра

// Проверяем, существует ли параметр
if (urlParams.has('product')) {
  // Параметр существует
  console.log('Параметр product существует');
}

Обработка множественных значений

Если параметр встречается несколько раз в URL, вы можете получить все значения:

// URL: https://example.com/page?tag=javascript&tag=frontend

// Получаем все значения для параметра
const tags = urlParams.getAll('tag'); // ["javascript", "frontend"]

Итерация по параметрам

URLSearchParams предоставляет методы итерации для работы со всеми параметрами:

// Итерация по всем ключам параметров
for (const key of urlParams.keys()) {
  console.log(key);
}

// Итерация по всем значениям параметров
for (const value of urlParams.values()) {
  console.log(value);
}

// Итерация по всем записям параметров (пары ключ-значение)
for (const [key, value] of urlParams.entries()) {
  console.log(`${key}: ${value}`);
}

Устаревший подход: пользовательская функция

Для старых браузеров, которые не поддерживают URLSearchParams, вы можете создать пользовательскую функцию:

function getUrlParam(param) {
  const queryString = window.location.search.substring(1);
  const urlParams = queryString.split('&');
  
  for (let i = 0; i < urlParams.length; i++) {
    const paramPair = urlParams[i].split('=');
    if (paramPair[0] === param) {
      return decodeURIComponent(paramPair[1] || "");
    }
  }
  return null;
}

// Использование
const productValue = getUrlParam('product');

Обработка распространенных крайних случаев

Закодированные символы

URL-параметры часто содержат закодированные символы. Например, пробелы кодируются как %20:

// URL: https://example.com/search?query=web%20development

const query = urlParams.get('query');
console.log(query); // "web development" (автоматически декодировано)

При использовании пользовательской функции обязательно используйте decodeURIComponent() для корректной обработки этих закодированных символов.

Отсутствующие параметры

Всегда проверяйте, существует ли параметр, прежде чем его использовать:

const size = urlParams.has('size') ? urlParams.get('size') : 'default';

Пустые параметры

Параметры могут существовать без значений:

// URL: https://example.com/page?newsletter=&theme=dark

const newsletter = urlParams.get('newsletter'); // "" (пустая строка)
const hasNewsletter = urlParams.has('newsletter'); // true

Полный пример: получение всех URL-параметров

Вот комплексная функция для получения всех URL-параметров в виде объекта:

function getAllUrlParams() {
  const params = {};
  const queryString = window.location.search.substring(1);
  
  if (queryString) {
    const pairs = queryString.split('&');
    
    for (const pair of pairs) {
      const [key, value] = pair.split('=');
      
      // Если параметр не имеет значения, устанавливаем его в true
      if (typeof value === 'undefined') {
        params[key] = true;
      } else {
        // Если у нас уже есть этот параметр, преобразуем в массив
        if (params[key]) {
          if (!Array.isArray(params[key])) {
            params[key] = [params[key]];
          }
          params[key].push(decodeURIComponent(value));
        } else {
          params[key] = decodeURIComponent(value);
        }
      }
    }
  }
  
  return params;
}

Совместимость с браузерами

URLSearchParams поддерживается во всех современных браузерах, включая:

  • Chrome 49+
  • Firefox 44+
  • Safari 10.1+
  • Edge 17+

Для старых браузеров, таких как Internet Explorer, вам понадобится использовать полифилл или подход с пользовательской функцией.

Соображения производительности

Для большинства приложений разница в производительности между методами незначительна. Однако:

  1. URLSearchParams оптимизирован и поддерживается производителями браузеров
  2. Пользовательские функции могут быть адаптированы под ваши конкретные потребности
  3. Если вы получаете только один параметр, простое регулярное выражение может быть быстрее

Замечания по безопасности

Помните, что URL-параметры видны в адресной строке браузера и не являются безопасными для конфиденциальной информации. Всегда валидируйте и очищайте значения параметров перед их использованием в вашем приложении.

Заключение

Интерфейс URLSearchParams предоставляет чистый, стандартизированный способ работы с URL-параметрами в JavaScript. Для большинства современных веб-приложений это рекомендуемый подход. Для поддержки устаревших браузеров пользовательская функция может обеспечить ту же функциональность с немного большим количеством кода.

Понимая, как эффективно извлекать и использовать URL-параметры, вы можете создавать более динамичные и интерактивные веб-приложения.

Часто задаваемые вопросы

Да, вы можете использовать URLSearchParams для изменения параметров, а затем обновить URL с помощью history.pushState() или history.replaceState().

Большинство SPA-фреймворков (React, Vue, Angular) имеют встроенные системы маршрутизации, которые обрабатывают URL-параметры. Проверьте документацию вашего фреймворка для получения подробностей.

Имена параметров чувствительны к регистру согласно спецификации URL, поэтому 'name' и 'Name' являются разными параметрами.

Вы можете использовать одно и то же имя параметра несколько раз (например, ?color=red&color=blue) или использовать скобочную нотацию (например, ?colors[]=red&colors[]=blue).

Официального ограничения нет, но браузеры и серверы обычно имеют практические ограничения около 2,000-8,000 символов для всего URL.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers