前言:

说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉

实现加载更多的插件。然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再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事件 || 上拉加载更多的更多相关文章

  1. 原生js移动端touch事件实现上拉加载更多

    大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...

  2. 移动端实现上拉加载更多(使用dropload.js vs js)

    做下笔记,:移动端实现上拉加载更多,其实是数据的分段加载,在这里为了做测试我写了几个json文件作为分段数据: 方式一:使用dropload.js; 配置好相关参数及回调函数就可使用:代码如下 var ...

  3. vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

    在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...

  4. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  5. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  6. 【Web】移动端下拉刷新、上拉加载更多插件

    移动网站中常常有的功能:列表的下拉刷新.上拉加载更多 本例介绍一种简单使用的移动端下拉刷新.上拉加载更多插件,下载及参考地址:https://github.com/ximan/dropload 插件依 ...

  7. 移动端h5列表页上拉加载更多

    背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...

  8. vue移动端上拉加载更多

    LoadMore.vue <template> <div class="load-more-wrapper" @touchstart="touchSta ...

  9. mui实现分页上拉加载更多 下拉刷新数据的简单实现 移动端下拉上拉

    空下来把mui上拉加载更多,下拉刷新数据做了一个简单的实现,希望可以帮助到需要的朋友 demo项目的结构 <!DOCTYPE html> <html> <head> ...

随机推荐

  1. 前端模块化工具--webpack使用感受

    话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...

  2. Java--反射的逐步理解

    层层引入反射的作用 一.类类型的概念:所有类都是对象,是Class类的实例对象,这个对象我们成为该类的类类型 1.下面是一个小的test,以产生3种方式的类类型: public class test ...

  3. Spring源码情操陶冶-AbstractApplicationContext#registerListeners

    承接前文Spring源码情操陶冶-AbstractApplicationContext#onRefresh 约定web.xml配置的contextClass为默认值XmlWebApplicationC ...

  4. Mac下安装 MongoDB

    Mac 下安装 MongoDB 一般有两种方法,一种是通过源码安装,一种是直接使用 homebrew ,个人推荐使用 homebrew ,简单粗暴. 1.安装 homebrew : /usr/bin/ ...

  5. vue组件的那些事($children,$refs,$parent)的使用

    如果项目很大,组件很多,怎么样才能准确的.快速的寻找到我们想要的组件了?? 1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"&g ...

  6. javascript中this的用法

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着函数使用场合的 ...

  7. iOS耗电量测试

    iOS耗电量测试 本文主要介绍的是使用Energy Diagnostics Instruments来进行iOS耗电量测试. 一.使用方法: 1)iOS 设置选项 ->开发者选项 ->log ...

  8. RabbitMQ 使用场景一

    安装环境 1.下载安装 Erlang 运行时环境 2.下载安装 RabbitMQ Server 应用程序 3.启动 RabbitMQ 服务(默认启动) 4.安装管理平台插件并打开远程访问权限 4.1. ...

  9. 26. leetcode 350. Intersection of Two Arrays II

    350. Intersection of Two Arrays II Given two arrays, write a function to compute their intersection. ...

  10. Uva 11988 Broken Keyboard STL+链表

    两种方法,直接上代码 STL标准模板库 #include <iostream> #include <list> #include <algorithm> #incl ...