考虑到 gregers 对 win8 和 chrome/firefox 的评论,skyisred 的评论毕竟看起来并不那么愚蠢(:P @ all the haters)尽管我宁愿使用黑名单而不是他建议的白名单,只排除 Android触摸绑定:
var ua = navigator.userAgent.toLowerCase(),
isAndroid = ua.indexOf("android") != -1,
supportsPointer = !!window.navigator.msPointerEnabled,
ev_pointer = function(e) { ... }, // function to handle IE10's pointer events
ev_touch = function(e) { ... }, // function to handle touch events
ev_mouse = function(e) { ... }; // function to handle mouse events
if (supportsPointer) { // IE10 / Pointer Events
// reset binds
$("yourSelectorHere").on('MSPointerDown MSPointerMove MSPointerUp', ev_pointer);
} else {
$("yourSelectorHere").on('touchstart touchmove touchend', ev_touch); // touch events
if(!isAndroid) {
// in androids native browser mouse events are sometimes triggered directly w/o a preceding touchevent (most likely a bug)
// bug confirmed in android 4.0.3 and 4.1.2
$("yourSelectorHere").on('mousedown mousemove mouseup mouseleave', ev_mouse); // mouse events
}
}
顺便说一句:我发现鼠标事件并不总是被触发(如果使用了 stopPropagation 和 preventDefault),特别是我只注意到在 touchend 事件之前直接有一个额外的 mousemove ......真的很奇怪,但上面的代码为我修复了所有(测试了 OSX、Win、iOS 5+6、Android 2+4,每个都使用本机浏览器、Chrome、Firefox、IE、Safari 和 Opera(如果可用)平台。