这些答案似乎都没有完全解决这个问题,它需要一个任意的 url,而不是当前页面的 url。
方法一:使用 URL API(注意:不支持 IE11)
您可以使用URL API(IE11 不支持,但可用everywhere else)。
这也使访问search params 变得容易。另一个好处:它可以在 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' }