一个适用于单页应用,返回原始滚动条位置的demo

如题,最近做一个项目时,由于页面太长,跳转后在返回又回到初始位置,不利于用户体验,需要每次返回到用户离开该页面是的位置。由于是移动端项目,使用了移动端的套ui框架framework7,本身框架的机制是支持返回原始位置的,但是由于涉及到权限及安全等方面的问题,没有采用framework7的路由机制,所以这个就必须自己写了。

我的想法是给每个页面一个data-page属性用于保存这个页面的名字,然后每次在页面卸载即离开的时候获取滚动条的位置,然后将页面的名称做为属性名保存起来,让后将其push到一个数组中,保存到cookie中,到页面再次加载时,将其获取到,然后将页面的滚动条位置调整到保存的位置,这样就可以实现了,当然其中有很多细节的东西,在这里就不做赘述了,下面直接贴上代码(欢迎大神点评)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <title>Title</title>
    <style>
        div {
            width:300px;
            height:300px;
            background:greenyellow;
            margin:200px auto;
            overflow-y: scroll;
        }
        #link{
            color: #fff;

        }
    </style>
</head>
<body>
<div id="box" data-page="index" class="pages">
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <a href="后退刷新测试1.html" id="link">点击到第一个页面</a>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
    <p>这是测试文字</p>
</div>
<script type="text/javascript" src="originBack.js"></script>
</body>
</html>

这里我是模拟了framework7的页面结构,没有用来浏览器的滚动条,用一个div设置overflow:scroll来模拟页面的滚动条。在需要应用的页面直接引入js文件即可

/**
 * Created by tianjin on 2017/7/18.
 */
var pages = document.getElementsByClassName(‘pages‘)[0];//获取需滚动的页面结构
var pageName = pages.getAttribute(‘data-page‘);//获取页面的data-page属性,该属性是页面的名称,通过该属性判断打开的是那个页面,从而获取其scrollTOp的值
/**
 * 初始化页面,看cookie中是否保存有scrollTop属性
 * 如果有,则不做任何处理
 * 如果没有,则添加一个scrollTop属性到cookie并赋值空数字
 * */
!function () {//自执行的页面初始化方程
    var aCookie = document.cookie.split("; ");//获取cookie并以‘;’为标识将其转化为数组
    for (var i = 0;i < aCookie.length;i++) {//循环数组中的每一项
        var aCrumb = aCookie[i].split("=");//将每一项以等号为分割标识转化成数组
        if (‘scrollTop‘ == aCrumb[0]) {//判断数组的第一项,即cookie的属性名是否是‘scrollTop‘,即判断cookie中是否有scrollTop属性
            return false//如果有,则不做任何处理,结束程序
        }
    }//如果判断完成之后没有scrollTop属性
    var arr = [];//则初始化一个空数组
    var arrCookie = JSON.stringify(arr);//将该书组转化成字符串格式,因为cookie中展示是以字符串形式的
    document.cookie ="scrollTop=" + arrCookie//将该字符串以属性名为scrollTop的存入cookie中
}();
/**
 * 定义设置cookie的方法SetCookie
 * 用来在每次页面跳转的时候重置cookie的scrollTop属性
 * */
function SetCookie(sName,sValue) {//设置cookie,sName为cookie的属性值,即为scrollTop,sValue为cookie的scrollTop的值
    document.cookie = sName + "=" + sValue//设置cookie
}
/**
 * 定义获取cookie的方法GetCookie
 * 用来在页面加载是获取cookie中的scrollTop的值并获得对应页面离开时保存的scrollTop值
 * 然后将页面的scrollTop设置成该值
 * */
function GetCookie(sName) {//获取cookie,sName为cookie的属性值,即为scrollTop,
    var aCookie = document.cookie.split("; ");//获取cookie并以‘;’为标识将其转化为数组
    for (var i = 0;i < aCookie.length;i++) {//循环数组中的每一项
        var aCrumb = aCookie[i].split("=");//将每一项以等号为分割标识转化成数组
        if (sName == aCrumb[0]) {//判断数组的第一项,即cookie的属性名是否等于传入的属性名scrollTop
            var scrollTopObj = JSON.parse(aCrumb[1]);//如果是,则将该cookie转换成JSON格式
            return scrollTopObj//并将该JSON格式的数组返回
        }
    }
    return null//如果不是scrollTop,则返回一个空对象
}
/**
 * 定义页面加载执行的函数,当页面加载是执行该函数,并设置该页面的scrollTop到离开该页面是的位置
 * */
function fnLoad() {
    var k = null;//定义一个k变量
    var scrollTopArray = GetCookie(‘scrollTop‘);//执行GetCookie函数,并将其返回值保存在scrollTopArray中
    for (var i = 0; i<scrollTopArray.length ; i++){//循环scrollTopArray数组
        for (k in scrollTopArray[i]){//for in scrollTopArray中的没一个对象
            if (k == pageName){//判断对象的名称是否等于当前页面的data-page属性,即获取当前页面scrollTop的值
                pages.scrollTop = scrollTopArray[i][k];//如果相等,则将当前页面中的scrollTop设置成cookie中保存的scrollTop
                return false//并结束程序
            }
        }
    }
}
/**
 * 定义页面卸载,即离开该页面时的方法
 * 当离开页面时,要将该页面当前的scrollTop保存在cookie中
 * */
function fnUnload() {
    var flag = false;//定义一个开关,作为当前cookie中是否保存该页面的scrollTop值作为判断
    var scrollT = pages.scrollTop;//获取当前页面的scrollTop值
    var obj = {};//创建一个对象用于保存当前对象的scrollTop的值
    obj[pageName] = scrollT;//在上面对象的pageName属性保存当前页面的scrollTop的值
    var cookieObj = document.cookie.split("; ");//获取cookie并以‘;’为标识将其转化为数组
    for (var i = 0;i < cookieObj.length;i++) {//循环数组中的每一项
        var aCrumb = cookieObj[i].split("=");//将每一项以等号为分割标识转化成数组
        if (aCrumb[0] == ‘scrollTop‘) {//判断数组的第一项,即cookie的属性名是否等于scrollTop
            var newArr = JSON.parse(aCrumb[1]);//如果相等,则将该属性的值解析成JSON格式并保存在一个新数组newArr中
            if (newArr.length == 0){//判断该数组是否为空数组
                newArr.push(obj);//如过为空,则将该页面的scrollTop对象添加到数组中,并保存到cookie中
            }else {//如果不相等
                for (var j = 0 ;j<newArr.length ; j++){//如果不相等则循环该新数组
                    for ( t in newArr[j]){//for in 数组中的对象
                        if (t == pageName){//比较是否有属性名和该页面的pageName相等,如果有,则说明cookie中保存有该页面的的scrollTop的值
                            newArr[j][t] = scrollT;//将原始的页面的scrollTop的值替代成当前的scrollTop的值
                            flag = true//然后将开关的设置成true,关闭下方的将页面的scrollTop对象重新添加到cookie中去
                        }
                    }
                }
                if (!flag){//如过flag为false,则说明cookie中没有该页面的scrollTop属性,则将该页面的scrollTop属性添加到cookie中
                    if (newArr.length>30){//由于cookie的保存大小有限,限制保存30条
                        newArr.shift();//如果cookie中保存的数量大于30天,将该数组的第一条删除
                        newArr.push(obj)//然后在添加该页面的scrollTop对象到数组中
                    }else {
                        newArr.push(obj)//如果没有到30条,则直接添加到数组中然后保存到cookie中
                    }
                }
            }
            var arrCookie = JSON.stringify(newArr);//将newArr转化成字符串格式,因为cookie保存的是字符串格式
            SetCookie(‘scrollTop‘,arrCookie);//执行SetCookie方法,将数组保存到cookie中
        }
    }
}
window.onload = function () {
    fnLoad()//在页面加载后执行fnLoad
};
window.onunload = function () {
    fnUnload()//在页面卸载前执行fnLoad
};
时间: 2024-10-28 05:22:33

一个适用于单页应用,返回原始滚动条位置的demo的相关文章

vue 返回记住滚动条位置

vue 项目返回上一页,滚动到离开时的位置,网上能找到不少方法,以下尝试一种. 例如,首页有个列表,点击列表进入二级页面,返回的时候保持在原位置.首先在首页的视图外套上 keep-alive , include 表示只针对 name = 'Home' 的组件进行缓存 <keep-alive include='Home'> <router-view/> </keep-alive> 然后,在首页的 Home 组件内,使用  beforeRouteLeave  ,组件内的路由

单页应用Scrat实践

单页应用Scrat实践 1.开始 随着前端工程化深入研究,前端工程师现在碉堡了,甚至搞了个自己的前端网站http://div.io/需要邀请码才能注册,不过里面的技术确实牛.距离顶级的前端架构,目前博主应该是far away,幸运的是现在有很多前端大神积极的分享自己的经验,比如百度这位https://github.com/fouber/blog/issues/4. 将iframe项目使用多页HTML与FIS重构以后,前端已经得到了极大的优化,然而多页HTML带来的状态丢失(登录信息,菜单信息),

前端单页应用以及状态保持的探索

工作中对单页应用和状态保持有些研究希望和大家分享一下: 我们主要探讨两个内容:单页应用.状态保持 一.单页应用 先说第一个:单页应用,单页应用就是指应用所有的交互都是在一个页面中进行的,当然实现方式有多种: 1.页面中放多个div对应多个虚拟页面,通过显示隐藏来切换 优点:切换速度快,状态可保持 缺点:所有的虚拟页面都放到一个真实页面里,先不说浏览器能不能受得了,开发时可能遇到各种id,class冲突,事件冲突等等,少量页面估计还行. 2.通过类似android的activity生命周期来管理虚

中国互联网黑市分析:百度竞价单页产业链

外行看热闹,内行看门道,中国互联网圈子比较浮躁,而发出各种声音的外行又较多.又所谓三人成虎,大家说多了,好像默认的也就是这样了,这导致了有很多约定俗成的被人广泛认同的观点.例如百度在移动端落伍了,百度是一个技术公司,百度是一个媒体公司等等.而事实真的是这样么? 百度一直饱受争议,但是很少有人深入下去了解百度与他的中小广告主客户们构建的生态环境.大家总是拿百度和Google相比,看的是如果击败Google,如何和360PK等等,但是这些都是表象.如果不去深入的看到这些公司的盈利和生态环境,仅仅在表

移动端单页视图库,适用于制作移动Web touchbox

ouchBox 原文:https://github.com/maxzhang/touchbox 移动端单页视图库,适用于制作移动专题 DEMO http://jsbin.com/vatuma/latest 手机扫描下面二维码查看例子: 使用方法 首先,页面必须是下面的结构 <html> // ... <body> <div id="touchBoxCt"> <div> // 子视图1 </div> <div> //

vue入门(三)----使用vue-cli搭建一个单页富应用

上面两节我们说了vue的一些概念,其实说的知识一点基础,这部分知识我觉得更希望大家到官网进行学习,因为在这里说的太多我觉得也只是对官网的照搬照抄而已.今天我们来学习一下vue-cli的一些基础知识,并且用vue-cli来搭建一个单页富应用.那么我们首先介绍一下什么是vue-cli? 首先要学习vue-cli,我觉得我们需要知道什么是cli吧!首先回到"原始"前端,什么是前端?无非就是html,css,js,虽然定义有些粗略.但是随着前端的不断发展,前端的内容越来越多,也越来越丰富.前端

bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

转自:http://www.cnblogs.com/jesse2013/p/a-sample-of-single-page-applicaton.html 也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序一样.特别是在当今的移动时代,单页程序如果放在移动设备上去浏览就能够拥有像native app一样的体验,也许我们web开发者们应该期待这种技术

jQuery 随滚动条滚动效果 (适用于内容页长文章)

直接入题! 当内容页比较长的时候,网站右侧一直是空白,不如放点有用的东西给用户看,最好不要放广告,因为那样很邪恶,你懂的. 好吧,昨天写了这个东西,jQuery滚动随动区块,代码如下: //侧栏随动 var rollStart = $('.feed-mail'), //滚动到此区块的时候开始随动 rollOut = $('.cookie-list'); //隐藏rollStart之后的区块 rollStart.before('<div class="da_rollbox">

simple-spa 一个简单的单页应用实例

上两篇文章说过要写一个简单的单页应用例子的, 迟迟没有兑诺, 实在有愧 哈哈.这篇写给小白用户哈. 正好趁今天风和日丽,事情不多, 把从项目里的代码扣取了一下, 整理了一个简单的例子.因为我们生产项目用到es6 还有构建工具,为了让例子足够简单和原生,除了一个zepto,连require都是我之前写的文章里的实现的,很简单70行代码. 事例地址 github:https://github.com/skyweaver213/simple-spa demo: https://skyweaver213