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. Custom Sort Order

    When trying to sort based on values that do not fit the standard ascending and descending sort logic ...

  2. url 编码(percentcode 百分号编码)

    http://www.imkevinyang.com/2009/08/%E8%AF%A6%E8%A7%A3javascript%E4%B8%AD%E7%9A%84url%E7%BC%96%E8%A7% ...

  3. [leetcode]_Remove Duplicates from Sorted Array II

    题目:一个有序数组,要求保证数组中的每个元素不能超过2个.  输入:A = [1,1,1,2,2,3]  输出:length = 5, and A is now [1,1,2,2,3] 思路:双指针 ...

  4. JQuery ajax返回JSON时的处理方式

    最近在使用JQuery的ajax方法时,要求返回的数据为json数据,在处理的过程中遇到下面的几个问题,那就是采用不同的方式来生成json数据的时候,在$.ajax方法中应该是如何来处理的,下面依次来 ...

  5. WordPress 撰写文章页面显示所有标签

    WordPress 撰写文章时,点击"从常用标签中选择"只显示45个常用的标签,很多情况下还需手工再次输入标签,这样的限制感觉很不方便,通过下面的方法可以解除这个限制,显示全部标签 ...

  6. C++ string 转 char*

    string 转到 char* char name[20]; string sname=GatherName[n]; strcpy(name,sname.c_str());

  7. PHP搜索MYSQL数据库加分页浏览小结

    PHP搜索加分页浏览小结: 1 分页后再做搜索 2 这里对于url的拼接,以及模糊查询,搜索时候的显示添加,SQL语句的拼接 3 对于页面传递过来的超级链接的变量,如果不存在就要设置,对于可能抛出异常 ...

  8. java作用域public ,private ,protected 及不写时的区别(转)

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...

  9. scala构造器实战

    父类 abstract class Event(val name:String) { var time:Long var content:String } 子类 private[spark] clas ...

  10. Android请求返回417解决办法

    今天碰到个很奇怪的问题,APP通过代理链接服务器会收到HTTP 417错误,经过网上查找发现是由于以下代码造成: HttpParams params = new BasicHttpParams(); ...