声明:本插件模仿自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. 微信小程序上拉加载下拉刷新

    微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ...

  2. Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记

    之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...

  3. 上拉加载下拉刷新控件WaterRefreshLoadMoreView

    上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...

  4. RecyclerView 上拉加载下拉刷新

    RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...

  5. APICloud上啦加载下拉刷新模块

    apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...

  6. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  7. 移动端上拉加载下拉刷新插件-mescroll.js插件

    官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...

  8. js上拉加载下拉刷新

    写在前边: 工作需要,使用ajax在原来的列表下边使用ajax请求后台数据,拼接在列表最下边,在github转了好久,发现了一个bug极多的js刷新插件,尝试了一个下午,就在快放弃的时候,发现下边有留 ...

  9. zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. SwipeRefreshLayout实现上拉加载下拉刷新

    package com.example.swiperefreshlayoutdemo; import java.util.ArrayList;import java.util.HashMap; imp ...

随机推荐

  1. LaTeX技巧002:\section{}章节命令添加中文编译不了问题

    在宏包hyperref前面添加选项CJKbookmarks \usepackage[CJKbookmarks]{hyperref} 并且把这句话尽可能地加在导言区的最底部,即尽可能靠近 \begin{ ...

  2. 倍加福r2000激光驱动安装及使用

    第一次完成激光的驱动安装和激光数据的采集,遇到很多问题,最后一一解决,现在记录下来,方便后面給机器人安装激光使用 激光的了解 (1)激光型号:OMD30M-R2000(30M表示30m) (2)参考手 ...

  3. 18家大厂Java面试题整理了350道(分布式+微服务+高并发)

    一.性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms 表示JVM初始化堆的大小, -Xmx表示JVM堆的最大值.这两个值的大小一般根据需要进行设置. 当应用程序需要的内存超出堆的最大 ...

  4. JavaScript函数、对象和数组

    一.JavaScript函数 1.定义函数:函数的通用语法如下 function function_name([parameter [, ...]]) { statements; } 由关键字func ...

  5. Copy Paste DWG to older 3ds Max

    Hi, This is quick tutorial: how to install Auto Cad scripts to be able to copy from newer Auto Cad t ...

  6. PHP csv文件30w+数据导入mysql数据库

    <?php class Add { public function data() { ini_set('memory_limit', '-1'); //PHP内存设置 $handle=fopen ...

  7. 洛谷P1372 又是毕业季I

    https://www.luogu.org/problem/P1372 #include<bits/stdc++.h> using namespace std; long long n,k ...

  8. Java中new一个子类对象的同时并不会自动创建一个父类对象

    首先重申一个概念:子类会继承父类所有非私有成员变量和方法,包括父类的构造方法 当创建一个子类对象时,首先开辟内存,然后调用类的构造函数,这里的构造函数由两部分组成,一部分是从父类继承而来的父类的构造方 ...

  9. Whctf 2017 -UNTITLED- Writeup

    Whctf 2017 -UNTITLED- Writeup 转载请表明出处http://www.cnblogs.com/WangAoBo/p/7541481.html 分析: 下载下来的附件是一个py ...

  10. python:函数中的*args与**kwargs

    首先定义一个包含*args和**kwargs的函数,这个函数唯一的功能就是输出自己的两个参数,以此来理解*args和**kwargs def myFunc(*args, **kwargs): prin ...