2009-09-02 85 views

回答

633

假设你有一个页面,这个地址:http://sub.domain.com/virtualPath/page.htm。使用下面的页面代码才达到这些结果:

  • window.location.host:你会得到sub.domain.com:8080sub.domain.com:80
  • window.location.hostname:你会得到sub.domain.com
  • window.location.protocol:你会得到http:
  • window.location.port :你会得到808080
  • window.location.pathname:你会得到/virtualPath
  • window.location.origin:你会得到http://sub.domain.com *****

更新:关于.origin

*****至于window.location.originref状态,浏览器兼容性不明确。我已经检查过它在铬中,它返回http://sub.domain.com:port如果端口是80而没有任何东西,并且http://sub.domain.com如果端口是80.

特别感谢@torazaburo提到我。

+0

我在IIS中有一个网站和2个应用程序。例如:** sub.domain.com/v1 **和** sub.domain.com/v2 **以及像*** sub.domain.com/v1/Default.aspx***或_sub.domain这样的页面。 com/v2/Products/Default.aspx_等。我如何获得价值***/v2 ***,我的应用程序的根*** sub.domain.com/v2***? – Kiquenet 2015-10-06 08:13:35

+0

@Kiquenet使用JavaScript IDE如WebStorm,您可以在编写代码时查看可能的选项。 – 2016-04-13 09:23:24

+1

'window.location.origin'在IE9中未定义(根据链接,它是IE11 +)。 [这个答案](http://stackoverflow.com/a/1368295/897326)帮助。 – Neolisk 2017-02-24 19:49:13

5

尝试

document.location.host 

document.location.hostname 
136

你可以串连位置协议和主机:

var root = location.protocol + '//' + location.host; 

的URL,让说'http://stackoverflow.com/questions',它将返回'http://stackoverflow.com'

+4

它似乎应该使用“主机名”而不是“主机”来实现上述结果。来源:http://stackoverflow.com/questions/6725890/window-location-host-vs-window-location-hostname-and-cross-browser-compatibility – user417669 2013-11-10 23:10:30

+0

您可以使用location.origin具有相同的结果。 – 2013-12-14 07:05:30

+1

原始问题没有要求URL的协议部分。 – 2015-11-11 08:03:28

35

使用document.location对象及其hosthostname属性。

alert(document.location.hostname); // alerts "stackoverflow.com" 
17

有两种方法。首先是这里的另一个答案的一个变体,但是这一次占非默认端口:

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"); 
} 
+1

谢谢!我也更喜欢第二种方法!特别是当在服务器端的JavaScript,没办法获得window.location :) – trillions 2013-07-09 20:43:10

+2

爱第二种方法。简单,干净 – Aruna 2016-11-01 06:38:06

1

检查这样的:

alert(window.location.hostname); 

这将返回主机名www.domain.com

和:

window.location.host 

将端口返回域名如www.example.com:80

有关完整的参考检查Mozilla developer网站。

3

还有一个黑客我使用,从未在任何StackOverflow响应中看到: 使用图像的“src”属性将产生您的网站的完整基本路径。 例如:

var dummy = new Image; 
dummy.src = '$';     // using '' will fail on some browsers 
var root = dummy.src.slice(0,-1); // remove trailing '$' 

http://domain.com/somesite/index.html的URL, root将被设置为http://domain.com/somesite/。 这也适用于本地主机或任​​何有效的基本URL。

请注意,这将导致$哑图像上的HTTP请求失败。 您可以使用现有的图像来避免这种情况,只需轻微更改代码即可。

另一个变例使用虚设链,对HTTP请求无副作用:

var dummy = document.createElement ('a'); 
dummy.href = ''; 
var root = dummy.href; 

我没有测试它在所有的浏览器,但。

1

我想指定一些东西。如果有人想与路径的整个URL像我所需要的,可以使用:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname; 
+0

为什么要走更长的路。它可以通过var fullUrl = window.location.origin + window.location.pathname – Anant 2016-09-30 13:43:28

+0

得到,但有时你想在协议和主机名之间添加类似子域的内容,例如多语言等 – 2016-10-01 18:42:39

7

接受的答案并没有为我工作,因为希望能够与任何arbitary的URL,而不仅仅是当前页面的工作URL。

看看在URL object

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" 
+0

耻辱它不支持在IE中...... – Miro 2017-12-12 02:24:51

1

正如马丁所说,其他的答案不会任意网址。新的URL object可以工作,但仍然是实验性的,并且与所有浏览器不兼容。

对于更可靠和跨浏览器的解决方案,您可以使用我构建的this component将任意url解析为与上述URL对象中类似的属性。

例如:

var urlObject = parseUrl('http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah'); 
var newUrl = urlObject.hostname; 

NEWURL现在将包含:

aaa.bbb.ccc.com 

可以导入使用的parseURL()

1

我知道这是一个有点晚分量,但我用一点ES6语法做了一个干净的小功能

function getHost(href){ 
    return Object.assign(document.createElement('a'), { href }).host; 
} 

它也可以在ES5被writen像

function getHost(href){ 
    return Object.assign(document.createElement('a'), { href: href }).host; 
} 

当然IE doen't支持Object.assign,但在我的工作中,这并不重要。