从URL获取协议,域和端口

yel*_*lo3 284 javascript dns url port protocols

我需要从给定的URL中提取完整的协议,域和端口.例如:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
Run Code Online (Sandbox Code Playgroud)

She*_*hef 553

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Run Code Online (Sandbox Code Playgroud)

  • 你不能使用`location.host`而不是`location.hostname` +`location.port`? (13认同)
  • @Randomblue怎么样?你会得到`about://`.但是,我很想知道,`about:blank`的用例是什么?我不确定是否有任何浏览器在`about:blank`中注入插件资源,但似乎这可能是唯一的用例. (3认同)
  • 如果你有一个URL字符串,这根本不起作用,对吧?(即你需要*在*`location`才能工作) (3认同)

Dav*_*oun 169

这些答案似乎都没有完全解决这个问题,这个问题需要一个任意的URL,而不是当前页面的url.

方法1:使用URL API(警告:没有IE11支持)

您可以使用URL API(IE11不支持,但在其他任何地方都可用).

这也使得访问搜索参数变得容易.另一个好处是:它可以在Web Worker中使用,因为它不依赖于DOM.

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');
Run Code Online (Sandbox Code Playgroud)

方法2(旧方法):在DOM中使用浏览器的内置解析器

如果您需要这个,也可以在旧版浏览器上使用它.

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');
Run Code Online (Sandbox Code Playgroud)

而已!

浏览器的内置解析器已经完成了它的工作.现在您可以抓住所需的部件(请注意,这适用于上述两种方法):

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'
Run Code Online (Sandbox Code Playgroud)

奖励:搜索参数

有可能到头来你可能想掰开搜索网址参数为好,因为"?的startIndex = 1的pageSize = 10"是不是对自己太可用.

如果您使用上面的方法1(URL API),则只需使用searchParams getters:

url.searchParams.get('startIndex');  // '1'
Run Code Online (Sandbox Code Playgroud)

或者获取所有参数:

Array
    .from(url.searchParams)
    .reduce((accum, [key, val]) => {
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }
Run Code Online (Sandbox Code Playgroud)

如果您使用方法2(旧方法),您可以使用以下内容:

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的答案,应该获得更多的选票,因为这个答案不仅限于*current*位置,而且适用于*any url*,因为这个答案利用浏览器的内置解析器而不是自己构建一个(我们不能希望做得好或做得快!). (3认同)

wez*_*zzy 140

首先获取当前地址

var url = window.location.href
Run Code Online (Sandbox Code Playgroud)

然后只解析该字符串

var arr = url.split("/");
Run Code Online (Sandbox Code Playgroud)

你的网址是:

var result = arr[0] + "//" + arr[2]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 这适用于URL字符串,其中`location`对象不可用(浏览器外的js!) (8认同)
  • 或者只是把它变成一个单行:`window.location.href.split('/').slice(0,3).join('/')` (6认同)
  • window.location.origin (3认同)

Pij*_*usn 125

出于某种原因,所有答案都是过度杀伤力.这就是全部:

window.location.origin
Run Code Online (Sandbox Code Playgroud)

更多细节可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties

  • 仅供参考,我相信将来所有流行的浏览器都会实现它会很好,但是*,目前情况并非如此:https://developer.mozilla.org/en-US/docs/ Web/API/window.location#Browser_compatibility在撰写本文时,根据我的研究,只有最新版本的Firefox和WebKit浏览器支持origin属性. (19认同)
  • 你好2015年...不幸的是,根据[此兼容性表](https://developer.mozilla.org/en-US/docs/Web/API/URLUtils#Browser_compatibility),所有浏览器仍无法正确实现URLUtils MDN.然而,看起来原始属性比2013年稍微好一些,它仍然[不适合生产](https://developer.mozilla.org/en-US/docs/Web/API/URLUtils/origin#Browser_compatibility )因为它在Safari中没有正确实现.对不起大家 :( (5认同)
  • 2020 年你好:它现在适用于所有浏览器,Opera 未知。此信息是从这里获取的:https://developer.mozilla.org/en-US/docs/Web/API/Window/location#Browser_compatibility (4认同)
  • 刚刚完成:位置是[在HTML5上定义](http://www.w3.org/TR/html5/browsers.html#location),它实现了`[URLUtils`接口] [在WHATWG上定义](https: //url.spec.whatwg.org/#urlutils)并包含`origin`属性. (2认同)

Tob*_*oby 51

正如已经提到的那样,还没有完全支持,window.location.origin但是不是使用它或创建一个新的变量来使用,我更喜欢检查它,如果没有设置它.

例如;

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

几个月前我实际上写了一篇关于window.location.origin修复的内容


Mir*_*lec 33

主办

var url = window.location.host;
Run Code Online (Sandbox Code Playgroud)

回报 localhost:2679

主机名

var url = window.location.hostname;
Run Code Online (Sandbox Code Playgroud)

回报 localhost


Mai*_*uif 22

为什么不使用:

let full = window.location.origin
Run Code Online (Sandbox Code Playgroud)

  • 当用现有答案添加旧问题的答案时,解释您的答案带来了哪些新信息,并确认时间的流逝是否会影响答案是很有用的。 (3认同)

int*_*men 21

window.location.origin 将足以得到相同.


Дам*_*чев 13

protocol属性设置或返回当前URL的协议,包括冒号(:).

这意味着如果您只想获得HTTP/HTTPS部分,可以执行以下操作:

var protocol = window.location.protocol.replace(/:/g,'')
Run Code Online (Sandbox Code Playgroud)

对于您可以使用的域:

var domain = window.location.hostname;
Run Code Online (Sandbox Code Playgroud)

对于您可以使用的端口:

var port = window.location.port;
Run Code Online (Sandbox Code Playgroud)

请记住,如果端口在URL中不可见,则该端口将为空字符串.例如:

如果您在没有端口使用时需要显示80/443

var port = window.location.port || (protocol === 'https' ? '443' : '80');
Run Code Online (Sandbox Code Playgroud)


Jul*_*oux 8

这是我正在使用的解决方案:

const result = `${ window.location.protocol }//${ window.location.host }`;
Run Code Online (Sandbox Code Playgroud)

编辑:

要添加跨浏览器兼容性,请使用以下命令:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;
Run Code Online (Sandbox Code Playgroud)


cpu*_*cpu 7

实际上,window.location.origin在遵循标准的浏览器中运行良好,但猜猜是什么.IE不符合标准.

因此,这在IE,FireFox和Chrome中对我有用:

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Run Code Online (Sandbox Code Playgroud)

但是对于可能导致冲突的未来可能的增强,我在"location"对象之前指定了"window"引用.

var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');
Run Code Online (Sandbox Code Playgroud)