当前位置:首页 > 短网址资讯 > 正文内容

FT12短网址教你如何记录阅读进度

www.ft12.com7年前 (2017-08-01)短网址资讯1719

大家是否会遇到这些需求:

  1. 如果有三个tab页签,从某个tab页签下跳出去打开新页后,点击浏览器后退键,能回到跳出去的相应tab页签下

  2. 希望像原生app那样在wap端的列表页跳到详情页,点击浏览器后退键,能回到跳出去的列表处

  3. 如果有上拉加载更多,希望还是能回到相应页码处

  4. 能多端同步阅读进度么?高并发的短网址服务如何能保证性能?

下面我们就从易到难,一个一个的来解决上面的问题:

场景一

如果有三个tab页签,从某个tab页签下跳出去打开新页后,点击浏览器后退键,能回到跳出去的相应tab页签下

解决思路

  1. 切换页签是记录是哪个页签

$.each(me.$elements.$navBarItems, function(index, item) {     var navbaritemHM = me.createHammer(item);     navbaritemHM.on('tap', function (e) {         var tabtype = $(e.currentTarget).attr('data-tabtype');         // 页签切换打点         me.fire('tabChangeClick', {             id: me.options.entUuid,             tabtype: tabtype         });         me._pushHistoryState(tabtype);         me._hideLoadmoreBtnWrap();         me._handleNavbarClick(e, tabtype);     }); });

注意上面的me._pushHistoryState(tabtype)的方法;负责记录tabtype? 那应该记录在哪儿呢?

首先,我尝试了

history.replaceState(null, '', newURL);

但是发现浏览器goback时,会不断的pushstate,一直退出不去了,所以不能这么做

那就只能放到全局变量中了,在跳出时再replaceState(null, '', newURL);

_pushHistoryState: function (tabtype) {     var hash = location.hash;     var originURL = location.href;     if (hash) {         var hrefSplit = location.href.split('#')         originURL = hrefSplit[0];     }     var newURL= util.updateUrlQuery('type', tabtype, originURL);     if (hash) {         newURL += hash;     }     // 添加页签类型     // history.replaceState(null, '', newURL);     globalData.set({         lastURL: newURL     }); }

上面的代码中globalData就是个全局变量

代码如下:

var Gd = {     set: function () {         var args = arguments;         if (args.length === 1 && typeof args[0] === 'object') {             $.extend(this, args[0]);         }         else if (args.legnth === 2 &&  typeof args[0] === 'string') {             this[args[0]] = args[1];         }     } }; module.exports = Gd;

然后跳出去的时候history.replaceState

// 列表跳转打点     me.on('jumpClick', function (opt) {     // 页面跳转前修改state     var lastURL = globalData.lastURL;     var hash = globalData.hash;     if (!lastURL) {         lastURL = location.href;     }     if (hash) {         var oHash = location.hash;         if (oHash) {             lastURL = lastURL.split('#')[0];         }         lastURL = lastURL + '#' + hash;     }     history.replaceState && history.replaceState(null, '', lastURL); });

等goback列表页时,会从url上取tab类,如果有就覆盖传入的tabtype

var main = function (options) {     // 页签分类     var tabs = JSON.parse(options.tab) || [];     // url的query     var type = util.getQueryValue(location.href, 'type');     if (type) {         // 适配乱输入type         type = ['word', 'txt', 'vision'].indexOf(type) === -1 ? null : type;     }     if (tabs.length > 0) {         if (!type) {// 第一个页签             type = tabs[0].icon;         }     }        // 主view     var view = new View({         el: options.el,         pageWrap: options.pageWrap,         Mediator: Mediator,         entUuid: options.entUuid,         tab: options.tab,         icon: type     });

需要注意的地方是,适配下用户乱输入query

 if (type) {         // 适配乱输入type         type = ['word', 'txt', 'vision'].indexOf(type) === -1 ? null : type; }

场景二

希望像原生app那样在wap端的列表页跳到详情页,点击浏览器后退键,能回到跳出去的列表处

解决思路

如果列表有分类,那很简单可以套用上面的方案,页面滚动时,记录滚动到哪个分类下,存到globalData中,跳出去时history.replaceState

 // 页面跳转前修改state     var lastURL = globalData.lastURL;     var hash = globalData.hash;     if (!lastURL) {         lastURL = location.href;     }     if (hash) {         var oHash = location.hash;         if (oHash) {             lastURL = lastURL.split('#')[0];         }         lastURL = lastURL + '#' + hash;     }     history.replaceState && history.replaceState(null, '', lastURL);

思路就是页签类型用query记录,位置用hash来记录

页面加载完就可以根据hash跳转到相应的位置

// 根据锚点页面滚动到相应的路径分类下     _scrollToPath: function() {         var me = this;         var hash = location.hash;         if (hash) {             var anchor = hash.split('#')[1];             var pathWrap = me.$elements.$allPathWrap.filter(function(index) {                 if ($(this).attr('data-pathtype') === anchor) {                     return true;                 }             });             $(window).scrollTop(pathWrap.offset().top);         }     },

如果没有分类,那就只能记录页面滚动距离,存到localstorage里面,后退回来,取出来距离跳转相应位置

场景三

如果有上拉加载更多,希望还是能回到相应页码处

解决思路

如果页面只显示一页,上拉加载更多,下拉刷新,这个问题也很好解决,存到localstorage里面,后退回来,重新加载数据

如果是上拉加载更多,一直累加dom,这个只能是缓存之前的数据到前端了,木有别的办法了

场景四

能多端同步打开短网址,速度一致吗?

这个问题只能是存库了,页面滚动时候,存到localstorage的同时,发后端请求记录到数据库了

总结

关于阅读进度的记录,除非就是

  • 合理使用url query和hash记录进度

  • history.replaceState记录跳出去的页面url

  • localstorage记录页码,甚至是数据

  • 页面滚动时,实时记录阅读进度并存到短网址数据库

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_370.html

分享给朋友:

相关文章

FT12短网址:从零开始搭建超大型机票交易平台

FT12短网址:从零开始搭建超大型机票交易平台

FT12短网址资讯:从无到有构建一个大型交易平台对工程师来说是很有应战的事情。在构建过程中会碰见各种技能或许非技能的问题,作为一个工程师又该怎么处理这些问题,这是所有工程师都需求思考的问题。知名旅行网站担任交易平台技能的小雄哥总结了自己的亲...

看了那么多SEO教程,为何你还是搞不定排名?

看了那么多SEO教程,为何你还是搞不定排名?

前言:本文独家原创首发卢松松博客,转载请保留作者联系方式与原文出处!前些天和一个朋友在讨论互联网营销的时候偶然提到了SEO优化,朋友说去年买了一套SEO教程自学,到目前为止,差不多将近一年了,排名还是非常的不好(几乎没有排名)。我问他既然看...

MySQL索引原理及慢查询优化

MySQL索引原理及慢查询优化

MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQ...

一条徐沪生比papi酱更有价值,短网址真的比直播更适合内容创业者吗?

一条徐沪生比papi酱更有价值,短网址真的比直播更适合内容创业者吗?

[ ft12短网址导读 ] 与papi酱的过气构成鲜明对比的是,短视频职业却越来越火,被称为直播之后的又一个内容创业风口,新老互联网巨头都争着往里面砸钱。用户为什么俄然对短视频产生了如此激烈的需求?真实能够依靠的盈利模式又是什么?...

90后再次被盯上,两大行同时入局校园贷市场

90后再次被盯上,两大行同时入局校园贷市场

[ ft12短网址导读 ] 在2017年金融体系“去杠杆、控风险”的大背景下,几乎所有的风险领域都在收缩,此时国有大行布局校园贷,只能有两个解释:一是在大行看来,校园贷属于低风险业务;另外是担当社会责任,配合金融治理“堵偏门、开正...

短网址服务的设计及实现的所有关键特性

短网址服务的设计及实现的所有关键特性

01 摘要本文主要介绍了短网址营销方向,对外对内传播短链接,短网址的最优配置,不同短网址数据库之间的快速读写操作——短网址通用发放平台的设计及实现,以方便使用和接入,降低开发成本,集中管理。02. 背景随着短网址和其他第三方联合运营的不断推...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。