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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我正在使用YUI滑块,它使用鼠标移动事件操作。我想让它对触屏事件(iPhone和Android)做出反应。当发生触摸移动事件时,如何生成鼠标移动事件?我希望,只要在顶部添加一些脚本,触地移动事件就会映射到鼠标移动事件,并且我将不必用滑块改变任何事情。

提问于
用户回答回答于

我相信这是你想要的:

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

用户回答回答于

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

扫码关注云+社区