在页面刷新之前从 URL 中删除查询字符串

Posted

技术标签:

【中文标题】在页面刷新之前从 URL 中删除查询字符串【英文标题】:Removing querystrings from the URL before page refresh 【发布时间】:2011-07-18 14:10:51 【问题描述】:

新用户注册后,我需要将用户重定向到主页并显示 twitter 样式的欢迎消息。我最初尝试使用 jquery cookie 插件来存储我的消息并在 cookie 存在时将其显示在重定向页面上,但问题是它不适用于所有浏览器。 Safari 上的 Firfox 不会删除 cookie,因此每次刷新浏览器时都会显示该消息。代码如下:

if ($.cookie("message")) 
    TwentyQuestions.Common.ShowMessageBar($.cookie("message"), 7000);
    $.cookie('message', "any_value",  expires: -10 )

所以我决定改用查询字符串,但现在问题类似。主页加载时,会检测到查询字符串并显示消息。但是如何从 URL 中删除查询字符串,以便每次刷新页面时都不会显示消息?

谢谢!

【问题讨论】:

【参考方案1】:

你能做到吗:

window.location.href = window.location.href.split('?')[0];

它有效,但我不确定这是否是您正在寻找的?

【讨论】:

谢谢。这可能会奏效,但此时我真的不想再做一次重定向。 如果您有“清除搜索设置”类型的链接或按钮,这将非常有用。谢谢凯尔【参考方案2】:

也许问题是您试图在客户端做所有事情。相反,您应该设置与用户关联的持久 cookie。然后在后端,第一次向该用户显示主页时,向您显示欢迎信息。还要清除服务器端此用户的任何“首次用户”标志。那么下次用户访问此页面时,他们将不会看到该消息。

您也可以做类似的事情,如果用户访问您的网站并且 cookie 不存在,您可以显示“欢迎首次使用用户”消息。

【讨论】:

如果客户端方法都不起作用,这将是我最后的选择。 @marcosfromero 的解决方案看起来对我有用。谢谢... 我最终使用了这种方法...没有一个客户端方法足以在所有浏览器上工作。【参考方案3】:

您可以使用哈希来代替查询字符串。

使用特殊哈希重定向到主页,进入时将其删除。

类似:

if(document.location.hash == '<special hash>') 
    TwentyQuestions.Common.ShowMessageBar(...);
    document.location.hash='';

【讨论】:

这行得通,但是 document.location.has 留下了一个尾随的 '#'。只有哈希词本身被删除。从功能上讲,这很好,但是无论如何要从 URL 中删除它? 不这么认为。我从来没有。【参考方案4】:
location = location.pathname + location.hash

这当然会丢失任何 POST 数据,但如果您有一个查询字符串,它们可能还是通过 GET 到达您的站点。

如果位置没有查询组件,它应该没有效果。

【讨论】:

【参考方案5】:

您可以使用 cookie 执行此操作,但您必须正确删除 cookie。在过去设置过期日期适用于某些浏览器,但不适用于您发现的其他浏览器,使用 jQuery cookie 插件删除 cookie 的正确方法是发送null;来自fine manual:

@example $.cookie('the_cookie', null); @desc 通过传递 null 作为值来删除 cookie。请记住,您必须使用设置 cookie 时使用的相同路径和域。

所以用这个删除它:

$.cookie('message', null);

cookie 方法应该可以正常工作。

【讨论】:

谢谢@mu。这是我首先尝试的,但它似乎并没有在 Chrome 中将其删除。

以上是关于在页面刷新之前从 URL 中删除查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新页面的情况下使用 JavaScript 从 window.location (URL) 中删除哈希?

从 angular 1.5 url 中删除 # hashtag

从当前 url 追加/删除锚名称而不刷新

解决vue修改路由的查询字符串(query)url不改变,页面不刷新问题

如何从 Silverlight 应用程序中刷新浏览器页面?

从页面中删除行而不刷新页面