js触摸屏案例
js 手机端触发事事件、javascript手机端/移动端触发事件
处理Touch事件能让你跟踪用户的每一根手指的位置。你可以绑定以下四种Touch事件:
1
2
3
4
|
touchstart: // 手指放到屏幕上的时候触发 touchmove: // 手指在屏幕上移动的时候触发 touchend: // 手指从屏幕上拿起的时候触发 touchcancel: // 系统取消touch事件的时候触发。至于系统什么时候会取消,不详 |
1
2
3
4
|
client / clientY: // 触摸点相对于浏览器窗口viewport的位置 pageX / pageY: // 触摸点相对于页面的位置 screenX /screenY: // 触摸点相对于屏幕的位置 identifier: // touch对象的unique ID |
http://blog.sina.com.cn/s/blog_65c2ec5e0101fexw.html
手机端html5触屏事件(touch事件)
touchstart:触摸开始的时候触发
touchmove:手指在屏幕上滑动的时候触发
touchend:触摸结束的时候触发
而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控):
touches:当前位于屏幕上的所有手指的列表。
targetTouches:位于当前DOM元素上手指的列表。
changedTouches:涉及当前事件手指的列表。
每个触摸点由包含了如下触摸信息(常用):
identifier:一个数值,唯一标识触摸会话(touch session)中的当前手指。一般为从0开始的流水号(android4.1,uc)
target:DOM元素,是动作所针对的目标。
pageX/pageX/clientX/clientY/screenX/screenY:一个数值,动作在屏幕上发生的位置(page包含滚动距离,client不包含滚动距离,screen则以屏幕为基准)。
radiusX/radiusY/rotationAngle:画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。初步测试浏览器不支持,好在功能不常用,欢迎大家反馈。
var
obj = document.getElementByIdx_x(
'id'
);
obj.addEventListener(
'touchmove'
,
function
(event) {
// 如果这个元素的位置内只有一个手指的话
if
(event.targetTouches.length == 1) {
event.preventDefault();
// 阻止浏览器默认事件,重要
var
touch = event.targetTouches[0];
// 把元素放在手指所在的位置
obj.style.left = touch.pageX-50 +
'px'
;
obj.style.top = touch.pageY-50 +
'px'
;
}
},
false
);
/*!*****************
- @author:meibin
- @date:2014-04-03
- @功能:移动滑动事件js方法封装
- 说明:该方法为考虑使用的灵活性,并未直接封装成插件,只简单的提供了操作事件;
- 暂支持:swipeleft 、 swiperight、swipeup 、swipedown 、singleTap、touchstart、touchmove、touchend;等事件;
- 左滑动 、 右滑动 、 上滑动 、 下滑动 、 点击 、 触摸开始 、 触摸移动 、触摸结束
- ******************/
- //手机触屏事件封装;
- var TouchEvent = (function(){
- return {
- touches:function(obj,oEvent,fnd){
- /*
- 参数说明:
- obj 当前的对象;
- oEvent swipeleft 、 swiperight、swipeup 、swipedown 、singleTap、touchstart、touchmove、touchend
- fnd 回调函数;
- */
- var defaults = {
- x : 2, //默认滑动范围 X 不能小于5;
- y : 2, //默认滑动范围 Y 不能小于5;
- ox : 0, //默认的开始 x 轴的值;
- oy : 0, //默认的开始 y 轴的值;
- nx : 0, //默认的结束 x 轴的值;
- ny : 0 //默认的结束 y 轴的值;
- };
- oEvent = oEvent.toLowerCase(); // 大小写转换;可以减少报错率;
- var isTouchPad = (/hp-tablet/gi).test(navigator.appVersion);
- var hasTouch = 'ontouchstart' in window && !isTouchPad;
- var touchStart = hasTouch ? 'touchstart' : 'mousedown';
- var touchMove = hasTouch ? 'touchmove' : '';
- var touchEnd = hasTouch ? 'touchend' : 'mouseup';
- var scrollY; //用于检测页面是否是滑动或滚动条滚动;
- //var scrollX;
- var a = {
- /*触摸开始方法*/
- tStartFun:function(e){
- //e.preventDefault();
- scrollY= undefined;
- //scrollX= undefined;
- defaults.ox = e.targetTouches[0].pageX; //手势开始时的X轴位置;
- defaults.oy = e.targetTouches[0].pageY; //手势开始时的Y轴位置;
- defaults.nx = defaults.ox;
- defaults.ny = defaults.oy;
- if(oEvent.indexOf("touchstart") != -1){ //如果是绑定的这个事件;
- fnd(); //执行回调函数;
- };
- /*添加 “移动” 事件监听;*/
- obj.addEventListener(touchMove,a.tMoveFun,false);
- /*添加 “结束” 事件监听;*/
- obj.addEventListener(touchEnd,a.tEndFun,false);
- },
- /*触摸移动方法*/
- tMoveFun:function(e){
- //if( hasTouch ){ if (
e.targetTouches.length > 1 || e.scale && e.scale !== 1)
return }; - //e.preventDefault();
- //oStop = true;
- //多点或缩放
- defaults.nx = e.targetTouches[0].pageX; //手势移动时的X轴位置,即最后的值等于手指;
- defaults.ny = e.targetTouches[0].pageY; //手势移动时的Y轴位置;
- var changeY = defaults.oy - defaults.ny; //手指抬起时 Y 轴的最后值 || (开始时的值 - 移动时的值);
- var changeX = defaults.ox - defaults.nx; //手指抬起时 X 轴的最后值 || (开始时的值 - 移动时的值);
- if ( typeof scrollY == 'undefined' ) {//|| (typeof scrollX == 'undefined')
- scrollY = !!( scrollY || Math.abs(changeX ) < Math.abs(changeY) );
- //scrollX = !!( scrollX || Math.abs(changeY ) < Math.abs(changeX) );
- }
- if( !scrollY ){ //当确定页面不是滚动时,才阻止浏览器默认事件;|| !scrollX
- e.preventDefault(); //当确定页面不是滚动时,才阻止浏览器默认事件;
- if(oEvent.indexOf("touchmove") != -1){//如果是绑定的这个事件;
- fnd(); //执行回调函数;
- }
- }
- },
- /*触摸结束的方法*/
- tEndFun:function(e){
- var changeY = defaults.oy - defaults.ny; //手指抬起时 Y 轴的最后值 || (开始时的值 - 移动时的值);
- var changeX = defaults.ox - defaults.nx; //手指抬起时 X 轴的最后值 || (开始时的值 - 移动时的值);
- //如果 最后的X 轴值 大于 Y轴的值 并且 Y轴的值 大于 y= 5 就开始判断事件
- // 因为默认如果移动的范围小于 5*5 就当做点击事件处理;
- if(Math.abs(changeX)
> Math.abs(changeY) && Math.abs(changeY) > defaults.y){ - //左右事件;
- if(changeX > 0){ // 如果 X 轴 的值大于 0 说明用于有移动;就进行事件判断,判断用户绑定的是什么事件;;
- if(oEvent.indexOf("swipeleft") != -1){ // 如果绑定的是 向左滑动事件,即执行向左的回调函数;
- fnd();//执行回调函数;
- }
- }else{
- if(oEvent.indexOf("swiperight") != -1){ // 如果绑定的是 向左滑动事件,即执行向左的回调函数;
- fnd();//执行回调函数;
- }
- }
- }else
if(Math.abs(changeY) > Math.abs(changeX) && Math.abs(changeX)
> defaults.x){ - //上下事件;
- if(changeY > 0){ // 如果 Y 轴 的值大于 0 说明用于有移动;就进行事件判断,判断用户绑定的是什么事件;;
- if(oEvent.indexOf("swipeup") != -1){// 向上滑动事件,即执行向上的回调函数;
- fnd();
- }
- }else{
- if(oEvent.indexOf("swipedown") != -1) { // 向下滑动事件,即执行向下的回调函数;
- fnd();
- }
- }
- }else{
- //点击事件;即用户滑动的范围小于默认的5*5
- if(oEvent.indexOf("singletap") != -1){ //点击事件
- fnd();
- }
- }
- //如果绑定的是 结束 事件;
- if(oEvent.indexOf("touchend") != -1){
- fnd();
- }
- /*事件结束时,删除相应的监听事件;*/
- obj.removeEventListener(touchMove,a.tMoveFun,false);
- obj.removeEventListener(touchEnd,a.tEndFun,false);
- }
- }
- //添加 “开始” 事件监听;
- obj.addEventListener(touchStart,a.tStartFun,false);
- }
- };//return END;
- })();
使用示例:
var tempWrapId = document.getElementById('mMain');
//向左滑动的事件;
TouchEvent.touches(tempWrapId,'swipeLeft',function(event){
if(oStop){
oStop = false;
i++;
if(i>(max-1)){
i = max-1;
oStop = true;
return false;
}
$('.m-main .m-item').find('.btn-slide').css('opacity',0);
$('#bodyWrap .m-main').animate({'top':-(i*itemH)},400);
$('.m-main .m-item').eq(i).find('.btn-slide').css('opacity',1);
oStop = true;
}
});
手机触摸屏的JS事件
让bootstrap默认slider支持触屏设备
var isTouch=('ontouchstart' in window);
if(isTouch){
$(".carousel").on('touchstart', function(e){
var that=$(this);
var touch = e.originalEvent.changedTouches[0];
var startX = touch.pageX;
var startY = touch.pageY;
$(document).on('touchmove',function(e){
touch = e.originalEvent.touches[0] ||e.originalEvent.changedTouches[0];
var endX=touch.pageX - startX;
var endY=touch.pageY - startY;
if(Math.abs(endY)<Math.abs(endX)){
if(endX > 10){
$(this).off('touchmove');
that.carousel('prev');
}else if (endX < -10){
$(this).off('touchmove');
that.carousel('next');
}
return false;
}
});
});
$(document).on('touchend',function(){
$(this).off('touchmove');
});
}
js触摸屏案例的更多相关文章
- 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能
大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...
- js计算器案例
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...
- 正則表達式--js使用案例
前言:在前端页面使用中.遇到日期格式的验证.開始使用了一款表单控件验证.可是不兼容!!并且使用起来还受到非常大约束.所以就决定自己写原生js. 为了完毕日期格式的验证.第一步,当然是学会使用正則表達式 ...
- JS小案例:循环间隔重复变色
在A.B.C三个区块中,有且仅有一个红色,要求红色每隔一秒即进入下一个区块,变色过程不断循环往复. 参考代码: <!DOCTYPE html> <html lang="zh ...
- node.js(小案例)_实现学生信息增删改
一.前言 本节内容主要对小案例做一个总结: 1.如何开始搭建小项目 2.路由设计 3.模块应用 4.项目源码以及实现过程github地址: 项目演示如下: 二.主要内容 1.项目的关键性js源码: 项 ...
- node.js小案例_留言板
一.前言 通过这个案例复习: 1.node.js中模板引擎的使用 2.node.js中的页面跳转和重定向 二.主要内容 1.案列演示: 2.案列源码:https://github.com/45612 ...
- node.js 爬虫案例
本案例是爬的一部小说,爬取并存在本地 使用了动态浏览器头部信息,和 动态ip代理, 这2个方式可以有效的伪装自己,不至于被反爬,然后拉黑,之前已有记录,浏览器头部信息,也记录的有, app.js im ...
- js DOM 案例
模态框 <html> <head> <meta charset="UTF-8"> <title>模态框</title> ...
- C3.js入门案例
C3.js是基于D3.js开发的JavaScript库,它可以让开发者构建出可复用的图表,并且还提供了一系列图表上的交互行为.通过C3,只需要往generate函数中传入数据对象就可以轻松的绘制出图表 ...
随机推荐
- poj 3216 (最小路径覆盖)
题意:有n个地方,m个任务,每个任务给出地点,开始的时间和完成需要的时间,问最少派多少工人去可以完成所有的任务.给出任意两点直接到达需要的时间,-1代表不能到达. 思路:很明显的最小路径覆盖问题,刚开 ...
- poj 3436 (最大流)
题意:每台电脑共有p种零件,现在有n台机器,给出n台机器每台需要的一些种类零件当原料(0代表不需要,1代表必须要,2代表可有可无)和输出的产品零件.问怎么安排生产线使生产出来零件可以组装的电脑最多. ...
- WPF拖动总结[转载]
WPF拖动总结 这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中 ...
- Android窗口管理服务WindowManagerService的简要介绍和学习计划
在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的 实现要更复杂,因为它们的类型和作用不同,且会相互影响. ...
- 设计模式入门之职责链模式Chain Of Responsibility
//职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. //实例:申请费用的功能,不同金额的费 ...
- SQL Server 2008 忘记sa密码的解决办法
由于某些原因,sa和windows验证都不能登录 sql server,可以用独占模式,修改sa密码先在服务管理器停止Sql Server服务,然后打开命令行,进入 SQL Server安装目录,进入 ...
- RFC端口号定义
RFC关于计算机端口号定义 http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers. ...
- Xcode5 配置 github
首先,要在github上,进行如下的操作: 1. github 官网 https://github.com 注册github账号. 2. 创建一个repository,命名为项目的名称,如 Gith ...
- hdu2317Nasty Hacks
Problem Description You are the CEO of Nasty Hacks Inc., a company that creates small pieces of mali ...
- HDU 2458 - Kindergarten
有一堆男孩和女孩,男孩和男孩之间,女孩和女孩之间互相认识,给出一堆男孩女孩之间认识的关系, 问一个组里最多多少人相互都认识 那么 二分图里 将不认识的连线 那么 相互认识的人最多 就为 最大独立点集 ...