从 Javascript 的路径中删除查询字符串的简单方法是什么?我见过一个使用 window.location.search 的 Jquery 插件。我不能这样做:在我的例子中的 URL 是一个从 AJAX 设置的变量。
var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'
从 Javascript 的路径中删除查询字符串的简单方法是什么?我见过一个使用 window.location.search 的 Jquery 插件。我不能这样做:在我的例子中的 URL 是一个从 AJAX 设置的变量。
var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'
一个简单的方法是:
function getPathFromUrl(url) {
return url.split("?")[0];
}
对于那些还希望在不存在查询字符串时删除散列(不是原始问题的一部分)的人,这需要多一点:
function stripQueryStringAndHashFromPath(url) {
return url.split("?")[0].split("#")[0];
}
编辑
@caub(最初是@crl)建议了一个更简单的组合,适用于查询字符串和哈希(尽管它使用 RegExp,以防有人遇到问题):
function getPathFromUrl(url) {
return url.split(/[?#]/)[0];
}
第二次更新:为了提供全面的答案,我正在对各种答案中提出的三种方法进行基准测试。
var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
var i;
// Testing the substring method
i = 0;
console.time('10k substring');
while (i < 10000) {
testURL.substring(0, testURL.indexOf('?'));
i++;
}
console.timeEnd('10k substring');
// Testing the split method
i = 0;
console.time('10k split');
while (i < 10000) {
testURL.split('?')[0];
i++;
}
console.timeEnd('10k split');
// Testing the RegEx method
i = 0;
var re = new RegExp("[^?]+");
console.time('10k regex');
while (i < 10000) {
testURL.match(re)[0];
i++;
}
console.timeEnd('10k regex');
在 Mac OS X 10.6.2 上的 Firefox 3.5.8 中的结果:
10k substring: 16ms
10k split: 25ms
10k regex: 44ms
在 Mac OS X 10.6.2 上运行 Chrome 5.0.307.11 的结果:
10k substring: 14ms
10k split: 20ms
10k regex: 15ms
请注意,子字符串方法的功能较差,因为如果 URL 不包含查询字符串,它会返回一个空白字符串。正如预期的那样,其他两种方法将返回完整的 URL。然而,有趣的是 substring 方法是最快的,尤其是在 Firefox 中。
第一次更新:实际上Robusto 建议的 split() 方法是我之前建议的更好的解决方案,因为即使没有查询字符串它也能工作:
var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.split('?')[0]; // Returns: "/Products/List"
var testURL2 = '/Products/List';
testURL2.split('?')[0]; // Returns: "/Products/List"
原答案:
var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?')); // Returns: "/Products/List"
这可能是一个老问题,但我已经尝试过这种方法来删除查询参数。似乎对我来说工作顺利,因为我需要重新加载以及删除查询参数。
window.location.href = window.location.origin + window.location.pathname;
另外,因为我使用的是简单的字符串加法操作,所以我猜性能会很好。但仍然值得与此答案中的片段进行比较
我可以理解以前的事情是多么痛苦,在现代,你可以像下面这样超级轻松地得到这个
let url = new URL('https://example.com?foo=1&bar=2&foo=3');
let params = new URLSearchParams(url.search);
// Delete the foo parameter.
params.delete('foo'); //Query string is now: 'bar=2'
// now join the query param and host
let newUrl = url.origin + '/' + params.toString();
var path = "path/to/myfile.png?foo=bar#hash";
console.log(
path.replace(/(\?.*)|(#.*)/g, "")
);