我有一个从url中删除参数的功能。
这是我的功能:
function removeParameter(key) {
let parameters = document.location.search;
const regParameter = new RegExp('[?|&]' + key + "=([a-zA-Z0-9_-]+)");
if (regParameter.test(parameters)){
parameters = parameters.replace(regParameter , '')
}
window.history.pushState({}, '', parameters)}
当我把这个函数称为这个URL的时候 http://example.com/products?color=4&brand=apple
删除品牌的第一个调用功能是正确的结果
removeParameter('brand')
但另一个称此功能用于删除颜色不能正常工作。
实际上,当我想删除第一个参数(键在标记之后)时,这个功能不起作用......
答案 0 :(得分:1)
如果我错了,请纠正我,
我从你的代码中创建了一个工作片段,它似乎正常工作。
如果您在新的新标签页上运行代码段,它会在标签页历史记录中添加2个网址 我还修改了你的正则表达式以使其更容易。
function removeParameter(key) {
var parameters = url; // document.location.search; // TAKIT: modified for test
const regParameter = new RegExp('[?|&]' + key + "=([^&]+)"); // TAKIT: Simplified regex
if (regParameter.test(parameters)) {
parameters = parameters.replace(regParameter, '')
}
window.history.pushState({}, 'Test 1', parameters);
return parameters; // TAKIT: Added
}
// Output
var url = "https://stacksnippets.net/js?color=4&brand=apple";
console.log(url);
url = removeParameter("brand");
console.log(url);
url = removeParameter("color");
console.log(url);

希望它有所帮助。
答案 1 :(得分:1)
pushState()
的第三个参数是整个网址。您的函数仅发送URL的window.history.pushState({}, '', location.pathname + parameters)}
即查询参数部分。所以你需要做
?
在你的功能的最后一行。此外,您的代码目前尚未处理边缘情况,即如果删除第一个参数,则会删除&
而不是尾随http://example.com/products&brand=apple
。因此,您最终得到的const reg = new RegExp('[?&](' + key + '=[\\w-]+&?)');
let matches = reg.exec(parameters);
if (matches){
parameters = parameters.replace(matches[1], '');
}
不是有效的网址。最后,我简化了你的表达。
split('&')
这仍然无法处理更复杂的情况(没有值的参数,散列等)。还有其他几种选择:
var params = new URLSearchParams(location.search);
params.delete(key);
window.history.pushState({}, '', location.pathname + "?" + params.toString());
的解决方案。更多代码,但更具可读性且不易出错。如果您不需要IE支持,请使用URLSearchParams
。然后你的整个功能可以简化为:
adb uninstall com.your.package.name
答案 2 :(得分:0)
可以使用此功能,我修改了@Takit Isy回答
function removeParameter(key) {
var parameters = url; // document.location.search; // TAKIT: modified for test
const regParameter = new RegExp(key + "=([a-zA-Z0-9_-]+[&]{0,1})");
if (regParameter.test(parameters)) {
parameters = parameters.replace(regParameter, '')
if(parameters.substring(parameters.length-1)=='?' || parameters.substring(parameters.length-1)=='&'){
parameters = parameters.slice(0, -1);
}
}
return parameters; // TAKIT: Added
}