防止页面在后退按钮上重新加载(使用缓存)。或者向下滚动用户。 (至少在 iPhone 上有问题)

问题描述 投票:0回答:2

当用户单击浏览器后退按钮时,是否可以防止重新加载页面?或者至少确保页面像以前一样向下滚动?

我的网页显示项目列表。用户向下滚动,然后单击一个项目以转到另一个页面。当他们单击后退按钮时,我希望他们回到原始页面,向下滚动。

这在我的桌面(Windows、Chrome)上运行良好,但在我的 iPhone(iOS7、Safari 和 Chrome)上它会重新加载页面,这首先需要时间而且很烦人。然后 Chrome 会向下滚动,但 Safari 不会,这意味着用户回到顶部。实际上,这种行为似乎不太一致。

这只是浏览器做出的决定吗?它还会在屏幕锁定然后解锁后重新加载页面。 (再次,我正在 iPhone 上尝试。)或者是我的 html/header/js 可以做到这一点?

我想我可以使用 HTML 缓存,然后在页面本身上跟踪用户滚动的距离。然后,当从缓存重新加载页面时,我可以让它向下滚动到之前的位置。这真的是要走的路吗?

看起来 www.amazon.com 已经可以正常工作了,所以一定有一些解决方案。

javascript html browser-history
2个回答
0
投票

您可以使用 JavaScript 来避免“重新加载”,但其他几个原因也可能导致页面在手机上重新加载。

我建议您不要尝试避免重新加载,而是使用 cookie 保存用户数据,或者更好的 localStorage

例如你想保存最后一页的位置(滚动条的位置):

(function () {
    var scrollFired = false;

    function saveScroll () {
        if (window.localStorage) {
            window.localStorage.setItem("scrollLeftTop", window.pageXOffset + "," + window.pageYOffset);
        }
    }

    function autoScroll() {
        scrollFired = true;
        if (window.localStorage) {
            var xy = window.localStorage.getItem("scrollLeftTop");
            if (xy) {
                var a = xy.split(",");
                var x = a[0];
                var y = a[1];
                window.scroll(x, y);
            }
        }
    }

    function onLoadAutoScroll() {
       if(scrollFired === false) {//Prevent scroll if run DOMContentLoaded
          autoScroll();
       }
    }

    window.addEventListener("DOMContentLoaded", autoScroll, false);
    window.addEventListener("load", onLoadAutoScroll, false);//If DOMContentLoaded not "run"
    window.addEventListener("scroll", saveScroll, false);
})();

兼容性

注意:如果在旧版浏览器中需要

localStorage
,请尝试(像 localStorage 这样的 cookie):

if (!window.localStorage) {
  window.localStorage = {
    getItem: function (sKey) {
      if (!sKey || !this.hasOwnProperty(sKey)) { return null; }
      return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1"));
    },
    key: function (nKeyId) {
      return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/, "").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId]);
    },
    setItem: function (sKey, sValue) {
      if(!sKey) { return; }
      document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
      this.length = document.cookie.match(/\=/g).length;
    },
    length: 0,
    removeItem: function (sKey) {
      if (!sKey || !this.hasOwnProperty(sKey)) { return; }
      document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
      this.length--;
    },
    hasOwnProperty: function (sKey) {
      return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
    }
  };
  window.localStorage.length = (document.cookie.match(/\=/g) || window.localStorage).length;
}

-1
投票

我不相信您可以“在用户单击浏览器后退按钮时阻止页面重新加载”(正如您的问题开始时)。用户应该对浏览器的导航位置拥有最终决定权。

您可以将一个函数绑定到

beforeunload
事件,并在该函数中放置一个警报,延迟用户按下
back
reload
,让他们有机会阅读自定义消息并选择继续或取消。

这是 jQuery 中的:

$(window).bind('beforeunload', function() {
  return 'Are you sure?';
});

https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

如果您关心的是更简单地重新加载上一页的缓存和滚动版本,而不是执行完全全新的重新加载……这听起来更像是内容服务器上的设置和/或用户浏览器上的设置。

我知道通过我的注册商/主机,我可以登录并访问 GUI 缓存控件,或者我可以在我的

.htaccess
文件中上传自定义缓存指令。据我了解,这些将控制是否允许用户从您的服务器缓存文件以及缓存多长时间。用户的网络浏览器也应该具有是否缓存文件或每次都加载新鲜的设置。

© www.soinside.com 2019 - 2024. All rights reserved.