的位置。主机vs位置。主机名和跨浏览器兼容性?

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

如果他们使用某种web代理访问域,我们会显示一个小的基于“顶部栏”风格的警告(因为它倾向于破坏js)。

我们正在考虑使用以下方法:

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

这将照顾到我们曾经使用过的任何子域。

我们应该用host还是hostname?

在Firefox 5和Chrome 12中:

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

.. 两者都是一样的。

这是因为端口实际上不在地址栏中吗?

W3Schools表示主机包含端口。

应的位置。host/hostname是否被验证,或者我们能否相当确定在IE6+和所有其他系统中它将存在?

280230 次浏览

如果指定了端口号,Host只包括端口号。如果URL中没有明确的端口号,那么它将返回与主机名相同的端口号。您可以选择是否匹配端口号。有关window.location对象和它用于匹配(带或不带端口)的各种选择的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/Location

我假设你需要hostname来获取站点名。

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

似乎你会得到相同的结果,但hostname包含明确的主机名没有括号或端口号。

interactive link anatomy

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

--

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

  • hostname给你example.org
  • host给你example.org:8888

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

你真正想要的是:

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

如果你坚持使用window.location.origin 你可以在读取origin

之前把它放在你的代码顶部
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

解决方案

PS:在记录中,这实际上是最初的问题。它已经被编辑过了:)

只是添加一个注意,谷歌Chrome浏览器有origin属性的位置。它为您提供了从协议到端口号的整个域,如下面的截图所示。 chrome开发者工具 < / p >