如何在页面加载后从URL中删除查询字符串?

时间:2012-05-22 11:15:37

标签: javascript html url query-string

我有一个附加了长查询字符串的URL。 页面加载后,我不需要查询字符串。所以我想从地址栏中删除查询字符串而不重新加载页面。

我尝试了parent.location.hash = '';window.location.href = '/#'

他们没有什么区别。

11 个答案:

答案 0 :(得分:36)

正如其他人所说,您可以使用现代浏览器中的History API(IE10 +,FF4 +,Chrome5 +)来完成此操作。答案中没有完整的例子,所以我认为我可以分享我的解决方案,因为我只需要做同样的事情:

history.pushState(null, "", location.href.split("?")[0]);

如果您使用Modernizr,还可以检查历史记录API是否可用:

if (Modernizr.history) {
    history.pushState(null, "", location.href.split("?")[0]);
}

答案 1 :(得分:16)

使用modern browsers the history api可以实现这一点,但可能不是解决问题的最佳方法。

history.replaceState({}, 'some title', '/');

听起来你最好处理数据,然后重定向到主页,而不是直接返回HTML文档。

由于您不想保留URL,因此对书签没有用处,因此您很可能最好不要发出POST请求。

这表明您应该使用POST-Redirect-GET pattern

答案 2 :(得分:7)

如果不重新加载页面,你不能这样做,想象一下你是否可以在浏览器地址栏中放置你想要的东西?安全乐趣:)

虽然现在可以使用新的history API在HTML5中进行(仅适用于支持它的浏览器),但实际上,您的方案最好保证重写而不是包含(似乎大锤要破解坚果)。

如你所说,在页面加载后你不需要查询字符串,你应该真的回发,然后在你完成处理后重定向到另一个URL。

答案 3 :(得分:2)

使用history.replaceState({}, "Title", "page.html");

pushState的语法相同。但是,您必须找到一种让IE了解的方法。

更好的方法是使用Apache mod_rewrite模块。这很容易使用。

答案 4 :(得分:0)

现在更新了代码

只需在您要更改其链接的页面中添加以下代码。

// javascript function

   function buildLin(first) {
    var firs = first.toString()
       //alert(firs);
       //document.getElementById("team").value = "1";
           document.location.hash = "#" + firs.replace(/ /g, "_");
        //alert(document.location.hash);
    }

 //jQuery to call above function after page loads

  $(document).ready(function () {
      buildLin(2);
  });

不要忘记添加http://code.jquery.com/jquery-latest.js     在你的页面上

答案 5 :(得分:0)

我遇到了同样的问题。我的解决方案是: 得到这样的请求:

operation.aspx?opr=lock

完成操作重定向后,如下所示:

Response.Redirect("operation.aspx");

在回复中,如果有任何消息,我打印出来就像这样:

if (Session["InfoMessages"] != null)
{
    lblMessage.Text = (string)Session["InfoMessages"];
    Session["InfoMessages"] = null;
}

我希望它能帮助别人:)

答案 6 :(得分:0)

我在个人项目中使用此代码snippit,我需要删除URL params而不重新加载:

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

答案 7 :(得分:0)

我想再添加一种方法,尤其是对于使用$routeProvider的人。

正如在其他一些答案中提到的那样,你可以使用:

var yourCurrentUrl = window.location.href.split('?')[0]; 
window.history.replaceState({}, '', yourCurrentUrl ); 

或在历史堆栈中创建新记录:

window.history.pushState({}, '', yourCurrentUrl );  

有关使用history.pushStatehistory.replaceState的详细而详细的解释,您可以阅读this post on SO

但是,如果您在应用中使用Angular $routeProvider,那么如果它与任何现有模式匹配,它仍将捕获此更改。为避免这种情况,请确保将$routeProvider reloadOnSearch标记设置为false,因为默认情况下为true

例如:

$routeProvider.when("/path/to/my/route",{
   controller: 'MyController',
   templateUrl: '/path/to/template.html',
   //Secret Sauce
   reloadOnSearch: false//Make sure this is explicitly set to false
});

答案 8 :(得分:0)

从地址栏中删除查询字符串值

var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}

答案 9 :(得分:0)

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

答案 10 :(得分:-1)

您可以使用POST代替GET完全避免使用查询字符串。