我需要从给定的URL中提取完整的协议、域和端口。例如:
https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
我需要从给定的URL中提取完整的协议、域和端口。例如:
https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
当前回答
适用于所有浏览器的简单答案:
let origin;
if (!window.location.origin) {
origin = window.location.protocol + "//" + window.location.hostname +
(window.location.port ? ':' + window.location.port: '');
}
origin = window.location.origin;
其他回答
protocol属性设置或返回当前URL的协议,包括冒号(:)。
这意味着如果你只想获得HTTP/HTTPS部分,你可以这样做:
var protocol = window.location.protocol.replace(/:/g,'')
对于域名,您可以使用:
var domain = window.location.hostname;
对于您可以使用的端口:
var port = window.location.port;
请记住,如果端口在URL中不可见,则端口将是空字符串。例如:
http://example.com/将为端口返回“” http://example.com:80/将返回80端口
如果在没有端口使用时需要显示80/443
var port = window.location.port || (protocol === 'https' ? '443' : '80');
正如已经提到的,有一个尚未完全支持的window.location.origin,但不是使用它或创建一个新变量来使用,我更喜欢检查它,如果它没有设置为设置它。
例如;
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
实际上我在几个月前写过关于window.location.origin的修复
首先获取当前地址
var url = window.location.href
然后解析这个字符串
var arr = url.split("/");
你的网址是:
var result = arr[0] + "//" + arr[2]
var getBasePath = function(url) {
var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
return r ? r[0] : '';
};
这些答案似乎都没有完全解决这个问题,它需要一个任意的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');
方法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');
就是这样!
浏览器内置的解析器已经完成了它的工作。现在你可以抓取你需要的部分(注意,这适用于上述两种方法):
// 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:'
附加功能:搜索参数
机会是你可能会想分开搜索url参数以及,因为'?startIndex=1&pageSize=10'本身并不太有用。
如果你使用上面的方法1 (URL API),你只需使用searchParams getter:
url.searchParams.get('startIndex'); // '1'
或者获取所有参数:
function searchParamsToObj(searchParams) {
const paramsMap = Array
.from(url.searchParams)
.reduce((params, [key, val]) => params.set(key, val), new Map());
return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }
如果你使用方法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' }