location.host 与 location.hostname 和跨浏览器兼容性?

IT技术 javascript html window location host
2021-02-17 22:03:59

与检查用户代理是否通过正确的域访问相比,哪一个最有效。

如果他们使用某种 Web 代理访问域(因为它往往会破坏 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个回答

交互式链接剖析

作为一个小备忘录:交互式链接剖析

——

简而言之(假设位置为http://example.org:8888/foo/bar#bang):

  • hostname 给你 example.org
  • host 给你 example.org:8888
一张图片胜过千言万语。
2021-04-18 22:03:59
非常感谢您提供简单的解决方案
2021-04-19 22:03:59
根据en.wikipedia.org/wiki/...,端口不应被视为主机的一部分(但它是权限的一部分)。
2021-04-23 22:03:59
@Alec 这是一个有趣的技术说明;通过 Wikipedia 引文深入研究表明,根据 RFC 3986,“权威” 应该是主机名:、 和端口的串联术语我想知道从location.host制定时起还有多少讨论可用......我怀疑它今天这样命名是因为在场的人没有读过或想过提到该 RFC。
2021-04-24 22:03:59
@lolzerywowzery ...但只需要描述图片的那一千个字
2021-05-04 22:03:59

如果指定了端口号,则主机只包含端口号。如果 URL 中没有专门的端口号,则它返回与主机名相同的端口号。您选择是否关心匹配端口号。有关更多信息,请参阅https://developer.mozilla.org/en/window.location

我假设您希望主机名仅获取站点名称。

如果你坚持使用window.location.origin 你可以在阅读之前把它放在你的代码之上origin

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

解决方案

PS:为了记录,这实际上是原始问题。它已经被编辑了:)

还值得注意的是 window.location.origin 存在浏览器兼容性问题。developer.mozilla.org/en-US/docs/Web/API/Window/...
2021-05-02 22:03:59
但是...... OP从未window.location.origin在他们的问题中提到过。他们的问题其实是关于具体的东西都是 window.location.origin
2021-05-13 22:03:59

上面已经回答了您的主要问题。我只是想指出您使用的正则表达式有一个错误。它也将在foo-domain.com不是的子域上取得成功domain.com

你真正想要的是这个:

/(^|\.)domain\.com$/

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

似乎您将获得相同的结果,但hostname包含不带括号或端口号的明确主机名。