mescroll.js简单的上拉加载、下拉刷新插件,带完整注释
声明:本插件模仿自mescroll.js,随手所作,仅以注释提供思路,只实现了部分效果,且没有考虑兼容,有兴趣的朋友随意一看。api大家可参考mescroll.js API汇总一文。
demo:点我下载实例
插件全部js原代码如下:
//上拉加载插件
Mescroll = function(){
var that = this;
that.mescrollCallBack;//回调函数,可拆分为上拉加载回调函数、下拉刷新回调函数,此处上拉加载、下拉刷新调用同一个回调函数
that.page = {//列表信息的页码信息,包括每页条数、页码
num: 1,//初始页码,默认列表页初始页码为1。第一种访问方式,页码变化,列表条数不变
size: 10,//每页显示条数,默认列表页每页显示10条
trueNum: "",//另一种页码计算方式,此计算方式中,页码不变,变化的只有列表页条数,此变量用于记录页码,初始值为page.num。第二种访问方式,页码不变,列表条数变化
trueSize: "",//列表页条数,初始值为page.size
};
that.emptyId = "ListUl";//列表信息为空时,显示列表为空的信息的div的id值,默认为ListUl
that.empty = {//列表信息为空时,显示列表为空的信息
icon: "../../images/mescroll-empty.png",//默认图标地址
tip: "暂无相关数据~", //提示
btntext: "返回上一页", //按钮,默认""
btnHref: "javascript:history.go(-1)"//点击按钮的回调,默认null
};
that.noMoreSize = 5;//如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(譬如只有一条数据),显示无更多数据会不好看;默认设置为5
that.noMore = {//列表无更多信息时,显示的提示
tip: "-- END --"//提示
};
that.toTop = {//配置回到顶部按钮
src: "../../images/mescroll-totop.png",//默认图标
offset: window.innerHeight,//默认滚出设备屏幕高度时显示
time: 1000//回到顶部的时间,默认1秒钟
};
that.upLoadHeight = 60;//距离底部60px时,即触发上拉加载,不必完全拉到底部
that.upLoad = true;//是否启用上拉加载,默认启用
that.downLoad = true;//是否启用下拉刷新,默认启用
that.scrollToptimer;//定时循环回到顶部的定时器 var firstLoadStatu = true;//是否第一次执行此函数
var scrollUpLoad = true;//滚动条触发上拉加载,一段范围内,只允许触发一次
var oldScrollHeight = 0;//存储上一个滚轮的位置,用以判断滚轮是向上滚动、还是向下滚动,初始值为0
var pageY;//当前页面高度
var sheBeiY = window.innerHeight;//设备屏幕高度
var scrollY;//当前滚动条的位置
var startY;//起点Y轴位置
var endY;//终点Y轴位置 that.firstLoad = function(){//初始化此插件时,执行回调函数
if(firstLoadStatu){
that.page.trueNum = that.page.num;//第二种访问方式,为页码赋值
that.page.trueSize = that.page.size;//为列表页条数赋值 that.mescrollCallBack(that.page);//若是第一次执行此函数,直接执行回调函数
firstLoadStatu = false;//实例化此插件后,只能执行一次此函数
};
}; that.endMescroll = function(listNum){//传入列表信息条数,判断显示的内容
document.getElementById(that.emptyId).innerHTML="";//执行此函数前,先把之前添加的参数清空
if(listNum == 0){//若列表信息为空时,显示列表为空的信息
document.getElementById(that.emptyId).innerHTML="<div class=\"mescroll_empty\">"
+"<img class=\"mescroll_empty_icon\" src=\""+that.empty.icon+"\">"
+"<p class=\"mescroll_empty_tip\">"+that.empty.tip+"~</p>"
+"<a class=\"mescroll_empty_btn\" href=\""+that.empty.btnHref+"\">"+that.empty.btntext+"</a>"
+"</div>";
}else if(that.noMoreSize<listNum && listNum<that.page.trueSize){//列表无更多信息时,显示提示
document.getElementById(that.emptyId).innerHTML="<h4 class=\"mescroll_end\">"+that.noMore.tip+"</h4>";
}
if(listNum < that.page.trueSize){
that.upLoad = false;//禁止上拉加载
}else{
that.upLoad = true;//启用上拉加载
}
}; document.addEventListener("touchstart",function(ev){//手指在屏幕上的起始位置
startY = ev.touches[0].pageY;//获取起点Y轴位置
},false);
document.addEventListener("touchend",function(ev){//手指在屏幕上的结束位置
pageY = document.body.scrollHeight;//获取当前页面高度
scrollY = window.scrollY;//获取当前滚动条的位置
endY = ev.changedTouches[0].pageY;//获取终点Y轴位置 //上拉加载
if(pageY-sheBeiY < 0 || (pageY-sheBeiY-scrollY-that.upLoadHeight<0)){//若 当前页面高度 - 设备屏幕高度 < 0 ,即屏幕不满一页,需要拉动的距离设置为0
var upDistanceY = 0;
}else{
var upDistanceY = pageY - sheBeiY - scrollY -that.upLoadHeight;//当前页面高度-设备屏幕高度-当前滚动条的位置=需要拉动的距离,60是指距离底部60px,即触发下拉加载,不必完全拉到底部
}
var upY = startY - endY;//上拉时,向上拉动的距离
if(upY > upDistanceY){//上拉加载
if(that.scrollToptimer){//若正处于回到顶部的过程中,立即停止回到顶部,清除掉定时器
clearInterval(that.scrollToptimer);
}
if(that.upLoad){//启用了上拉加载
that.page.num += 1;//页码数+1
that.page.trueSize = that.page.num*that.page.size;//计算列表页条数
that.mescrollCallBack(that.page);//执行回调函数
}
}; //下拉刷新
var dowmY = endY - startY;//下拉刷新时,向下拉动的距离
if(dowmY>scrollY){//下拉刷新
if(that.downLoad){//启用了下拉刷新
that.page.num = that.page.trueNum;//页码数还原为初始页码
that.page.trueSize = that.page.size;//列表页条数还原为初始列表页条数
that.mescrollCallBack(that.page);//执行回调函数
};
};
},false);
//监听滚动条
document.addEventListener("scroll",function(ev){
pageY = document.body.scrollHeight;//获取当前页面高度
scrollY = window.scrollY;//获取当前滚动条的位置
if(scrollY>oldScrollHeight){//如果当前位置>上一个滚轮的位置,即为向下滚动,即上拉
if(that.scrollToptimer){//若正处于回到顶部的过程中,立即停止回到顶部,清除掉定时器
clearInterval(that.scrollToptimer);
}
}
oldScrollHeight = scrollY;
//console.log("当前滚动条的位置:"+scrollY);
//上拉加载
if(pageY - scrollY - sheBeiY < that.upLoadHeight){//当前页面高度 - 若 当前滚动条的位置 - 设备屏幕高度 < 60 ,即触发上拉加载
if(scrollUpLoad){//是否允许滚动条触发上拉加载
scrollUpLoad = false;//滚动条触发上拉加载后,禁止滚动条触发上拉加载,一段范围内,只允许触发一次
if(that.upLoad){//启用了上拉加载
that.page.num += 1;//页码数+1
that.page.trueSize = that.page.num*that.page.size;//计算列表页条数
that.mescrollCallBack(that.page);//执行回调函数
}
}
}else{
scrollUpLoad = true;//滚动条无法触发上拉加载后,允许滚动条触发上拉加载
} if(scrollY>that.toTop.offset){//若滚动条位置 > 设置的高度,新增一个回到顶部的img元素
if(document.getElementsByClassName("mescroll_toTop_img").length==0){//若没有回到顶部的img,添加它
var toTopImg = document.createElement("img");//创建一个img元素
toTopImg.className="mescroll_toTop_img";//为该img元素添加一个class名
toTopImg.src=that.toTop.src;//为该img元素的src属性赋值
document.getElementById(that.emptyId).before(toTopImg);//在指定的dom元素前添加该子元素img document.getElementsByClassName("mescroll_toTop_img")[0].addEventListener("click",function(ev){
//document.documentElement.scrollTop = 0; var toTop = document.body.scrollTop || document.documentElement.scrollTop;//获取初始时距顶部距离的值
var toTopHeight = toTop * 20 * 3 / that.toTop.time;//初始时距顶部距离的值 * 定时器的时间 / 回到顶部的时间 = 单位时间内,往上滑的距离,多乘了一个3,是因为测试时觉得太慢
that.scrollToptimer = setInterval(function (){//定时循环回到顶部,speed值越小,动画效果越慢
var currentToTop = document.body.scrollTop || document.documentElement.scrollTop;//获取当前距顶部距离的值
if (document.body.scrollTop!=0){
document.body.scrollTop -= toTopHeight;
}else{
document.documentElement.scrollTop -= toTopHeight;
}
if(currentToTop == 0){
clearInterval(that.scrollToptimer);
}
},20);
},false);
}
}else{//若滚动条位置 < 设置的高度,移除该回到顶部的img元素
if(document.getElementsByClassName("mescroll_toTop_img").length==1){//若有回到顶部的img,移除它
var toTopImg=document.getElementsByClassName("mescroll_toTop_img")[0];//获取该回到顶部的img元素
toTopImg.parentNode.removeChild(toTopImg);//移除该回到顶部的img元素
}
}
},false);
};
mescroll.js简单的上拉加载、下拉刷新插件,带完整注释的更多相关文章
- 微信小程序上拉加载下拉刷新
微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ...
- Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记
之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...
- 上拉加载下拉刷新控件WaterRefreshLoadMoreView
上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...
- RecyclerView 上拉加载下拉刷新
RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...
- APICloud上啦加载下拉刷新模块
apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...
- mui scroll和上拉加载/下拉刷新
mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/* */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...
- 移动端上拉加载下拉刷新插件-mescroll.js插件
官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...
- js上拉加载下拉刷新
写在前边: 工作需要,使用ajax在原来的列表下边使用ajax请求后台数据,拼接在列表最下边,在github转了好久,发现了一个bug极多的js刷新插件,尝试了一个下午,就在快放弃的时候,发现下边有留 ...
- zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- SwipeRefreshLayout实现上拉加载下拉刷新
package com.example.swiperefreshlayoutdemo; import java.util.ArrayList;import java.util.HashMap; imp ...
随机推荐
- IDEA的Debug模式灰色无法运行
1. 检查本地环境是否配置得当,进入项目右键看项目是否可以正常debug运行 2. 如果不可运行,那么选择File--Project Structrue 3. 修改Src文件,如图然后就可以正常使用 ...
- 为data中的某一个对象添加一个属性不起作用——this.$set的正确使用
this.$set(obj, key, value) 我们在项目开发的过程中,经常会遇到这种情况:为data中的某一个对象添加一个属性 <template> <div class=& ...
- hadoop 配置信息记录
ssh-keygen -t rsa -P '' 192.168.157.148 hadoop01192.168.157.149 hadoop02 mkdir /root/hadoopmk ...
- php Allowed memory size of 134217728 bytes exhausted
报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in ...
- AcWing 487. 金明的预算方案
#include <cstring> #include <iostream> #include <algorithm> #include <vector> ...
- 安装python3并新建python3的虚拟环境
安装依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel -y 下载P ...
- Spring解决bean之间的循环依赖
转自链接:https://blog.csdn.net/lyc_liyanchao/article/details/83099675通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的 ...
- python3 读取串口数据
python3 读取串口数据 demo import serial import time ser = serial.Serial("COM3",115200,timeout = ...
- HTML列表,表格与媒体元素
一.无序列表 <ul> <li>无序列表</li> <li>有序列表</li> <li>自定义列表</li> < ...
- 我写的UI自动化框架
---------------------------------------------------------------------------------------------------- ...