删除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 );
根据我们的要求,随意用replaceState
replacepushState
。
你可以用{}
和"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]