Avatar ·

Как получить текущий URL страницы с помощью JavaScript? (полный путь, хост, протокол)

Всем привет! Только начал изучать JavaScript и столкнулся с такой задачей: мне нужно получить полный адрес текущей страницы, чтобы, например, передать его в форму обратной связи или поделиться ссылкой. Пробовал писать что-то вроде `var url = window.location;`, но в консоли выводится какой-то объект, а не строка. Потом прочитал, что нужно использовать `window.location.href` — это сработало, но я хочу понять глубже. Мне нужно не только получить весь URL, но и отдельно: - Протокол (http или https) - Доменное имя (например, example.com) - Путь (/blog/article.html) - Параметры запроса (?id=5&page=2) - Хеш (#section) Пробовал такой код: ```javascript var currentUrl = window.location.href; console.log("Полный URL: " + currentUrl); ``` Но как вытащить каждую часть отдельно? И есть ли разница между `window.location` и `document.location`? Заранее спасибо за помощь! Очень хочется разобраться, чтобы не копипастить готовые решения, а понимать, что и как работает. <<>>

Как получить текущий URL и его части с помощью JavaScript

Отличный вопрос! Ты уже на правильном пути. Давай разберёмся подробно. Основной объект для работы с URL — это window.location (или document.location — это одно и то же, оба ссылаются на один объект). Он содержит все части URL в виде свойств.

1. Полный URL

console.log(window.location.href);
// Результат: "https://example.com:8080/blog/article?id=5&page=2#section"

2. Разбираем URL по частям

Вот все основные свойства объекта location:

  • protocol — протокол с двоеточием: "https:"
  • hostname — домен: "example.com"
  • port — порт (если нестандартный): "8080"
  • host — домен + порт: "example.com:8080"
  • pathname — путь от корня: "/blog/article"
  • search — параметры запроса с вопросительным знаком: "?id=5&page=2"
  • hash — хеш с решёткой: "#section"
  • origin — протокол + хост (полезно для CORS): "https://example.com:8080"

3. Пример использования

function parseCurrentURL() {
    const loc = window.location;
    
    console.log("Протокол:", loc.protocol);           // "https:"
    console.log("Домен:", loc.hostname);               // "example.com"
    console.log("Порт:", loc.port || "стандартный");   // "" или "8080"
    console.log("Хост целиком:", loc.host);            // "example.com:8080"
    console.log("Путь:", loc.pathname);                // "/blog/article"
    console.log("Параметры:", loc.search);             // "?id=5&page=2"
    console.log("Хеш:", loc.hash);                     // "#section"
    console.log("Origin:", loc.origin);                // "https://example.com:8080"
}

parseCurrentURL();

4. Как получить параметры запроса в виде объекта

Часто нужно работать с параметрами как с объектом. Для этого используй URLSearchParams:

const params = new URLSearchParams(window.location.search);
console.log(params.get('id'));     // "5"
console.log(params.get('page'));   // "2"

// Получить все параметры
params.forEach((value, key) => {
    console.log(`${key}: ${value}`);
});
// Выведет: id: 5, page: 2

5. Разница между window.location и document.location

Строго говоря, document.location — это устаревшее свойство, но оно всё ещё работает. На практике оба возвращают один и тот же объект. Рекомендуется использовать window.location, так как оно более явно указывает на глобальный объект окна.

6. Важные моменты

  • Если URL не содержит порта, свойство port вернёт пустую строку.
  • Свойство origin доступно не во всех старых браузерах (IE не поддерживает), но в современных всё отлично.
  • Не путай href (полная строка) и host (только домен с портом).

Теперь ты можешь не только получить полный URL, но и разобрать его на составные части для любых нужд — будь то аналитика, редиректы или передача данных.

<<>>

Альтернативный подход: использовать объект URL

В современном JavaScript (ES6+) ты можешь создать экземпляр класса URL и работать с ним. Это удобно, если нужно разобрать не только текущий URL, но и любую другую ссылку.

// Получаем текущий URL
const currentUrl = new URL(window.location.href);

console.log(currentUrl.protocol);   // "https:"
console.log(currentUrl.hostname);   // "example.com"
console.log(currentUrl.pathname);   // "/blog/article"
console.log(currentUrl.search);     // "?id=5&page=2"
console.log(currentUrl.hash);       // "#section"

// Работа с параметрами (тот же URLSearchParams)
const params = currentUrl.searchParams;
console.log(params.get('id'));      // "5"

Почему это может быть удобнее?

  • Объект URL даёт те же свойства, что и location, но его можно использовать для любых URL, а не только текущего.
  • Например, чтобы разобрать ссылку из атрибута href ссылки:
const link = document.querySelector('a').href;
const parsedLink = new URL(link);
console.log(parsedLink.hostname);

Минус: В очень старых браузерах (IE11 и ниже) класс URL может не поддерживаться. Но для современных проектов это отличный выбор.