使用Firefox“后退”按钮时不会执行启动JavaScript代码

时间:2013-04-03 15:08:43

标签: javascript firefox back

This website有一个奇特的效果:当点击导航链接时,内容会淡出,当新页面(在不同的URL上)加载时,其内容会淡入。

有趣的是,在用户点击浏览器的“后退”按钮后,他们会返回上一页,内容仍会淡入。换句话说,上一页不会停留在淡出状态,这是最后一次看到的。根据{{​​3}},页面应该保持最后一个状态。

我尝试了很多方法来重现这种效果,但在我的测试中,点击“返回”按钮后,上一页仍然没有显示任何内容(内容保持在淡出状态)。有时它适用于某些浏览器但不适用于其他浏览器。有时候它可以工作,但是在重新打开浏览器之后就没有了。

网站如何实现此效果,即使在用户使用“后退”按钮转到上一页后也能正常工作?


===编辑1 ===

this comment


===编辑2 ===

以上测试页面已经在三台不同的PC上使用Firefox进行了测试,Firefox从第4版到第20版都通过在线跨浏览器测试服务进行了测试。结果是一样的:不起作用。

3 个答案:

答案 0 :(得分:16)

您需要一个非常简单的解决方法:挂钩到window.unload事件,以及在window.onpageshow内重新加载页面的特定条件!


Firefox修复

jQuery的:

$(window).unload(function () { $(window).unbind('unload'); });

JavaScript的:

function UnloadHandler() { window.removeEventListener('unload', UnloadHandler, false); }
window.addEventListener('unload', UnloadHandler, false);

iOS Safari修复

jQuery的:

$(window).bind('pageshow', function(event) {
    if (event.originalEvent.persisted) {
        window.location.reload() 
    }
});

JavaScript的:

window.addEventListener('pageshow', function (event) {
    if (event.persisted) {
        window.location.reload() 
    }
}, false);

工作样本

由于我无法更新您的网页,因此我uploaded one here


为什么Firefox需要window.onunload MDN window.unload说:

  

在页面中使用此事件处理程序可防止Firefox 1.5在内存中的bfcache中缓存页面。有关详细信息,请参阅Using Firefox 1.5 caching

某些用户可能不想禁用Firefox的bfcache [请参阅 Page caching despite unload and beforeunload handlers 部分),这就是为什么上面的Firefox修复取消绑定onunload事件onunload事件

为什么Safari需要window.onpageshow显然无法禁用Safari的“ bfcache ”,我们必须刷新页面当它显示出来时。

<强> PS。 bfcache 表示后退/转发缓存


完整的HTML / JavaScript供参考:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Page</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>

    <div>
        <a href="fadingpage.html?p=1">Page 1</a>
        <a href="fadingpage.html?p=2">Page 2</a>
    </div>

    <div id="content">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas laoreet imperdiet diam, in sodales velit porta eget. Ut tellus urna, vestibulum vel facilisis eu, blandit sed est. Sed tortor justo, interdum vel iaculis eu, semper ut libero. Morbi porttitor sem eget dolor eleifend fermentum. Mauris lacinia dictum lacus ut pharetra. Proin lacus felis, vestibulum sit amet malesuada id, pretium at lorem. Duis elementum sapien vitae nibh consequat tincidunt. Proin gravida rhoncus metus sed feugiat. Sed ultricies tellus et augue adipiscing dictum. In vitae tellus eget sapien fringilla tincidunt. Vestibulum gravida, velit quis mattis elementum, lacus felis vestibulum neque, et commodo quam orci quis odio. Nunc varius viverra metus, eu dictum massa venenatis vel. Cras suscipit, orci a gravida pretium, erat massa facilisis turpis, quis sodales sem metus vitae ligula. Nunc interdum augue vel arcu vulputate quis aliquet nulla vehicula. Suspendisse eros odio, ultrices hendrerit euismod nec, condimentum sed metus.</p>
        <p>Donec at dolor et arcu aliquam tincidunt. Nulla eu elit sit amet leo facilisis posuere. Etiam non elit ac elit ornare elementum a vitae felis. Aenean semper nunc urna. Ut et interdum mi. Duis mollis est eu leo gravida vitae adipiscing leo commodo. Ut scelerisque cursus nulla, nec bibendum elit molestie sed. Nulla facilisi. Proin neque arcu, aliquam sed sagittis non, ultrices in enim. Fusce vitae nunc neque, ut sodales magna. Proin aliquam lobortis augue sed aliquet. Maecenas sit amet pellentesque mauris. Donec luctus purus hendrerit nisl pharetra eleifend. Mauris a lectus mi. In elit dui, porta a venenatis vel, consectetur id magna. Quisque vehicula leo vel nulla convallis quis sollicitudin sem fringilla.</p>
        <p>Morbi nec mi odio, eget porttitor nisi. Duis luctus blandit lacus. Donec quis sagittis mi. Maecenas id nisl enim. Aliquam erat volutpat. Nulla facilisi. Donec ac velit diam, interdum rutrum mauris. Nullam at odio eget felis tempus elementum. Nam a augue nibh, sed bibendum massa. Vivamus eget sollicitudin mauris. Pellentesque dapibus quam nec ligula blandit scelerisque. In vulputate mauris vel dolor interdum vitae aliquet nisl convallis. In massa mi, consectetur id malesuada at, suscipit vitae libero. Sed a ligula erat.</p>
    </div>

    <script type="text/javascript">
        $(function() {
            $('body').hide().fadeIn(800);
            $('a').click(function() {
                var href = $(this).attr('href');
                $('body').fadeOut(800, function() {
                    window.location = href;
                });
                return false;
            });
        });
        // Firefox fix
        $(window).unload(function () { $(window).unbind('unload'); });
        // iOS Safari fix
        $(window).bind('pageshow', function(event) {
            if (event.originalEvent.persisted) {
                window.location.reload() 
            }
        });
    </script>
</body>
</html>

答案 1 :(得分:4)

对于遇到Rails问题的人而言 - 你的问题不是bfcache - 它是turbolinks宝石。 Here是如何删除它。

答案 2 :(得分:0)

也许这并不是你所要求的,但他们以这种方式实现了效果:页面内容开始隐藏。 即使您单击后退按钮,也总是如此,因为隐藏的内容是在标记中的样式或类中声明的。 然后是在准备好的事件之后淡化内容的javascript代码:

$('#content').fadeIn(800);