Как извлечь часть имени хоста из URL-адреса в JavaScript
-
21-09-2019 - |
Вопрос
Есть ли действительно простой способ начать с полного URL-адреса:
document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah"
И извлеките только хостовую часть:
aaa.bbb.ccc.com
Должна быть функция JavaScript, которая делает это надежно, но я не могу ее найти.
Решение
предположим, что у вас есть страница с этим адресом: http://sub.domain.com/virtualPath/page.htm
.используйте следующее в коде страницы для достижения этих результатов:
window.location.host
:ты получишьsub.domain.com:8080
илиsub.domain.com:80
window.location.hostname
:ты получишьsub.domain.com
window.location.protocol
:ты получишьhttp:
window.location.port
:ты получишь8080
или80
window.location.pathname
:ты получишь/virtualPath
window.location.origin
:ты получишьhttp://sub.domain.com
*****
Обновлять:о происхождении .origin
***** Как ссылка штаты, совместимость браузера для window.location.origin
непонятно.Я проверил это в Chrome, и он вернулся http://sub.domain.com:port
если порт не 80, и http://sub.domain.com
если порт 80.
Особая благодарность @torazaburo за то, что рассказал мне об этом.
Другие советы
Вы можете объединить протокол местоположения и хост:
var root = location.protocol + '//' + location.host;
Для URL, скажем 'http://stackoverflow.com/questions'
, оно вернется 'http://stackoverflow.com'
Использовать document.location
объект и его host
или hostname
характеристики.
alert(document.location.hostname); // alerts "stackoverflow.com"
Есть два пути.Первый — это вариант другого ответа здесь, но он учитывает порты, отличные от портов по умолчанию:
function getRootUrl() {
var defaultPorts = {"http:":80,"https:":443};
return window.location.protocol + "//" + window.location.hostname
+ (((window.location.port)
&& (window.location.port != defaultPorts[window.location.protocol]))
? (":"+window.location.port) : "");
}
Но я предпочитаю этот более простой метод (который работает с любой строкой URI):
function getRootUrl(url) {
return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}
Принятый ответ мне не помог, так как хотелось иметь возможность работать с любыми произвольными URL-адресами, а не только с URL-адресом текущей страницы.
Взгляните на URL
объект:
var url = new URL("http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah");
url.protocol; // "http:"
url.hostname; // "aaa.bbb.ccc.com"
url.pathname; // "/asdf/asdf/sadf.aspx"
url.search; // "?blah"
использовать
окно.location.origin
и для:"http://aaa.bbb.ccc.ddd.com/sadf.aspx?blah"
ты получишь: http://aaa.bbb.ccc.ddd.com/
Пытаться
document.location.host
или
document.location.hostname
Есть еще один хак, который я использую и никогда не видел ни в одном ответе StackOverflow:использование атрибута изображения «src» даст полный базовый путь вашего сайта.Например :
var dummy = new Image;
dummy.src = '$'; // using '' will fail on some browsers
var root = dummy.src.slice(0,-1); // remove trailing '$'
По URL-адресу, например http://domain.com/somesite/index.html
,
root
будет установлено на http://domain.com/somesite/
.Это также работает для локального хоста или любого действующего базового URL-адреса.
Обратите внимание, что это приведет к сбою HTTP-запроса на $
фиктивный образ.Чтобы избежать этого, вы можете использовать существующее изображение, внеся лишь небольшие изменения в код.
Другой вариант использует фиктивную ссылку без каких-либо побочных эффектов на HTTP-запросы:
var dummy = document.createElement ('a');
dummy.href = '';
var root = dummy.href;
Однако я не тестировал его в каждом браузере.
Проверь это:
alert(window.location.hostname);
это вернет имя хоста как www.domain.com
и:
window.location.host
вернет доменное имя с портом типа www.example.com:80
Для полной проверки ссылок разработчик Мозиллы сайт.
Я хотел бы кое-что уточнить.Если кто-то хочет получить весь URL-адрес с таким путем, как мне нужно, можно использовать:
var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;
Я знаю, что уже немного поздно, но я создал небольшую чистую функцию с небольшим синтаксисом ES6.
function getHost(href){
return Object.assign(document.createElement('a'), { href }).host;
}
Это также можно написать на ES5, например
function getHost(href){
return Object.assign(document.createElement('a'), { href: href }).host;
}
Конечно, IE не поддерживает Object.assign
, но в моей работе это не имеет значения.
Regex обеспечивает гораздо большую гибкость.
//document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah
//1.
var r = new RegExp(/http:\/\/[^/]+/);
var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com
//2.
var r = new RegExp(/http:\/\/[^/]+\/[^/]+/);
var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com/asdf