location.host vs location.hostname и кросс-браузерная совместимость? - PullRequest
325 голосов
/ 17 июля 2011

Какой из этих способов наиболее эффективен по сравнению с проверкой, осуществляет ли пользовательский агент доступ через правильный домен.

Мы хотели бы показать маленькое предупреждение в стиле 'top bar' на основе js, если они обращаются кдомен, использующий какой-то веб-прокси (поскольку он имеет тенденцию нарушать js).

Мы думали об использовании следующего:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

Это позаботится о любых поддоменах, которые мы когда-либо используем.

Какой нам использовать хост или имя хоста?

В Firefox 5 и Chrome 12:

console.log(location.host);
console.log(location.hostname);

.. показывает одинаковое для обоих.

Это потому, что порт на самом деле не находится в адресной строке?

W3Schools говорит, что хост содержит порт.

Если location.host/hostname будетпроверено или мы можем быть достаточно уверены в IE6 + и во всех остальных, он будет существовать?

Ответы [ 6 ]

938 голосов
/ 08 июля 2012

interactive link anatomy

В качестве небольшой заметки: анатомия интерактивной ссылки

-

Короче говоря (при условии местоположения http://example.org:8888/foo/bar#bang):

  • hostname дает вам example.org
  • host дает вам example.org:8888
68 голосов
/ 17 июля 2011

host просто включает номер порта, если он указан. Если в URL нет номера порта, он возвращает то же самое, что и имя хоста. Вы выбираете, хотите ли вы соответствовать номеру порта или нет. См. https://developer.mozilla.org/en/window.location для получения дополнительной информации.

Я бы предположил, что вы хотите, чтобы имя хоста просто получало имя сайта.

30 голосов
/ 15 марта 2014

Если вы настаиваете на использовании window.location.origin Вы можете поместить это в верхнюю часть своего кода перед прочтением origin

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

Раствор

PS: Кстати, это был действительно оригинальный вопрос. Уже отредактировано:)

10 голосов
/ 25 февраля 2014

Ваш основной вопрос был дан ответ выше. Я просто хотел указать, что у используемого вами регулярного выражения есть ошибка. Он также будет успешным на foo-domain.com, который не является поддоменом domain.com

То, что вы действительно хотите, это:

/(^|\.)domain\.com$/
3 голосов
/ 17 июля 2011

MDN: https://developer.mozilla.org/en/DOM/window.location

Похоже, что вы получите одинаковый результат для обоих, но hostname содержит четкое имя хоста без скобок или номера порта.

0 голосов
/ 31 июля 2018

Просто добавьте примечание, что браузер Google Chrome имеет атрибут источника для местоположения.который дает вам весь домен от протокола до номера порта, как показано на скриншоте ниже.chrome developers tool

...