js上拉加载、下拉刷新的插件
之前在网上找那种下拉刷新,上拉加载的插件,有一款IScroll,但是用起来太麻烦,于是就自己写了款,但依赖于jquery.js,bug肯定有,希望评论提出。
推荐一个简洁且文档的插件:传送门
因为我这个不算一个很稳定的东西,只是大概能用
js:
/*
简洁的下拉刷新,上拉加载插件
Author:myEsn2E9
QQ:865540141
Date:2016-5-17
*/
; !(function () {
var defaultParame = {
positionY: 0,
positionTop: 0,
positionBottom: 0,
screenY: 0,
topSpeed: .6,
animateSpeed: 800,
whenThisHeightExecuteCallback: 50,
refreshDom: {
prop: '.refresh',
startText: '下拉刷新',
ingText: '更新中',
endText: '释放更新'
},
loadDom: {
prop: '.load',
startText: '上拉加载',
ingText: '加载中',
endText: '释放加载'
},
isStartRefresh: false,
isStartLoad: false,
isRefreshIng: false,
isLoadIng: false,
moveArray: new Array(),
continueMoveDirection: '',
loadImg: {
src: 'data:image/gif;base64,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',
style: 'width: 15px; height: 15px; vertical-align: middle;'
}
},
parame = {},
prop = ''
callback = {
refresh: null,
load: null
};
function createDom() {
var defaultcss = 'height: 0; display: none; text-align: center; font-size: 12px; ';
$('<div class="' + parame.refreshDom.prop.replace('.', '') + '" style="' + defaultcss + '">' + parame.refreshDom.startText + '</div>').insertBefore($(prop));
$('<div class="' + parame.loadDom.prop.replace('.', '') + '" style="' + defaultcss + '">' + parame.loadDom.startText + '</div>').insertAfter($(prop));
}
var method = {
refreshMove: function () {
if (parame.isStartLoad) {
console.log('已经在加载了,不能刷新');
return;
}
console.log('刷新开始');
parame.isStartRefresh = true;
(parame.continueMoveDirection === 'top') && (parame.positionTop -= parame.topSpeed);
(parame.continueMoveDirection === 'bottom') && (parame.positionTop += parame.topSpeed);
$(prop).prev(parame.refreshDom.prop).fadeIn(parame.animateSpeed);
$(prop).css({ 'position': 'relative' }).animate({ 'top': parame.positionTop }, 0);
$(prop).prev(parame.refreshDom.prop)
.text(parame.positionTop >= parame.whenThisHeightExecuteCallback
? parame.refreshDom.endText : parame.refreshDom.startText);
},
loadMove: function () {
if (parame.isStartRefresh) {
console.log('已经在刷新了,不能加载');
return;
}
parame.isStartLoad = true;
console.log('加载开始');
(parame.continueMoveDirection === 'top') && (parame.positionBottom += parame.topSpeed);
(parame.continueMoveDirection === 'bottom') && (parame.positionBottom -= parame.topSpeed);
$(prop).next(parame.loadDom.prop).fadeIn(parame.animateSpeed);
$(prop).css({ 'position': 'relative' }).animate({ 'bottom': parame.positionBottom }, 0);
$(prop).next(parame.loadDom.prop)
.text(parame.positionBottom >= parame.whenThisHeightExecuteCallback
? parame.loadDom.endText : parame.loadDom.startText);
},
closeRefresh: function () {
parame.isStartRefresh = parame.isRefreshIng = false;
parame.positionTop = 0;//重置偏移量
parame.continueMoveDirection = '';
parame.moveArray = new Array();
$(prop).animate({ 'top': 0 }, parame.animateSpeed, function () {
$(prop).removeAttr('style').prev(parame.refreshDom.prop).fadeOut(parame.animateSpeed);
console.log('刷新结束');
});
},
closeLoad: function () {
parame.isStartLoad = parame.isLoadIng = false;
parame.positionBottom = 0;//重置偏移量
parame.continueMoveDirection = '';
parame.moveArray = new Array();
$(prop).animate({ 'bottom': 0 }, parame.animateSpeed, function () {
$(prop).removeAttr('style').next(parame.loadDom.prop).fadeOut(parame.animateSpeed);
console.log('加载结束');
});
},
refreshIng: function () {
console.log(parame.refreshDom.ingText);
parame.isStartRefresh = parame.isRefreshIng = true;
$(prop).prev(parame.refreshDom.prop)
.html('<img src="' + parame.loadImg.src + '" style="' + parame.loadImg.style + '"/>' + parame.refreshDom.ingText);
$(prop).css({ 'position': 'relative' }).animate({ 'top': parame.whenThisHeightExecuteCallback }, parame.animateSpeed);
callback.refresh();
},
loadIng: function () {
console.log(parame.loadDom.ingText);
parame.isStartLoad = parame.isLoadIng = true;
$(prop).next(parame.loadDom.prop)
.html('<img src="' + parame.loadImg.src + '" style="' + parame.loadImg.style + '"/>' + parame.refreshDom.ingText);
$(prop).css({ 'position': 'relative' }).animate({ 'bottom': parame.whenThisHeightExecuteCallback }, parame.animateSpeed);
callback.load();
},
cancel: function () {
console.log('滑动时受到了伤害');
parame.isStartRefresh = parame.isStartLoad = parame.isRefreshIng = parame.isLoadIng = false;
parame.positionTop = parame.positionBottom = 0;//重置偏移量
parame.continueMoveDirection = '';
parame.moveArray = new Array();
$(prop).animate({ 'top': 0, 'bottom': 0 }, parame.animateSpeed, function () {
$(prop).removeAttr('style');
$(prop).prev(parame.refreshDom.prop).fadeOut(parame.animateSpeed);
$(prop).next(parame.loadDom.prop).fadeOut(parame.animateSpeed);
});
},
isRefreshBug: function () {
return !parame.isRefreshIng
&& $(prop).prev(parame.refreshDom.prop).css('display') != 'none'
&& parame.positionTop < parame.whenThisHeightExecuteCallback;
},
isLoadBug: function () {
return !parame.isLoadIng
&& $(prop).next(parame.loadDom.prop).css('display') != 'none'
&& parame.positionBottom < parame.whenThisHeightExecuteCallback;
}
};
function event() {
$(prop).unbind('touchstart touchmove touchend touchcancel')
.on('touchstart', function (e) {
console.log('开始滑动');
parame.screenY = e.originalEvent.targetTouches[0].screenY;
})
.on('touchmove', function (e) {
console.log('滑动中');
if (parame.isRefreshIng || parame.isLoadIng) {
console.log('已经在刷新/加载了,禁止滑动');
return;
}
parame.positionY = window.scrollY;
parame.moveArray.push(e.originalEvent.targetTouches[0].screenY);
if (parame.moveArray.length > 1) {
if (e.originalEvent.targetTouches[0].screenY > parame.moveArray[parame.moveArray.length - 2]) {//-2是因为本次移动的y轴数值位于该数组的最后一位
parame.continueMoveDirection = 'bottom';
} else if (e.originalEvent.targetTouches[0].screenY < parame.moveArray[parame.moveArray.length - 2]) {
parame.continueMoveDirection = 'top';
} else {
parame.continueMoveDirection = '';
}
} else {
parame.continueMoveDirection = '';
}
console.log(parame.continueMoveDirection);
if (parame.positionY === 0 && (($(document).height() - $(window).height()) == 0)) {//没有滚动条的时候
//刷新
console.log('刷新么么-无滚动条');
(parame.isStartRefresh || parame.continueMoveDirection === 'bottom') && method.refreshMove();
//加载
console.log('加载么么-无滚动条');
(parame.isStartLoad || parame.continueMoveDirection === 'top') && method.loadMove();
} else {
//刷新
console.log('刷新么么-有滚动条');
(parame.positionY === 0
&& !parame.isStartLoad
&& parame.continueMoveDirection === 'bottom')
&& method.refreshMove();
//加载
console.log('加载么么-有滚动条');
((parame.positionY === ($(document).height() - $(window).height()))
&& parame.continueMoveDirection === 'top'
&& !parame.isStartRefresh)
&& method.loadMove();
}
})
.on('touchend', function () {
console.log('滑动结束');
//刷新
parame.positionTop >= parame.whenThisHeightExecuteCallback && method.refreshIng();
//加载
parame.positionBottom >= parame.whenThisHeightExecuteCallback && method.loadIng();
//解决滑动距离小于刷新/加载距离未重置的bug
method.isRefreshBug() && method.closeRefresh();
method.isLoadBug() && method.closeLoad();
})
.on('touchcancel', function () {
method.cancel();
});
}
function init() {
createDom();
event();
}
window.noName = {
/*
config:{
//主要参数
prop:'',//dom元素
refreshCallback:function(){},//刷新回调
loadCallback:function(){}//加载回调
//其他想自定义的参数请看defaultParame变量
}
*/
init: function (config) {
prop = config.prop;
if (typeof (config.prop) === 'undefined'
|| config.prop === ''
|| typeof (config.refreshCallback) != 'function'
|| typeof (config.loadCallback) != 'function')
throw new Error('必需参数为空');
callback.refresh = config.refreshCallback;
callback.load = config.loadCallback;
parame = $.extend({}, defaultParame, config.config || {});
init();
},
//刷新完成后关闭
closeRefresh: method.closeRefresh,
//加载完成后关闭
closeLoad: method.closeLoad
};
}());
html:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>index</title>
<link href="~/Content/css/comm/reset.css" rel="stylesheet" />
<style>
#content {
width: 100%;
overflow: hidden;
}
</style>
</head>
<body>
<div class="wrapper" id="wrapper">
<div id="content"></div>
</div>
<script src="~/Content/js/comm/jquery.min.js"></script>
<script src="~/Content/js/comm/noName.js"></script>
<script>
function fillData() {
var content = '';
for (var i = 0; i < 5; i++) {
content += '<p>这里就是内容' + i + '</p>';
}
$('#content').append(content);
}
fillData();
noName.init({
prop: '',
refreshCallback: function () {
setTimeout(function () {
$('#content').html('');
fillData();
noName.closeRefresh();
}, 3000)
},
loadCallback: function () {
setTimeout(function () {
fillData();
noName.closeLoad();
}, 3000)
}
});
</script>
</body>
</html>
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 ...
- js上拉加载下拉刷新
写在前边: 工作需要,使用ajax在原来的列表下边使用ajax请求后台数据,拼接在列表最下边,在github转了好久,发现了一个bug极多的js刷新插件,尝试了一个下午,就在快放弃的时候,发现下边有留 ...
- 移动端上拉加载下拉刷新插件-mescroll.js插件
官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ...
- zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- 利用iscroll实现上拉加载下拉刷新
1.首先引用isScroll插件 说明:页面加载时初始化isScroll,然后调用pullDownAction()和pullUpAction(),每次切换tab时,只需要对pullDownAction ...
随机推荐
- 重新开始学习javase_对象的初始化
一.类加载机制 类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用.卸载7的阶段: 加载.验证.准备.初始化和卸载这5个阶段的顺序是 ...
- C语言之头文件,static与const关键字
[前言] 最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考.平时也都是用印象笔 ...
- 225 Implement Stack using Queues(用队列实现栈Medium)
题目意思:用队列实现栈,push(),pop(),top(),empty() 思路:用两个queue,pop时将一个queue的元素pop再push到另一个队列,queue只留最后一个元素,并pop, ...
- jquery easy ui 学习 (7) TreeGrid Actions
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- STM32学习笔记——新建工程模板步骤(向原子哥学习)
1. 在创建工程之前,先在电脑的某个目录下面建立一个文件夹,我们先把它命名为Template,后面建立的工程可以放在这个文件夹下.在 Template 工程目录下面,新建 3 个文件夹USER , ...
- 合并JS和CSS
1.先来看看,不用合并js的情况,传输量大 1.1新建一个 [基本]的mvc项目 然后新建一个控制器HomeController,因为js会在很多视图中用到,所以此时我们添加一个视图带布局页Index ...
- decimal类型数据如何保留两位小数
日常开发中,decimal作为货币类型,经常会处理保留两位小数的问题. 本站整理两种,decimal类型保留两位小数的方法. 第一种: decimal d = 46.28111m;string res ...
- Swift中使用构建配置来支持条件编译-b
在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 2 3 4 5 6 7 8 9 #if TARGET_OS_IPHON ...
- 使用Thumbnails对一个文件夹下的所有图片进行压缩处理
public static void compressPic(){ try { Thumbnails.of(new File("/home/y/my_temp/ydbg-xy-pic&quo ...
- Excel进行项目规划的好处
1.表格的方式 2.多个工作表 3.插入图片 4.清晰的规划 5.大众都能看得懂 6.辅助一些数据表设计,其他的流程设计 7.对项目该做什么,进度等等有一个明确的认识 8.项目管理,吃透需求,对进度把 ...