删除url参数,而不刷新页面

我试图删除“?”后的所有内容 在浏览器的url文件准备就绪。

这是我正在尝试的:

jQuery(document).ready(function($) { var url = window.location.href; url = url.split('?')[0]; }); 

我可以做到这一点,看看下面的作品:

 jQuery(document).ready(function($) { var url = window.location.href; alert(url.split('?')[0]); }); 

TL; DR

要修改当前URL并将其添加为历史条目的新URL( pushState ):

 window.history.pushState({}, document.title, "/" + "my-new-url.html"); 

要replace当前的URL( replaceState ):

 window.history.replaceState({}, document.title, "/" + "my-new-url.html"); 

根据您的业务逻辑, pushState将在以下情况下非常有用:

  • 如果你想支持浏览器后退button

  • 允许用户使用相同的参数为页面添加书签(以显示相同的内容)

  • 以编程方式通过stateObj访问数据, stateObj不是从锚点parsing。


正如我从你的评论了解,你只是想清除您的url,而不重新redirect。

请注意,您无法更改整个url。 您可以更改域名后面的内容。 这意味着您无法更改www.example.com/但可以更改.com/

 www.example.com/old-page-name => can become => www.example.com/newName45.php 

背景

我们可以用:

1-如果您想要将新的修改后的URL添加到历史条目,则使用pushState()方法 。

2-如果要更新/replace当前历史logging,则使用replaceState()方法 。

history.replaceState()运行方式与history.pushState()完全相同,只是replaceState() 修改了当前的历史logging,而不是创build一个新的历史logging。 请注意,这并不妨碍在全局浏览器历史logging中创build新条目。

当您想要更新当前历史logging条目的状态对象或URL以响应某些用户操作时, replaceState()特别有用。


为了做到这一点,我将在这个例子中使用pushState()方法 ,类似于以下格式:

 var myNewURL = "my-new-URL.php";//the new URL window.history.pushState("object or string", "Title", "/" + myNewURL ); 

根据我们的要求,随意用replaceStatereplacepushState

你可以用{}"Title"replace参数"object or string"document.title这样最后的expression式将变成:

 window.history.pushState({}, document.title, "/" + myNewURL ); 

结果

预览两行代码将创build一个URL,如:

 https://domain.tld/some/randome/url/which/will/be/deleted/ 

成为:

 https://domain.tld/my-new-url.php 

行动

现在让我们尝试一种不同的方法。 假设您需要保留文件的名称。 文件名是在查询string的最后/之前?

 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; } 

更新:

对于一个class轮爱好者,请在您的控制台/萤火虫中试用此页面的url将会改变:

  window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]); 

此页面url将从以下url更改:

 http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103 

 http://stackoverflow.com/22753103#22753103 

注意:正如Samuel Liew在下面的评论中指出的那样,这个function只是为HTML5引入的。

另一种方法是实际redirect你的页面(但是你将失去查询string“?”,仍然需要或数据已被处理?)。

 window.location.href = window.location.href.split("?")[0]; //"http://www.newurl.com"; 

这些都是误导,你永远不想添加到浏览器的历史,除非你想要在单个页面的应用程序中的另一个页面。 如果你想删除参数而不改变页面,你必须使用:

 window.history.replaceState(null, null, window.location.pathname); 

一个简单的方法来做到这一点,在任何页面上工作,需要HTML 5

 // get the string following the ? var query = window.location.search.substring(1) // is there anything there ? if(query.length) { // are the new history methods available ? if(window.history != undefined && window.history.pushState != undefined) { // if pushstate exists, add a new state the the history, this changes the url without reloading the page window.history.pushState({}, document.title, window.location.pathname); } } 

如果我在我的URL的末尾有一个特殊的标记,例如: http : //domain.com/? tag=12345下面的代码在url中显示时删除该标记:

 <script> // Remove URL Tag Parameter from Address Bar if (window.parent.location.href.match(/tag=/)){ if (typeof (history.pushState) != "undefined") { var obj = { Title: document.title, Url: window.parent.location.pathname }; history.pushState(obj, obj.Title, obj.Url); } else { window.parent.location = window.parent.location.pathname; } } </script> 

这给出了从URL中删除一个或多个(或全部)参数的想法

使用window.location.pathname你基本上得到'?'之前的所有东西 在url。

var pathname = window.location.pathname; //仅返回path

var url = window.location.href; //返回完整的URL

我相信最好和最简单的方法是:

 var newURL = location.href.split("?")[0]; window.history.pushState('object', document.title, newURL); 

更好的scheme:

 window.history.pushState(null, null, window.location.pathname); 

要清除所有参数,而不进行页面刷新,并且如果您使用的是HTML5,则可以这样做:

history.pushState({}, '', 'index.html' ); //replace 'index.html' with whatever your page name is

这将在浏览器历史logging中添加一个条目。 如果你不想添加一个新条目,只想replace旧条目,你也可以考虑replaceState

这是一个ES6单线程,它保留了位置散列,并且不会通过使用replaceState污染浏览器历史logging:

 (l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location) 

我只想删除一个参数success 。 你可以这样做:

 let params = new URLSearchParams(location.search) params.delete('success') history.replaceState(null, '', '?' + params + location.hash) 

这也保留#hash


URLSearchParams不能在IE上运行,但是正在为Edge工作 。 你可以使用一个polyfill或一个可以使用IE辅助function的辅助函数:

 function take_param(key) { var params = new Map(location.search.slice(1).split('&') .map(function(p) { return p.split(/=(.*)/) })) var value = params.get(key) params.delete(key) var search = Array.from(params.entries()).map( function(v){ return v[0]+'='+v[1] }).join('&') return {search: search ? '?' + search : '', value: value} } 

这可以用来像:

 history.replaceState( null, '', take_param('success').search + location.hash) 
 //Joraid code is working but i altered as below. it will work if your URL contain "?" mark or not //replace URL in browser if(window.location.href.indexOf("?") > -1) { var newUrl = refineUrl(); window.history.pushState("object or string", "Title", "/"+newUrl ); } function refineUrl() { //get full url var url = window.location.href; //get url after/ var value = url = url.slice( 0, url.indexOf('?') ); //get the part after before ? value = value.replace('@System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"]',''); return value; } 

在jQuery中使用<

 window.location.href = window.location.href.split("?")[0]