关于touch事件对于性能的影响
第一次写博客随笔,废话不多说,直接进入正题。
最近一直专注于移动终端的开发,碰到了一个比较棘手的事情,就是touch事件,大家都知道,touch事件有几种,无非就是touchstart,touchmove,touchend,touchstart和touchend应该算是单次触发式的事件,而touchmove因为是手指触碰之后,可以持续触发的事件,然后,每次触发一次或者说是某一段的touchmove的时候,也就是在持续进行js解析和执行,这样,会阻塞页面渲染,比如,我touchmove触发一段,然后渲染一次html页面,然后我手指按着不放,进入第二段touchmove事件,这个时候,从第一次的html渲染到第二次的html渲染之间,会有阻塞现象,短时间的触发还好,可能感觉不到,然后如果你需要长时间去触发的话,就会很明显的觉的卡顿,万一你的手机配置不高,性能不好的话,那就会卡的不要不要的!
然后,这个问题也不是不能得到解决,先附上一段代码:
$("body").on("touchstart", function(e) {
e.preventDefault();
startX = e.originalEvent.changedTouches[0].pageX,
startY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchmove", function(e) {
e.preventDefault();
moveEndX = e.originalEvent.changedTouches[0].pageX,
moveEndY = e.originalEvent.changedTouches[0].pageY,
X = moveEndX - startX,
Y = moveEndY - startY;
if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {
//你要渲染的页面
}
});
这段代码意思是,当我手指触碰在手机显示屏时,从左滑到右边,会触发alert事件,然而大家看到了某个方法没有,对,没错,那就是e.preventDefault();只要触发一次touchmove,他就会做一次判断,取消body的默认行为,那这样子势必会有性能问题,所以,我们不妨把e.preventDefault()保存到一个变量中:
function updateTouches(event) {
touches = event.touches;
}
然后监听touchmove事件:
document.addEventListener('touchmove', updateTouches);
然后用windows的requestAnimationFrame,可以让动画更流畅,运行性能更高,通过requestAnimationFrame来更新渲染页面。当然,如果你想兼容各种浏览器,需要对不同的浏览器判断是否支持这个方法,这里我们假设浏览器支持这个方法。
window.requestAnimationFrame(renderEverything);
这里我们队这个方法传入了一个renderEverything的函数参数,这个函数里面就是touchmove事件具体要干的事情:
function renderEverything() {
//这里就是你要做的事情
}
我们把以上代码结合起来:
$("body").on("touchstart", function(e) {
document.addEventListener('touchmove', updateTouches);
startX = e.originalEvent.changedTouches[0].pageX,
startY = e.originalEvent.changedTouches[0].pageY;
});
window.requestAnimationFrame(renderEverything);
function updateTouches(e) {
touches = e.preventDefault();
}
function renderEverything() {
$("body").on("touchmove", function(e) {
moveEndX = e.originalEvent.changedTouches[0].pageX,
moveEndY = e.originalEvent.changedTouches[0].pageY,
X = moveEndX - startX,
Y = moveEndY - startY;
if (Math.abs(X) > Math.abs(Y) && X > 0) {
//你要渲染的页面
}
})
}
虽然这样子不能完完全全移除卡顿的现象,通常这和整个页面结构,以及js解析和css渲染紧密相关,但是,这样子的确可以大大的优化使用touch时候的性能。
第一次写博文,不足之处请大家指教,我肯定虚心接受!
关于touch事件对于性能的影响的更多相关文章
- 移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来. 做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且to ...
- JavaScript 事件对内存和性能的影响
程序代码: <%-- Created by IntelliJ IDEA. User: 乔克叔叔 Date: 2017/12/26 Time: 16:45 To change this templ ...
- Android开发之Touch事件分发机制
原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...
- H5案例分享:移动端滑屏 touch事件
移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...
- Android事件分发机制(二)30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- 高性能JavaScript-JS脚本加载与执行对性能的影响
在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 脚本位置对性能的影响 优化页面加载性能的原则之一是将scri ...
- Android:30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- 移动端 js touch事件
随着智能手机和平板电脑的普及, 越来越多的人用移动设备浏览网页,我们平时在pc浏览器上用的鼠标事件,比如:click, mouseover等, 已经无法满足移动设备触摸屏的特点,触摸时代的到来,离不开 ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
随机推荐
- Hadoop第1~2周练习—Hadoop1.X和2.X安装
练习题目 Hadoop1.X安装 2.1 准备工作 2.1.1 硬软件环境 2.1.2 集群网络环境 2.1.3 安装使用工具 2.2 环境搭建 2.2.1 安 ...
- Tools - Windows
1)文本操作 Ctrl + C / Ctrl + V / Ctrl + X / Ctrl + Z / Ctrl + A:复制/粘贴/剪贴/撤销/全选. 2)窗口左右分屏 Win + 方向键:上(最大化 ...
- Direct3D11学习:(八)Effects介绍
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Effects框架是一组用于管理着色器程序和渲染状态的工具代码.例如,你可能会使用不同的effect绘制水.云. ...
- vertical-align两种应用场合
vertical-align两种应用场合 (1)用在td/th中或display:table-cell元素中:让当前元素中的文本内容在竖直方向上居中 css部分: .content{ ...
- mysql depended_query 优化案例一则
月度利息统计sql优化 原因:写的sql语句复杂,理解起来有难度,另一方面,查询性能比较低 原来的语句如下: SELECT tp.year, tp.month, tp.bid_id, b.`title ...
- JS 数组去重(数组元素是对象的情况)
js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...
- 使用openssl生成RSA公私密钥
在windows 环境下 1.进入cmd命令窗口 切换到openssl程序目录下 2.输入openssl.exe,进入openssl命令模式下 3.生成私钥输入“genrsa -out app_pri ...
- Winform开发框架之权限管理系统功能介绍
权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...
- node.js实现CURL功能
PHP中的CURL功能很好实现,直接四五行代码封装一下就OK了.node.js中如何实现CURL的功能呢,下面详细介绍. 这里需要用到request这个库,所以先安装此包: npm install r ...
- 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask
[源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...