javascript - 用户停止阅读时获取点
问题描述
用户 A 上了我的在线杂志。她开始阅读一篇很长的文章,然后在文章中间她决定停下来。她关闭了浏览器,几个小时后才回到该站点。现在,当她再次打开同一篇文章时,我希望页面从她离开的地方开始。
Imaging User A其实是一个注册用户,我该如何实现呢?更具体地说,我想存储屏幕上第一个可见行的第一个字符的字符号(作为 int )(基本上是左上角)。
编辑:为了进一步澄清,您可以认为 Instapaper 或 Pocket 等应用程序面临类似问题(移动应用程序和网络应用程序)。
解决方案
更新的答案
我不确定如何做到这一点。我建议存储使用localStorage
.
您可以获得文档在关闭时滚动了多远以及文档的尺寸,如果重新加载时文档的宽度相同,那么您可以滚动到同一点。width * scrollTop
如果不是,您可以通过计算读取的体积并将其除以当前宽度来估计用户停止的点。
这是一个伪代码,可帮助您理解该概念:
if oldWidth == currentWidth
set scroll = oldScroll
else
set scroll = oldScroll * oldWidth / currentWidth
这是上述伪代码的 JavaScript 示例,但首先需要注意一些事项:
localStorage
不允许在片段上使用,因此当前代码在此处不起作用,如果要测试,则必须将其复制到其他地方- 该
leavePage()
方法return null
的末尾有一个语句,这是因为某些浏览器不会运行没有返回语句的函数beforeunload
if (document.readyState === "complete") enterPage();
else addEventListener("load", enterPage);
addEventListener("beforeunload", leavePage);
function enterPage() {
var magazineDom = document.querySelector("#magazine");
if (magazineDom instanceof HTMLElement) {
magazineDom.textContent = "Lorem Ipsum".repeat(800);
//onRender();
}
}
function onRender() {
var magazineContainerDom = document.querySelector("#magazine-container");
var magazineDom = document.querySelector("#magazine");
if (magazineContainerDom instanceof HTMLElement && magazineDom instanceof HTMLElement) {
var info = getMagazineInfo(magazineDom.getAttribute("magazine"));
if (info) {
var currentWidth = magazineDom.scrollWidth;
if (currentWidth == info.width) magazineContainerDom.scrollTop = info.top;
else magazineContainerDom.scrollTop = info.top * info.width / currentWidth;
}
}
}
function leavePage() {
var magazineContainerDom = document.querySelector("#magazine-container");
var magazineDom = document.querySelector("#magazine");
if (magazineContainerDom instanceof HTMLElement && magazineDom instanceof HTMLElement) {
setMagazineInfo(magazineDom.getAttribute("magazine"), magazineContainerDom.scrollTop, magazineDom.scrollWidth);
}
return null;
}
function getMagazineInfo(name) {
return JSON.parse(localStorage.magazines || "{}")[name];
}
function setMagazineInfo(name, top, width) {
var magazines = JSON.parse(localStorage.magazines || "{}");
magazines[name] = {
top: top,
width: width
};
localStorage.magazines = JSON.stringify(magazines);
}
body {
position: fixed;
bottom: 0;
right: 0;
left: 0;
top: 0;
}
#magazine-container {
overflow-y: auto;
height: 100%;
width: 100%;
}
#magazine {
max-width: 500px;
margin: auto;
}
<body>
<div id="magazine-container">
<div id="magazine" magazine="First Document">
</div>
</div>
</body>
推荐阅读
- reactjs - 获取与窗口相关的元素顶部偏移量
- r - 有什么操作可以将一个栅格裁剪到另一个栅格的范围?
- python-3.x - sed 给出未知命令错误:字符 1:未知命令:`''
- python - 那是我的项目。我看到了运行时错误“写操作超时”。我想将摘要代码连接到流式应用程序(本地运行时)
- java - 使用 java stream() 在服务器端 API 中计数是否更好,然后在 spring jpa 中重复使用计数查询调用
- joomla - 如何通过订单 ID 在我的自定义组件视图中获取 j2store 订单详细信息?
- javascript - 当收集有大数据 ~ 6K 文档时,Firestore 创建查询需要很长时间
- elasticsearch - 无法在 ECK 中重命名节点集
- python - map_partitions 数据帧的 Dask 元数据
- html - 更新 ASP.NET Web API 项目中插入的记录