1.开发背景

  最近用html5写了个小游戏,中间踩过无数坑,有很多甚至百度都百度不到答案,可见html5还真是不成熟,兼容性的复杂度比ie6有过之而无不及,性能那个渣简直无力吐槽。。

  好了,吐槽结束,虽然有这么多的缺点,但是由于其良好的跨平台前景以及极低的学习成本,再加上优秀的框架,我最终还是选择了用html5来开发这个小游戏,而且是小游戏,所以就没有用什么游戏开发框架了,只是自己简单的封装了一个,因此所有的bug都被我走了一遍。。正当我调试完所有的android上的bug之后,心想自己的努力不能白费啊,跨平台呢?上wp看看,结果,。。发现居然没有结果了。。自己平时用wp手机为主,android只是开发机( 淘宝上买的屌丝机).然后又是百度又是bing,最终发现原来ie10种中的触摸事件和android、ios不一样,貌似ie10是MSPointerMove之类,ie11是pointermove(居然同一系列还没事改名,这无疑增大了兼容负担。。)看到此处lz还挺盲目乐观,至少还有一大批的兼容框架吧。。框架确实有,不过基本上都是集成的重型webapp框架,比如zepto的touch.js, 在wp8手机上配合jquery失败。我一个小游戏实在没有必要啊,否则还不如直接学个游戏引擎(lz太懒,看到那么繁复的api又没有良好的开发工具(webstorm虽然好,毕竟是破解的。。),而且自己也不是专门搞前端的,只是兴趣爱好,所以每次想学就又半途而废了。。)

  最终,终于让我找到了pointer.js,虽然他的api方式是微软版本的(采用少数派,有点不爽),但是能凑合着用也算了,不过在wp8手机上测试失败,事实上ie10也测试失败,什么堆栈溢出,自己改了改源码,不报错了,但是触摸也没有反应了,于是又放弃了。。

  最后lz鼓起勇气,决定自己写一个小的封装,但是在写的过程中又是坑无数。。因为lz新系统没有装wp8的sdk(以前装过2012版的,貌似和校园网客户端有冲突,于是就只敢装虚拟机里了),所以只能用原始的js alert()调试,结果发现,那些网上的博客,框架,都采用的MSPointer[Down|Up]在滑动手势中是不会触发的,只有在点击才会触发。。我了个去啊,这算什么回事,难道真的得放弃wp版本吗?放弃了wp平台,这跨平台也跨的太坑爹了吧。。而且在滑动事件中MSPointerMove也只会触发两次,估计只是第一个点和最后一个点两次。就在lz万分懊恼,快要被html5搞得神经错乱之际(其实在开发过程中我总是在犹豫要不要用原生的java开发android版本算了,性能绝对能好上一个数量级,现在画面掉帧严重。。),忽然灵光一闪,既然down,up不触发那么over和out呢?果断换成MSPointer[over|out],居然成功了!!然后自己一顿简单封装,只支持单点触控,多点触控什么的都没考虑了,电脑的mouse事件虽有考虑,不过基本无效,以后有时间再完善吧,不过现在暂时够用了。现在把思路发出来,如果大家有需要的二次开发什么的也方便。。

代码写得可能不够优雅,实在是这个需要兼容的太混乱,加之水平有限,所以还请大家海涵,不喜勿喷。。。

2.上源码

/**
* 兼容ie10,11和android、ios的触摸事件,只需要和android,ios一样使用函数就可以了,
*/
var TouchFix = {};
(function() {
var MSPointerType={
start:"MSPointerOver",
move:"MSPointerMove",
end:"MSPointerOut"
},
pointerType={
start:"pointerover",
move:"pointermove",
end:"pointerout"
},
touchType={
start:"touchstart",
move:"touchmove",
end:"touchend"
},
mouseType={
start:"mousedown",
move:"mousemove",
end:"mouseup",
out:"mouseout"
};
function isTouch() {
return typeof window.ontouchstart !== "undefined";
} function isMSPointer() {
return window.navigator.msPointerEnabled;
} function isPointer() {
return window.navigator.pointerEnabled;
} function bindStart(el,cb) {
el.addEventListener(pointerType.start,
function (e) {
pointerHandler(e,cb);
});
el.addEventListener(MSPointerType.start,
function (e) {
MSPointerHandler(e,cb);
});
el.addEventListener(touchType.start,
function (e) {
touchHandler(e,cb);
});
if (!isTouch() && !isMSPointer() && !isPointer()) {
el.addEventListener(mouseType.start,
function (e) {
mouseHandler(e,cb);
});
}
} function bindMove(el,cb) {
el.addEventListener(pointerType.move,
function (e) {
pointerHandler(e,cb);
cb(e);
});
el.addEventListener(MSPointerType.move,
function (e) {
MSPointerHandler(e,cb);
cb(e);
});
el.addEventListener(touchType.move,
function (e) {
touchHandler(e,cb);
}); if (!isTouch() && !isMSPointer() && !isPointer()) {
el.addEventListener(mouseType.move,
function (e) {
mouseHandler(e,cb);
});
}
} function bindEnd(el,cb) {
el.addEventListener(pointerType.end,
function (e) {
pointerHandler(e,cb);
});
el.addEventListener(MSPointerType.end,
function (e) {
MSPointerHandler(e,cb);
});
el.addEventListener(touchType.end,
function (e) {
touchHandler(e,cb);
}); if (!isTouch() && !isMSPointer() && !isPointer()) {
el.addEventListener(mouseType.end,
function (e) {
mouseHandler(e,cb);
});
el.addEventListener(mouseType.out,
function (e) {
mouseHandler(e,cb);
});
}
} TouchFix.bind = function(el,type,cb) {
switch (type) {
case touchType.start:
bindStart(el,cb);
break;
case touchType.move:
bindMove(el,cb);
break;
case touchType.end:
bindEnd(el,cb);
break;
default:
break;
}
}
var hasTouchStart=false;
function commonHandler (e) {
if(e.type===MSPointerType.start
||e.type===pointerType.start
||e.type===mouseType.start){
e.type=touchType.start;
}else if(e.type===MSPointerType.move
||e.type===pointerType.move
||e.type===mouseType.move){
e.type=touchType.move;
}else if(e.type===MSPointerType.end
||e.type===pointerType.end
||e.type===mouseType.end
||e.type===mouseType.out){
e.type=touchType.end;
} e.touches=[];
e.pageX=e.clientX;
e.pageY=e.clientX;
e.touches[0]=e;
}
function MSPointerHandler(e,cb) {
commonHandler(e);
cb(e);
}
function pointerHandler (e,cb) {
commonHandler(e);
cb(e);
}
function touchHandler (e,cb) {
cb(e);
} function mouseHandler (e,cb) {
commonHandler(e);
cb(e);
} })();

touchfix.js

 TouchFix.bind(element,"touchstart",function(e){
var t=e.touches[0];
var x=t.pageX;
var y=t.pageY;
});
TouchFix.bind(element,"touchmove",function(e){
var t=e.touches[0];
var x=t.pageX;
var y=t.pageY;
});
TouchFix.bind(element,"touchend",function(e){
//在安卓中貌似在这里获取不到e,只能用move中的最后一个点代替
if(!e||!e.touches||e.touches.length===0){
return ;
}
var t=e.touches[0];
var x=t.pageX;
var y=t.pageY;
});

windows phone和android,ios的touch事件兼容的更多相关文章

  1. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  2. Android 编程下 Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  3. ios 的touch事件分析

    IOS之触摸事件和手势   13.1 事件概述 13.2 触摸事件 13.3 手势 13.1 事件概述 事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象. 系统将事件按照特定的路 ...

  4. Android 编程下Touch 事件的分发和消费机制和OnTouchListener,OnClickListener和OnLongClickListener的关系

    1.事件分发:public boolean dispatchTouchEvent(MotionEvent ev) Touch 事件发生时 Activity 的 dispatchTouchEvent(M ...

  5. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  6. Android 编程下Touch 事件的分发和消费机制

    1.事件分发:public boolean dispatchTouchEvent(MotionEvent ev) Touch 事件发生时 Activity 的 dispatchTouchEvent(M ...

  7. 【转】iOS学习之iOS禁止Touch事件

    iOS程序中有时会有需要禁止应用接收Touch的要求(比如动画进行时,防止触摸事件触发新方法). 一.一般有两种: 1.弄个遮罩层,禁止交互: 2.使用UIApplication中的方法进行相关的交互 ...

  8. EasyRTMP实现的一套简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)RTMP直播推送库

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52938980 EasyRTMP介绍 Easy ...

  9. Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇

    2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...

随机推荐

  1. _func_

    __func__标识符 引用:http://blog.csdn.net/zhoujunyi/article/details/1572325 __func__是C99标准里面预定义标识符, 它是一个st ...

  2. C\C++ 框架和库整理(转)

    [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...

  3. 【风马一族_php】PHP与Mysql建立连接

    让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache      ../apache/conf/httpd.conf 创建p ...

  4. [leetcode]_String to Integer (atoi)

    非常考虑思维全面性的一道题,考验是否能够考虑本问题的方方面面. 题目:将一个string转换为int.实现函数atoi()的功能. 先应该明确atoi()有哪些特殊功能:(正常的正负数情况我就不列了) ...

  5. Ajax的get请求向服务器请求数据五步骤?

    如下: ①创建ajax对象 ②建立http请求 ③发送http请求 ④设置ajax对象状态改变的回调函数 ⑤判断ajax状态是否等于4,做相应的业务逻辑

  6. Ubuntu 14.04 安装flash插件

    分别tar.gz和apt-get方法 第一种: adboe官网下载tar.gz,进入terminal 1.解压缩包,输入命令“tar -zxvf 软件包名字” 2.拷贝插件到mozilla目录,输入命 ...

  7. 了解Unix进程(2)

    1. 每个进程都有一个名字,crusher 可以得到: # process name puts $PROGRAM_NAME 10.downto(1) do | num | $PROGRAM_NAME ...

  8. Json 调用 天气API 实例

    百度了一下,找了点别人的方法改进了一下. 获取天气网址:http://www.weather.com.cn/html/weather/101210701.shtml这里是温州的,当然其他城市自己搜索一 ...

  9. linux内核SPI总线驱动分析(二)(转)

    简而言之,SPI驱动的编写分为: 1.spi_device就构建并注册  在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3 ...

  10. XAML特殊字符

    此部分只限制在XAML中,代码中不受此类限制. 1.特殊字符转义 XAML 特殊字符转义 特殊字符 转义 小于号 < < 大于号 > > 取址符 & & 引号 ...