删除 URL 参数而不刷新页面

IT技术 javascript jquery
2021-03-02 15:54:20

我试图删除“?”之后的所有内容 在文档准备好的浏览器 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]);
});
6个回答

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,添加/insert/push新的 URL历史条目,并使其成为当前 URL

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

  • 以编程访问数据通过stateObj接着从锚解析


正如我从您的评论中了解到的,您希望在不再次重定向的情况下清理您的 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 );

随意更换pushStatereplaceState根据您的要求。

您可以替换放慢参数"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 似乎可以使用空字符串。

你为什么要去掉最后一个斜线?这与 OP 的问题有什么关系?他们只想摆脱查询字符串。第一个问号定义查询字符串的开头。
2021-04-29 15:54:20
replaceState看起来更合适,但pushState也能正常工作,直到您开始单击浏览器中的后退和前进按钮,并且您意识到存在用于使用 History API 的整个库是有原因的。
2021-05-10 15:54:20
@jfriend00 根据函数的行为,你在第三个参数中添加的内容将放在域名后面的URL中,即在域名/之后,如www.example.com/。OP 可能在域名和 ? 之间有多个 / 。因此,如果网站位于子目录中,则由他/她来锻炼并进行更好的 url 优化,因为问题是关于如何更改 url,现在如何正确获取它。
2021-05-14 15:54:20
你忘了提到这只是一个 HTML5 特性。developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/...
2021-05-18 15:54:20
我只是说你根本不需要这个url.substring(url.lastIndexOf('/') + 1);url.split("?")[0]将获得第一个问号之前的部分,这是我认为 OP 要求的全部内容。OP 的问题是:“我试图删除浏览器 url 中“?”之后的所有内容”。
2021-05-20 15:54:20

这些都是误导性的,除非您想在单页应用程序中转到不同的页面,否则您永远不想添加到浏览器历史记录中。如果要删除参数而不更改页面,则必须使用:

window.history.replaceState(null, null, window.location.pathname);
KISS(Keep 既愚蠢又简单)。OP 要求在 ? 这是你能得到的最简单的答案!
2021-04-21 15:54:20
history.replaceState(null, null, location.pathname + location.hash) -- 如果不想删除那部分,请添加 location.hash
2021-04-24 15:54:20
没有在火狐上工作。刷新时,获取参数仍会出现。使用推送和替换工作。window.history.replaceState({page: location.pathname}, document.title, window.location.pathname); window.history.pushState({page: location.pathname}, document.title, window.location.pathname);
2021-04-30 15:54:20

一个简单的方法来做到这一点,适用于任何页面,需要 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 to the history, this changes the url without reloading the page

        window.history.pushState({}, document.title, window.location.pathname);
   }
}
前两行检查 ? 之后是否有任何内容?(子字符串只是删除了“?”)然后我检查浏览器是否支持新的 pushstate 调用,最后我使用 pushstate 将状态添加到 url 堆栈中(您可以在该堆栈上推送和弹出 url),window.location .pathname 是本地 url 减去查询并减去域名和前缀 ( domain.com/THIS?notthis )
2021-04-22 15:54:20
这非常有效。不幸的是,我不知道它为什么起作用的第一个线索。都一样感恩。
2021-05-14 15:54:20

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

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

我只想删除一个 param success您可以这样做:

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

这也保留了#hash.


URLSearchParams不适用于 IE,但正在为 Edge 工作你可以使用 polyfill或者可以使用一个简单的辅助函数来支持 IE:

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)
@RickS当然,take_param已经这样做了,但是您可以URLSearchParams通过执行以下操作来做同样的事情:history.replaceState(null, '', (params ? '?' + params : '') + location.hash)或者随心所欲。
2021-04-30 15:54:20
很好的解决方案,有没有办法不添加“?” 如果没有传递参数?
2021-05-10 15:54:20