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

时间:2011-12-14 19:51:58

标签: javascript url parameters url-rewriting address-bar

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

如何在不使用新网址重新加载页面的情况下重写地址栏中的URL?

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

目标是在Javascript中提取参数,但不在地址栏中显示它们。

5 个答案:

答案 0 :(得分:12)

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

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

浏览器历史记录记录了您在浏览会话中的位置。 .replaceState()允许您使用其他项替换历史记录列表中的当前项。 .pushState()在浏览器历史记录中添加了一个新项目,并且都更改了浏览器URL栏中显示的URL,而不重新加载页面。您可以选择使用哪种方法,具体取决于您希望浏览器的“后退”按钮对此特定页面条目的行为方式。

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

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

答案 1 :(得分:6)

在html5中,可以在不重新加载页面的情况下重写url(出于安全原因,你仍然无法更改域名),使用history api你可以写:

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

其中前两个参数在某种程度上是任意的,第三个参数是新的url(不包括域名)。如果您要启用后退按钮以返回上一个网址,请使用pushState代替上面的replaceState。在此blog post中了解有关这些功能的更多信息。

关于浏览器支持,最近的Firefox和Chrome版本支持它,但仅限于IE10 +,这还不是很常见。有关详细信息,请参阅compatibility matrixbrowser implementation details

答案 2 :(得分:2)

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

但是,您可以更改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>

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

答案 3 :(得分:1)

您可以使用属于HTML 5历史记录API的新pushstate,它允许您更改URL而无需实际重新加载浏览器。

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

答案 4 :(得分:0)

我认为不存在这种可能性,我的意思是你可能在加载后重写URL并添加返回false,所以你要防止重新加载,否则你必须在url上做一个表单POST实现没有显示参数。