TL; 博士
1- 要修改当前 URL 并将其(新修改的 URL)作为新 URL 条目添加/注入到历史列表中,请使用:pushState
window.history.pushState({}, document.title, "/" + "my-new-url.html");
2- 要替换当前 URL而不将其添加到历史记录条目,请使用replaceState
:
window.history.replaceState({}, document.title, "/" + "my-new-url.html");
3-根据您的业务逻辑,pushState
在以下情况下会很有用:
正如我从您的评论中了解到的,您希望在不再次重定向的情况下清理您的 URL。
请注意,您不能更改整个 URL。您可以更改域名后的内容。这意味着你不能改变,www.example.com/
但你可以改变之后的.com/
www.example.com/old-page-name => can become => www.example.com/myNewPaage20180322.php
背景
我们可以用:
1- pushState() 方法,如果您想向历史条目添加新的修改 URL。
2-如果要更新/替换当前历史条目,则使用 replaceState() 方法。
.replaceState()
操作完全一样,.pushState()
除了.replaceState()
修改当前历史条目而不是创建新历史条目。请注意,这不会阻止在全局浏览器历史记录中创建新条目。
.replaceState()
当您想要更新当前历史条目的状态对象或URL以响应某些用户操作时,它特别有用。
代码
为此,我将在此示例中使用pushState() 方法,其工作方式类似于以下格式:
var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );
随意更换pushState
与replaceState
根据您的要求。
您可以替换放慢参数"object or string"
与{}
和"Title"
与document.title
因此最终statment将变为:
window.history.pushState({}, document.title, "/" + myNewURL );
结果
前两行代码将生成一个 URL,例如:
https://domain.tld/some/randome/url/which/will/be/deleted/
成为:
https://domain.tld/my-new-url.php
行动
现在让我们尝试不同的方法。假设您需要保留文件名。文件名在最后一个/
查询字符串之前?
。
http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john
将会:
http://www.someDomain.com/keepThisLastOne.php
像这样的事情会让它工作:
//fetch new URL
//refineURL() gives you the freedom to alter the URL string based on your needs.
var myNewURL = refineURL();
//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced.
window.history.pushState("object or string", "Title", "/" + myNewURL );
//Helper function to extract the URL between the last '/' and before '?'
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php'
//pseudo code: edit to match your URL settings
function refineURL()
{
//get full URL
var currURL= window.location.href; //get current address
//Get the URL between what's after '/' and befor '?'
//1- get URL after'/'
var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
//2- get the part before '?'
var beforeQueryString= afterDomain.split("?")[0];
return beforeQueryString;
}
更新:
对于一个班轮迷,请在您的控制台/萤火虫中尝试一下,此页面 URL 将更改:
window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);
此页面 URL 将从以下位置更改:
http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103
到
http://stackoverflow.com/22753103#22753103
注意:正如Samuel Liew在下面的评论中指出的那样,此功能仅针对HTML5
.
另一种方法是实际重定向您的页面(但您将丢失查询字符串“?”,它是否仍然需要或数据已被处理?)。
window.location.href = window.location.href.split("?")[0]; //"http://www.newurl.com";
笔记2:
window.history.pushState({}, document.title, '');
当最后一个参数是空字符串时,Firefox 似乎会忽略。添加斜杠 ( '/'
) 按预期工作并删除了 url 字符串的整个查询部分。Chrome 似乎可以使用空字符串。