【问题标题】:How to reload page when back is pressed, after a pushState?在 pushState 后按下返回时如何重新加载页面?
【发布时间】:2012-07-30 22:38:37
【问题描述】:

我目前使用 Code Igniter 来获得漂亮的 URL,并且我有这个系统,它基本上使用 ajax 来让你搜索健身房。

我在加载健身房列表后使用推送状态,如下所示:

example.com/list/search_key/pagination-page/sort-by/filters~seperated~by~that

其中 search_key 是他们想要搜索健身房的区域中的城市、州或社区,过滤器是单独的复选框。

发生了什么,我使用 .ajax 通过 post 发送搜索键和每个单独的复选框值(1 或 0),然后 code igniter 使用 POST 数据和 PHP,生成一个类似上面的 url。 ajax 成功推送表明 URL 是 PHP 生成的。

问题是,如果您使用say pagination 转到第2 页,而您想转到第1 页,那么您自然会使用浏览器的后退按钮。问题是,它仅将 URL 地址栏支持到当前地址之前的 url,它实际上并没有更改页面内容。我需要它来使用旧的(以前的)url 重新加载页面,或者刷新,或者其他什么。

我什至可以使用 ajax 使用 URL 数据重新提交表单,但我不知道该怎么做。

我已经尝试了一些东西,但没有任何效果。我几乎在谷歌的第一页上尝试了所有东西,一切看起来很有希望,但实际上没有任何效果。

如果 pushstate url 更改为以前的 url,是否仍然刷新页面?

PS 以下是我尝试过的一些关键事项:

<script type="text/javascript">
$(window).unload(function(e){
   e.preventDefault();
   alert("Back was pressed!");
});
// If this wouldve worked, it wouldve atleast alerted me that.

// The code off this URL: http://www.mrc-productivity.com/techblog/?p=1235

// Some of the codes off this URL: http://forum.jquery.com/topic/howto-force-page-reload-refresh-of-previous-page-when-back-button-is-pressed

// A few others.
</script>

【问题讨论】:

    标签: jquery ajax pushstate


    【解决方案1】:

    由于您是从 ajax 成功方法推送状态,因此您可以使用 window.onpopstate 方法检测后退按钮。

    请注意,仅调用 history.pushState() 或 history.replaceState() 不会触发 popstate 事件。 popstate 事件只能通过执行浏览器操作来触发,例如单击后退按钮(或在 JavaScript 中调用 history.back())。

    var stateObj = { foo: "bar" };
    history.pushState(stateObj, "page 2", "bar.html");
    
    window.onpopstate = function(event) {
        if(event && event.state) {
            // event.state.foo
        }
    }
    

    【讨论】:

    • 我还是不太明白这个概念。我知道您需要调用 onpopstate,但上面的代码只有在您点击前进按钮时才有效。我还找到了这个页面:stackoverflow.com/questions/7888711/… 如果你去他的 jsfiddle 示例:jsfiddle.net/pimvdb/CCgDn/1 它适用于他,但如果我复制/粘贴代码,它只会提醒“初始状态”。我做错了什么?
    • 注意我得到了正确的工作,但是添加了 location.reload();你把 event.state.foo 放在哪里,这正是我想要做的,但是当按下后退按钮时我也需要这样做。
    • 没关系。不良用户操作错误。 Lmao 非常感谢。我很感激帮助。与 location.reload() 完美配合;
    • @DavidLawrence 你如何保存历史?似乎location.reload() 第一次工作,但它在历史堆栈上放置了一个额外的相同 URL,所以下一个后退按钮按下什么都不做 - 它转到上一个 URL,现在与当前 URL 相同,然后推送它再次进入堆栈,因此单次后按永远不会再去任何地方!
    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-02-17
    • 2015-04-04
    相关资源
    最近更新 更多