【问题标题】:Browser "Back" Button vs. jQuery-animated page浏览器“返回”按钮与 jQuery 动画页面
【发布时间】:2011-06-02 14:32:08
【问题描述】:

我有一个具有挑战性的问题,我已经解决了一段时间了。

问题:当我使用浏览器的后退按钮返回上一页时,页面在播放完所有动画后显示为最终状态。我希望它以初始状态显示并重播动画。

我的网站使用了一些基本的 jQuery 动画。每个页面的初始状态都将主要内容隐藏在浏览器窗口的下边缘下方,当窗口加载时,主要内容会以动画形式出现在浏览器中。当访问者单击任何菜单链接时,主要内容会再次卷起并消失在浏览器窗口的上边缘上方 - 然后加载新页面。整个事情是通过这两段代码实现的:

//Animate the content up from below the browser window

$('#maincontent').animate({top: "15%"}, 2000);

//Animate the content up to hide above the browser window

$('#menu a').click(function(event) {
    event.preventDefault();
    var href = this.href;
    $('#maincontent').animate({
        top: '-300%'
    }, 500,
    function() {
        window.location = href;
    });
});

问题:点击浏览器后退按钮时,如何让页面显示在初始状态?

我浏览了 StackOverflow 一段时间。人们经常询问这个问题,但似乎没有人找到真正有效的解决方案。建议包括阻止页面被缓存——(不起作用,即使它起作用,也不会很有效率,因为某些页面确实需要被缓存)——重新加载页面(导致一些特殊的行为,最终不会'也行不通) - 使用 cookie(在任何地方都没有给出具体的代码示例)或使用 php(在任何地方都没有给出具体的代码示例)。我在这个网站上问了几个关于 in 的问题,并收到了一些建议,但没有一个适合我的情况。所以在几个不眠之夜之后,我想问问是否有人真的可以帮助解决这个问题。

如果有人之前成功处理过该问题,如果您能分享您的专业知识并提出可行的解决方案,我将不胜感激!

新编辑:我想我可能已经找到了解决方案,但我需要 jQuery/JavaScript 语法方面的帮助。我想尝试修改代码以添加更多操作,但我不确定如何编写,以便页面在位置更改为新页面之前重新加载所以我想写这样的东西,而不是上面显示的第二个 sn-p:

//Animate the content up to hide above the browser window

$('#menu a').click(function(event) {
    event.preventDefault();
    var href = this.href;
    $('#maincontent').animate({
        top: '-300%'
    }, 500,
    function() {
    // a code that reloads the same page, something like
    //window.location = window.location; followed by
        window.location = href;
    });
});

-- 但我就是不知道如何正确写。

或者,也许可以将页面的 css 值重置为 css 文件中的默认值并再次触发 JavaScript?

有人可以建议正确的代码吗?

【问题讨论】:

  • window.onload 怎么样?
  • 是的,怎么样?

标签: jquery browser animation back


【解决方案1】:

免责声明:以下并非完全可靠的解决方案,但我觉得它很有趣,并认为我应该分享。

我过去也有类似的需求,奇怪的是,我最终得到的解决方案是降级到 jQuery 以利用 a bug in jQuery 1.3

我只在一个版本的 Firefox 上测试过这个,所以 YMMV,但是尝试以下:

这对于我的用例来说已经足够了,因为我的目标受众是有限的,并且只很少使用 jQuery。也就是说,我正在热切地关注这个帖子,希望能找到更好的解决方案。

更新

按照上述 jquery 错误的轨迹,您似乎可以通过禁用 bfcache 来获得相同的效果。

最简单的方法是add an onunload attribute to body。 (更多详情见链接)。

<body onunload=''>

这是一个使用 jquery 1.6 的示例。再次,没有彻底测试所以 YMMV。

【讨论】:

  • 这很棒而且绝对非常有用。事实上,到目前为止,这是我在 StackOverflow 上找到的唯一有效的解决方案!是的,这是一种胶带解决方案,但谁在乎呢?非常感谢你做的这些!当然,我会非常有兴趣为任何版本的 jQuery 找到解决方案,但我总是会求助于你的解决方案。谢谢肖恩!
  • 你成功了!你是天才肖恩!
【解决方案2】:

以上答案涉及问题,但提供了解决问题的技巧。这似乎是正确的做法。

$(window).bind('pageshow',function(){
    alert("This page will run even if the back button was pressed!");
});

要了解有关 pageshow/pagehide 事件的更多信息,请参见此处: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

你可以像这样更进一步:

$(window).bind('pageshow',function(e){
        if (e.persisted) {
            alert("pageshow event handler called.  The page was just restored from the Page Cache.");
        } else {
            alert("pageshow event handler called for the initial load.  This is the same as the load event.");
        }
}

【讨论】:

    【解决方案3】:

    看看这个thread。他建议如下所示的黑客攻击(从那里复制):

    当用户点击返回按钮时应该触发 onload 事件。不是通过 JavaScript 创建的元素将保留它们的值。我建议保留在 INPUT TYPE="hidden" 或 TEXTAREA 设置为 display:none 的动态创建元素中使用的数据的备份,然后使用文本框的值进行 onload 以将动态元素重建为原来的样子。

    如果您不关心重新构建页面并想要实际重新加载它,那么您可以这样做: 代码:

    <input type="hidden" id="refreshed" value="no">
    <script type="text/javascript">
    onload=function(){
    var e=document.getElementById("refreshed");
    if(e.value=="no")e.value="yes";
    else{e.value="no";location.reload();}
    }
    </script>
    

    您可以在#menu 点击时将隐藏值设为“是”。

    HTH

    【讨论】:

    • 是的,我之前尝试过,但没有成功。也许你可以向我解释如何让它工作 Raja。这段代码应该放在页面的什么位置?我认为它不在标题中,对吗?我尝试将它放在 body 标记的顶部和底部以及结束 html 标记之前,但它不起作用。是否应该以某种方式纠正?另外,你能告诉我在菜单点击时将隐藏值更改为“是”的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2014-09-16
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多