一.准备环节
iscroll.js 5.x版本项目地址 https://github.com/cubiq/iscroll
演示地址:http://pnc.co.il/dev/iscroll-5-pull-to-refresh-and-infinite-demo.html
下载解压,我们打开demos目录,把click复制,改名字为app,也就是我们处理的基础,app文件目录下的index.html改为app.html,都是为了更好理解为自己创建的应用
我们打开app.html,先预览一下js文件,就是iscroll.js,看看就好,我们没必要去改,我们返回html页面,
js部分做出修改如下:
<script type="text/javascript">
window.onload=function(){
var myScroll;
myScroll = new IScroll(‘#wrapper‘, { mouseWheel: true, click: true });
document.addEventListener(‘touchmove‘, function (e) { e.preventDefault(); }, false);
};
</script>
html的body标签调用的载入去掉,这样看着才舒心:
<body>
:::::最重要的一点,在引入类库的目录下我们可以看到很多iscroll.js的类库文件,我们选择下面的,这是事最全的,可以保证所有api被支持:
我们引入js部分代码改成如下:
<script type="text/javascript" src="../../build/iscroll-probe.js"></script>
我们需要找到针对iscroll的api,根据api提供的属性和方法等去修改目标效果。
二.接口使用和基本封装
----1.思考
我们要找到的是事件:
1.下拉事件接口
2.上拉事假接口
我们找到后,
针对下拉做提示刷新图标显示
针对上拉,就去ajax请求调用,当然我们只要模拟插入数据就好了。
针对5.x版本,我们一定要找到对应的api,不同版本的api是不同的,我们大致罗列iscroll5.x的所有api:
网上的一套总结:http://www.cnblogs.com/leolai/articles/4204345.html
官网虽好,英文水平不行:http://iscrolljs.com/
----2.事件:
myScroll.on(‘scrollStart‘, function(){console.log("拖拽开始")});
myScroll.on(‘scroll‘, function(){console.log("拖拽中")});
myScroll.on(‘scrollEnd‘, function(){console.log("拖拽结束")});
我们修改代码,加入事件测试:
<script type="text/javascript">
window.onload=function(){
var myScroll;
myScroll = new IScroll(‘#wrapper‘, {
mouseWheel: true, //是否监听鼠标滚轮事件
bounceTime:600, //弹力动画持续的毫秒数
probeType: 3
});
myScroll.on(‘scrollStart‘, function(){console.log("开始")});
myScroll.on(‘scroll‘, function(){console.log("拖拽中")});
myScroll.on(‘scrollEnd‘, function(){console.log("结束")});
document.addEventListener(‘touchmove‘, function (e) { e.preventDefault(); }, false);
//alert(myScroll.y)
};
</script>
测试的日志显示,表示我们需要的事件被支持:
----3.属性
myScroll.x //当前位置
myScroll.y
myScroll.maxScrollX //当滚动到底部时的 myScroll.x/y
myScroll.maxScrollY
myScroll.directionX //上一次的滚动方向(-1 下/右, 0 保持原状, 1 上/左)
myScroll.directionY
myScroll.currentPage //当前Snap信息
我们的处理都是下拉和上拉处理,毫无疑问在y轴的处理才是我们需要的,我们需要的api属性大概应该如下:
myScroll.y //当前位置y
myScroll.maxScrollY //当滚动到底部时的 y
我们在 scroll 事件输出这两个信息测试,js代码修改如下:
<script type="text/javascript">
window.onload=function(){
var myScroll;
myScroll = new IScroll(‘#wrapper‘, {
mouseWheel: true, //是否监听鼠标滚轮事件
bounceTime:600, //弹力动画持续的毫秒数
probeType: 3
});
myScroll.on(‘scrollStart‘, function(){console.log("开始")});
myScroll.on(‘scroll‘, function(){
console.log("拖拽中y:"+myScroll.y);
console.log("拖拽底部y:"+myScroll.maxScrollY);
});
myScroll.on(‘scrollEnd‘, function(){console.log("结束")});
document.addEventListener(‘touchmove‘, function (e) { e.preventDefault(); }, false);
};
</script>
分析打印日志,我们得出myScroll.maxScrollY 是固定值;
myScroll.y是时时变化值;
我们结合实际:
下拉就是myScroll.y大于0;
下拉就是myScroll.y小于myScroll.maxScrollY ;
----4.根据y值做出最基本封装
根据上面的结果,我们做了下面判断处理,并日志打印,我们写个5的差值,就是为了避免一移动就触发
<script type="text/javascript">
window.onload=function(){
var myScroll;
myScroll = new IScroll(‘#wrapper‘, {
mouseWheel: true, //是否监听鼠标滚轮事件
bounceTime:600, //弹力动画持续的毫秒数
probeType: 3
});
myScroll.on(‘scrollStart‘, function(){console.log("开始")});
myScroll.on(‘scroll‘, function(){
if (this.y > 5) {
//下拉刷新效果
console.log("下拉");
} else if (this.y < (this.maxScrollY - 5)) {
//上拉刷新效果
console.log("上拉");
};
});
myScroll.on(‘scrollEnd‘, function(){console.log("结束")});
document.addEventListener(‘touchmove‘, function (e) { e.preventDefault(); }, false);
};
</script>
----5.二次封装处理
我们问题在哪里?拿下拉举例子,就是只要下拉就打印日志,这是不符合逻辑的,应该是
-
判断出下拉或者上拉 事件
-
在下拉或者上拉结束打印日志或者处理
我们删除开始事件,这个已经不用,
我们创建表示上拉和下拉的变量,然后在结束时间根据标志去做判断处理,代码修改如下:
<script type="text/javascript">
window.onload=function(){
var myScroll;
myScroll = new IScroll(‘#wrapper‘, {
mouseWheel: true, //是否监听鼠标滚轮事件
bounceTime:600, //弹力动画持续的毫秒数
probeType: 3
});
var handle=0;//初始为0,无状态;1表示下拉,2表示上拉
myScroll.on(‘scroll‘, function(){
if (this.y > 5) {
//下拉刷新效果 ,标识设置为1
handle=1;
} else if (this.y < (this.maxScrollY - 5)) {
//上拉刷新效果 ,表示设置为2
handle=2;
};
});
myScroll.on(‘scrollEnd‘, function(){
if(handle==1){
//下拉刷新处理
console.log("下拉");
myScroll.refresh();
handle=0;//重设为0,改为无状态
}else if(handle==2){
//上拉刷新处理
console.log("上拉");
handle=0;//重设为0,改为无状态
}else{handle=0;};
});
document.addEventListener(‘touchmove‘, function (e) { e.preventDefault(); },