根据W3C(万维网联盟)
的规定:
var e = document.createEvent('TouchEvent');
那么,请同时更改
。
e.initMouseEvent();
to
e.initTouchEvent();
由于你创建了一个touchstart
事件。
W3C链接中提到:
一些用户代理实现了initTouchEvent方法作为TouchEvent接口的一部分。当此方法可用时,脚本可以使用它来初始化TouchEvent对象的属性,包括其TouchList属性(可以使用从createTouchList返回的值进行初始化)。initTouchEvent方法尚未标准化,但是它可能以某种形式出现在未来的规范中。
因此,你可能需要采用e.initUIEvent('touchstart', true, true);
。
此外,官方规范还指出,TouchList
对象是可选的,并且可以使用createTouchList
方法手动创建。要将touch添加到该列表中,您必须调用createTouch
方法,在其中传递所有坐标等参数:
6.1 方法
#createTouch
创建具有指定属性的Touch对象。
参数 | 类型 | 可为空 | 可选 | 描述
view | WindowProxy | ✘ | ✘ |
target | EventTarget | ✘ | ✘ |
identifier| long | ✘ | ✘ |
pageX | long | ✘ | ✘ |
pageY | long | ✘ | ✘ |
screenX | long | ✘ | ✘ |
screenY | long | ✘ | ✘ |
返回类型: Touch
#createTouchList
创建由零个或多个Touch对象组成的TouchList对象。调用此方法而不带参数会创建一个没有任何对象且长度为0(零)的TouchList。
参数 | 类型 | 可为空 | 可选 | 描述
touches | Touch | ✘ | ✔ |
返回类型: TouchList
如果这不起作用,您可以尝试以下内容:
var e = document.createEvent('UIEvent');
e.initUIEvent();
应该可以正常工作,毕竟比createEvent('MouseEvent')
更合理...
但是为了测试目的,为什么不打开您的Chrome控制台并检查模拟触摸事件
,并覆盖用户代理到Android 4(Ctrl + Shift + j>单击右下角的齿轮图标,然后选择“覆盖”,您将找到所有需要的设置)
由于触摸事件在标准化方面还有很长的路要走,因此touches
属性尚未只读(是否?),因此您可以使用此快速修复程序(OP使用并获得期望的结果)。
var e = document.createEvent('TouchEvent');
e.touches = [{pageX: pageX, pageY: pageY}];
我认为(如果不是这种情况,我无法相信)这比以下方式更快:
e.touches = e.createTouchList(
e.createTouch(window, target, 0, pageX, pageY, screenX, screenY)
);