防止页面重新加载后退按钮(使用缓存).或者向下滚动用户.(至少在iPhone上发行)
Prevent page reload on back button (use cache). Or scroll user back down. (Issue on, at least, iPhone)
是否有可能防止页面在用户单击浏览器返回按钮时被重新加载?或者至少确保页面像以前一样向下滚动?
我的网页显示了一个项目列表。用户向下滚动,然后单击一个项目转到另一个页面。当他们点击后退按钮时,我希望他们回到原始页面,向下滚动。
这在我的台式机(Windows, Chrome)上工作得很好,但在我的iPhone (iOS7, Safari和Chrome)上,它会重新加载页面,首先,这需要时间,而且很烦人。然后Chrome会向下滚动,但Safari不会,这意味着用户会回到顶部。实际上,这种行为似乎不太一致。
这仅仅是浏览器做出的决定吗?它还可以在屏幕锁定后重新加载页面,然后再解锁。(同样,我是在iPhone上尝试的。)或者它是关于我的html/header/js可以做什么?
我想我可以使用HTML缓存,然后,在页面本身,跟踪用户滚动了多远。然后,当页面从缓存中重新加载时,我可以使它向下滚动到之前的位置。这真的是正确的方法吗?
看起来www.amazon.com已经让它工作了,所以一定有一些解决方案
你可以使用javascript来避免"reload",但是其他一些原因可能会使页面在手机上重新加载。
我建议不要试图避免重新加载,而是使用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
,请尝试(cookie如localStorage):
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;
}
我不相信你能"阻止用户点击浏览器后退按钮时页面被重新加载"(正如你的问题开始)。用户应该对浏览器的导航位置有最终决定权。
您可以将一个函数绑定到beforeunload
事件,并且在该函数中您可以放置一个警报,该警报将延迟用户按下back
或reload
,以便他们有机会阅读自定义消息并选择继续或取消。
这是在jQuery中:
$(window).bind('beforeunload', function() {
return 'Are you sure?';
});
https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload 如果你更关心的是重新加载前一个页面的缓存和滚动版本,而不是执行一个完全新的重新加载,这听起来更像是你的内容服务器和/或用户的浏览器上的设置。
我知道我的注册商/主机我可以登录并访问GUI缓存控制,或者我可以在我的.htaccess
文件中上传自定义缓存指令。据我所知,这些将控制是否允许用户从服务器缓存文件,以及缓存多长时间。用户的web浏览器也应该设置每次是缓存文件还是加载新鲜。
- 当用户滚动到页面的某个部分时,如何触发关键帧
- 下一个/上一个锚链接,如何在用户滚动时更新下一个/上一个链接
- 在用户滚动时加载单个页面网站的不同部分
- 当用户滚动到底部时,Ajax函数会多次触发
- jQuery查找最大用户滚动值
- 每当用户滚动到Chart.js时,它的大小就会翻倍
- 通过用户滚动量进行检测
- 当用户滚动到 iframe 或 iframe 位于视口中时,从 iframe 调用 js 函数
- 如何在用户滚动到页面底部时仅加载一次数据
- 如何在用户滚动页面时缓慢移动标题
- 如何确保用户滚动并阅读使用条款
- JavaScript:当用户滚动时对滚动进行动画处理
- 在用户滚动时创建 JavaScript 弹出框
- 当用户滚动到特定元素的末尾时,如何运行jQuery代码
- JS:防止用户滚动的默认?或者强制 GSAP 在用户上方滚动
- 为什么在用户滚动后,设置超时不会在触摸端处理程序中触发(iOS Safari)
- Don't加载图像,直到用户滚动到那里(可能)
- 当用户滚动到页面底部时显示页脚
- 如何在用户滚动时更新谷歌地图中心
- 当用户滚动jquery时,停止ScrollTop功能