移动端touch事件 || 上拉加载更多
前言:
说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉
实现加载更多的插件。然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再touchmove等会出现卡死的假象。(ps:当然,
我不认为是插件的问题,当时的想法是觉得引用的插件存在冲突),于是,我就直接通过封装touch事件完成上拉加载实现分页的功能。
备注:文章最后会加上为实现这个功能我找的一些插件
了解touch事件
在应用touch事件实现上拉加载更多实现分页的效果上,其实我们用到的只有touchstart,touchmove,touchend,touchcancel事件,还有targetTouches[0]
和changedTouches[0]属性即可完成简单的分页效果。
了解更多touch事件的方法可以访问:
https://developer.mozilla.org/zh-CN/docs/Web/API/Touch
touch事件需要注意事项
在执行touch事件的时候,在大多数情况下我们需要注意的就是阻止浏览器的默认行为,例如滚动事件或者浏览器的缩放,可以通过html页面加上meta标签禁止
用户缩放:<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">,然后
在touch事件上加上event.preventDefault()阻止默认事件。
上代码
通过基于zepto简单的封装了touch事件上拉加载更多的效果。
;(function ($,window,undefined) {
var userDefinedSlide={
isSupportTouch:"ontouchstart" in document ? true :false,
startPos:{},//touchstart的位置信息
endPos:{},//touchmove的位置信息
upOrDown:'',//up:为上拉加载,down为下拉刷新
winHigh:0,//浏览器的高度,
docHigh:0,//文档的高度,对应于页面总高度
scrollHigh:0,//滚动的高度
notDefault:false,//是否阻止默认行为
//docHigh=winHigh+scrollHigh
init:function(){
if(!this.isSupportTouch){
console.warn('touch events are not supported at current device');
}else{
this.touchEvents();
}
},
touchEvents:function(){
var that=this;
$("body").on("touchstart",function (e) {
var touch=e.targetTouches[0];
that.startPos={
x:touch.pageX,
y:touch.pageY,
time:+new Date()
};
that.winHigh=$(window).height();//可视窗口高度
that.docHigh=$(document).height();//总高度
that.scrollHigh=$(window).scrollTop();//滚动高度
});
$("body").on("touchmove",function (e) {
if(that.notDefault){
e.preventDefault();
}
var touch=e.targetTouches[0];
that.endPos={
x:touch.pageX,
y:touch.pageY,
time:+new Date()
};
that.upOrDown=that.endPos.y-that.startPos.y;
});
$("body").on("touchend touchcancel",function (e) {
if(that.upOrDown < 0 && that.docHigh<=(that.winHigh+that.scrollHigh)){
console.log('is to bottom');
//可执行动画效果
setTimeout(function(){
//需要异步加载数据放置位置
//若执行动画,则加载数据后移除动画效果
},1000);
}
})
}
};
userDefinedSlide.init();
})( Zepto ,window,undefined);
而基于是在touchmove事件执行获取触摸位置还在touchend/touchcancel事件执行获取触摸位置则我没有过多的考究。
要在touchend/touchcancel事件获取触摸位置的话则需要将var touch=e.targetTouches[0];调整为var touch=e.changedTouches[0];
因为,touchend/touchcancel事件没有targetTouches属性,只有changedTouches属性。
可能有人存在疑惑,为啥要绑定touchend和touchcancel两个事件呢,个人事件,发现在部分安卓手机上会在touchend事件上有bug,不能
执行,所以通过执行touchcancel事件:当系统停止跟踪触摸的时候触发,来达到touchend的效果。
通过我上面对touch事件的简单封装就可实现上拉加载更多实现分页的效果了。
更多上拉加载更多、下拉刷新插件:
dropload:https://github.com/ximan/dropload
iScroll:https://github.com/cubiq/iscroll
swiper:https://github.com/nolimits4web/Swiper(ps:swiper也可实现上拉加载更多)
mescroll:http://www.mescroll.com/
另:我文章开头提到的使用插件存在的bug,有知道的大神可以留言给我喔,再次谢过先了。
移动端touch事件 || 上拉加载更多的更多相关文章
- 原生js移动端touch事件实现上拉加载更多
大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...
- 移动端实现上拉加载更多(使用dropload.js vs js)
做下笔记,:移动端实现上拉加载更多,其实是数据的分段加载,在这里为了做测试我写了几个json文件作为分段数据: 方式一:使用dropload.js; 配置好相关参数及回调函数就可使用:代码如下 var ...
- vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版
在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...
- 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果
最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...
- 基于SwiperJs的H5/移动端下拉刷新上拉加载更多
最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...
- 【Web】移动端下拉刷新、上拉加载更多插件
移动网站中常常有的功能:列表的下拉刷新.上拉加载更多 本例介绍一种简单使用的移动端下拉刷新.上拉加载更多插件,下载及参考地址:https://github.com/ximan/dropload 插件依 ...
- 移动端h5列表页上拉加载更多
背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...
- vue移动端上拉加载更多
LoadMore.vue <template> <div class="load-more-wrapper" @touchstart="touchSta ...
- mui实现分页上拉加载更多 下拉刷新数据的简单实现 移动端下拉上拉
空下来把mui上拉加载更多,下拉刷新数据做了一个简单的实现,希望可以帮助到需要的朋友 demo项目的结构 <!DOCTYPE html> <html> <head> ...
随机推荐
- 把int型非负数转换为英文
数字转换为英文 输入为int型非负数,最大值为2^31 - 1 = 2 147 483 647 输出为String英文,最大输出为Two Billion One Hundred Forty Seven ...
- nyoj_68:三点顺序(计算几何)
题目链接 根据 AB*AC的值进行判断即可(ps,结果为0时不构成三角形) #include<iostream> #include<cstdio> #include<cs ...
- MySQL5.6.36 linux rpm包安装配置文档
一.卸载自带mysql,删除MySQL的lib库,服务文件 [root@localhost ~]#rpm -qa|grep mysql qt-mysql-4.6.2-26.el6_4.x86_64 m ...
- filezilla里怎么解决中文乱码问题
使用Filezilla client FTP客户端登陆某些FTP站点会出现中文乱码,原因是FTP服务器端编码与filezilla client端编码不一致造成的.解决方法如下:文件-站点管理-选中要登 ...
- ngin隐藏版本号
Nginx默认是显示版本号的,如: 这样就给人家看到你的服务器nginx版本,这样暴露出来的版本号就容易变成攻击者可利用的信息.所以,从安全的角度来说,隐藏版本号会相对安全些! 配置如下: 修改n ...
- 配置mabatis,报Could not load driverClass ${jdbc.driverClassName}
<!-- 扫描mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" ...
- 【RequireJS】requireJS的基础知识
1. requirejs的优点 1)异步加载依赖的文件 2)管理文件加载顺序 3)管理文件加载的包路径 2. requirejs下载地点 https://github.com/jrburke/requ ...
- CentOS 7.3.1611系统安装配置图解教程
操作系统:CentOS 7.3.1611 IP地址:192.168.21.130 网关:192.168.21.2 DNS:8.8.8.8 8.8.4.4 备注: CentOS 7.x系列只有64位系统 ...
- 二.GC相关之Java内存模型
根据上节描述的问题,我们知道其最终原因是GC导致的.本节我们就先详细探讨下与GC息息相关的Java内存模型. 名词解释:变量,理解为java的基本类型.对象,理解为java new出来的实例. Jav ...
- 45. leetcode 504. Base 7
504. Base 7 Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: ...