Skip to content

Instantly share code, notes, and snippets.

@gfcarvalho
Created March 15, 2014 03:08
Show Gist options
  • Save gfcarvalho/9561328 to your computer and use it in GitHub Desktop.
Save gfcarvalho/9561328 to your computer and use it in GitHub Desktop.
Simulate Mouse Events in Touch Environments
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);
}
@gfcarvalho
Copy link
Author

Calling preventDefault on all touch events will prevent links from working properly. The main reason to call preventDefault at all is to stop the phone from scrolling, and you can do that by calling it only on the touchmove callback. The only downside to doing it this way is that the iPhone will sometimes display its hover popup over the drag origin. Use the floowing CSS property to turn off the callout: -webkit-touch-callout.

Font: JavaScript mapping touch events to mouse events on StackOverflow

Useful links:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Touch_events

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment