如何删除 URL 中的参数并将其显示在地址栏中而不会导致 Javascript 中的重定向?

Posted

技术标签:

【中文标题】如何删除 URL 中的参数并将其显示在地址栏中而不会导致 Javascript 中的重定向?【英文标题】:How to remove parameters in URL and display it in address bar without causing redirect in Javascript? 【发布时间】:2012-01-20 14:20:58 【问题描述】:

我找到了很多关于如何在没有参数的情况下提取 URL 的答案。

如何重写地址栏中的 URL 而不会导致页面重新加载新的 URL?

shortURL = top.location.href.substring(0, top.location.href.indexOf('?'));
top.location.href = shortURL // Causes redirect

目标是提取 javascript 中的参数,但不显示在地址栏中。

【问题讨论】:

【参考方案1】:

在支持 History 对象的现代浏览器中,您可以使用 history.replaceState()history.pushState() 更改当前 URL,而不更改当前页面。您可以更改的内容存在限制(例如,出于安全原因,您不能以这种方式更改域/来源)。

有关这些方法的摘要,请参阅here。

浏览器历史记录是您在浏览会话中所处位置的记录。 .replaceState() 允许您将历史列表中的当前项目替换为不同的项目。 .pushState() 在浏览器历史记录中添加了一个新项目,并且都更改了浏览器 URL 栏中显示的 URL,而无需重新加载页面。您可以根据您希望浏览器的“后退”按钮在此特定页面条目中的行为方式来选择要使用的方法。

注意:IE 10 及更高版本支持这些 API。

在不支持历史 API 的旧浏览器版本中,您可以在不重新加载页面的情况下更改 URL 的唯一部分是 URL 末尾的井号标签(# 符号之后的部分)。

【讨论】:

随着 html5 和 pushState 的出现不再是正确答案(更多 here ) @FloatingRock - 更新了 HTML5 .replaceState().pushState() 的答案。【参考方案2】:

在html5中,可以不重新加载页面而重写url(出于安全原因,仍然不能更改域名),使用history api可以编写:

history.replaceState("object or string", "title", "/another-new-url");

其中前两个参数是任意的,第三个参数是新的url(不包括域名)。如果要启用返回按钮以返回上一个 url,请使用pushState 而不是上面的replaceState。在blog post 中阅读有关这些功能的更多信息。

关于浏览器支持,最近的Firefox和Chrome版本都支持,但只在IE10+中,还不是很常见。详情见compatibility matrix或browser implementation details。

【讨论】:

【参考方案3】:

如果不进行重定向,您将无法更改地址栏中的值。这将是网络钓鱼诈骗者的梦想成真!

但是,您可以更改 fragment identifier:(在 JavaScript 中,window.location.hash 值)

<!DOCTYPE html>
<html>
<head>
<title>This is a test</title>
<script>
window.onload = function() 
    window.location.hash = "Loaded!";
    document.getElementById("click-me").onclick = function() 
        window.location.hash = "Click!";
        document.getElementById("click-me").onclick = function() 
            window.location.hash = "Clicked AGAIN!";
        ;
    ;

</script>
<body>
<div>
<input type="button" id="click-me" value="click me!" />
</div>
</body>
</html>

但是更改查询字符串会重定向页面。

【讨论】:

【参考方案4】:

您也许可以使用作为 HTML 5 历史 API 一部分的新 pushstate,它允许您更改 URL 而无需实际重新加载浏览器。

查看http://badassjs.com/post/840846392/location-hash-is-dead-long-live-html5-pushstate 获取快速示例,查看http://diveintohtml5.info/history.html 获取更深入的示例和限制:

【讨论】:

【参考方案5】:

我认为这不可能,我的意思是您可能可以在加载后重写 URL 并添加 return false,因此您可以防止重新加载,否则您必须在 url 上执行表单 POST以实现不显示任何参数。

【讨论】:

以上是关于如何删除 URL 中的参数并将其显示在地址栏中而不会导致 Javascript 中的重定向?的主要内容,如果未能解决你的问题,请参考以下文章

通过 AsyncTask 下载图像并将其显示在 Imageview 中而不存储在 sdcard 中

通过AsyncTask下载图像并将其显示在Imageview中而不存储在SD卡中

如何获取地址栏中的url

使用 htaccess 重定向子域而不更改地址栏中的 URL

Java Web开发 - 将浏览器地址栏中的 Request 参数显示成中文

将通配符子域重定向到子目录,而不更改地址栏中的 URL