JavaScript将触摸事件映射到鼠标事件

我正在使用YUI滑块来操作鼠标移动事件。 我想让它响应touchmove事件(iPhone和Android)。 触摸移动事件发生时,如何产生鼠标移动事件? 我希望只需在顶部添加一些脚本,touchmove事件就会映射到鼠标移动事件上,而不必用滑块来更改任何内容。


我相信这是你想要的:

function touchHandler(event)
{
    var touches = event.changedTouches,
        first = touches[0],
        type = "";
    switch(event.type)
    {
        case "touchstart": type = "mousedown"; break;
        case "touchmove":  type = "mousemove"; break;        
        case "touchend":   type = "mouseup";   break;
        default:           return;
    }

    // initMouseEvent(type, canBubble, cancelable, view, clickCount, 
    //                screenX, screenY, clientX, clientY, ctrlKey, 
    //                altKey, shiftKey, metaKey, button, relatedTarget);

    var simulatedEvent = document.createEvent("MouseEvent");
    simulatedEvent.initMouseEvent(type, true, true, window, 1, 
                                  first.screenX, first.screenY, 
                                  first.clientX, first.clientY, false, 
                                  false, false, false, 0/*left*/, null);

    first.target.dispatchEvent(simulatedEvent);
    event.preventDefault();
}

function init() 
{
    document.addEventListener("touchstart", touchHandler, true);
    document.addEventListener("touchmove", touchHandler, true);
    document.addEventListener("touchend", touchHandler, true);
    document.addEventListener("touchcancel", touchHandler, true);    
}

我捕获了触摸事件,然后手动触发我自己的鼠标事件进行匹配。 虽然代码不是特别通用,但适应大多数现有的拖放库以及大多数现有的鼠标事件代码应该是微不足道的。 希望这个想法对于为iPhone开发Web应用程序的人来说非常方便。

更新:

在发布这篇文章时,我注意到在所有触摸事件中调用preventDefault将阻止链接正常工作。 完全调用preventDefault主要原因是阻止手机滚动,并且只能通过touchmove回调来调用它。 这样做的唯一缺点是iPhone有时会在拖动原点上显示悬停弹出窗口。 如果我发现一种方法来防止这种情况发生,我会更新这篇文章。

第二次更新:

我找到了CSS属性来关闭标注: -webkit-touch-callout


沿着@Mickey Shine的答案,Touch Punch提供了触摸事件到点击事件的映射。 它的构建是为了将这种支持加入到jQuery UI中,但代码是提供信息的。


对于未来的用户,可以使用以下代码来回顾以下代码:

var eventMap = {};

(function(){
var eventReplacement = {
    "mousedown": ["touchstart mousedown", "mousedown"],
    "mouseup": ["touchend mouseup", "mouseup"],
    "click": ["touchstart click", "click"],
    "mousemove": ["touchmove mousemove", "mousemove"]
};


for (i in eventReplacement) {
    if (typeof window["on" + eventReplacement[i][0]] == "object") {
        eventMap[i] = eventReplacement[i][0];
    } 
    else {
        eventMap[i] = eventReplacement[i][1];
    };
 };
})();

然后在事件中使用如下所示:

$(".yourDiv").on(eventMap.mouseup, function(event) {
      //your code
}
链接地址: http://www.djcxy.com/p/95639.html

上一篇: JavaScript mapping touch events to mouse events

下一篇: How to override three finger accessibility zoom gesture?