前言:

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

实现加载更多的插件。然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再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. 【翻译】React vs Angular: JavaScript的双向性

    翻译原文链接:https://blog.prototypr.io/react-vs-angular-two-sides-of-javascript-b850de22b413 我的翻译小站:http:/ ...

  2. Linux下protobuf的编译与安装【各种奇葩问题】

    1.下载源码 首先,从github上下载protobuf的源码,地址:https://github.com/google/protobuf,我选择下载2.5.0版本. 2.编译protobuf 2.1 ...

  3. HDOJ2000-ASCII码排序

    Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符.   Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格.   Output ...

  4. Maven常用的几个核心概念

    在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助. 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当 ...

  5. 7.spark共享变量

    spark共享变量 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...

  6. DDD理论学习系列(12)-- 仓储

    DDD理论学习系列--案例及目录 1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译. 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一般由仓 ...

  7. pwnable.kr random 之 write up

    ---恢复内容开始--- 首先看源代码: #include <stdio.h> int main(){ unsigned int random; random = rand(); // r ...

  8. 14. leetcode 383. Ransom Note

    Given an arbitrary ransom note string and another string containing letters from all the magazines, ...

  9. JS的事件多次触发,只执行最后一次

    有时候我们在JS编程的过程中经常遇到一个问题就是事件频繁高速被触发,利用计时器来控制频率又会丢弃掉有用的事件,我们只是想让程序执行最后一次的事件,那么就可以用如下方法解决问题 //写在事件外边,防止被 ...

  10. NYOJ--94--cigarettes

    /* Name: NYOJ--94--cigarettes Copyright: 2017 日天大帝 Date: 20/04/17 09:27 Description: 水 题 */ #include ...