Spaces:
Runtime error
Runtime error
/*! | |
* jQuery UI Touch Punch 0.2.2 | |
* | |
* Copyright 2011, Dave Furfero | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* | |
* Depends: | |
* jquery.ui.widget.js | |
* jquery.ui.mouse.js | |
*/ | |
(function ($) { | |
// Detect touch support | |
$.support.touch = 'ontouchend' in document; | |
// Ignore browsers without touch support | |
if (!$.support.touch) { | |
return; | |
} | |
var mouseProto = $.ui.mouse.prototype, | |
_mouseInit = mouseProto._mouseInit, | |
touchHandled; | |
/** | |
* Simulate a mouse event based on a corresponding touch event | |
* @param {Object} event A touch event | |
* @param {String} simulatedType The corresponding mouse event | |
*/ | |
function simulateMouseEvent (event, simulatedType) { | |
// Ignore multi-touch events | |
if (event.originalEvent.touches.length > 1) { | |
return; | |
} | |
event.preventDefault(); | |
var touch = event.originalEvent.changedTouches[0], | |
simulatedEvent = document.createEvent('MouseEvents'); | |
// Initialize the simulated mouse event using the touch event's coordinates | |
simulatedEvent.initMouseEvent( | |
simulatedType, // type | |
true, // bubbles | |
true, // cancelable | |
window, // view | |
1, // detail | |
touch.screenX, // screenX | |
touch.screenY, // screenY | |
touch.clientX, // clientX | |
touch.clientY, // clientY | |
false, // ctrlKey | |
false, // altKey | |
false, // shiftKey | |
false, // metaKey | |
0, // button | |
null // relatedTarget | |
); | |
// Dispatch the simulated event to the target element | |
event.target.dispatchEvent(simulatedEvent); | |
} | |
/** | |
* Handle the jQuery UI widget's touchstart events | |
* @param {Object} event The widget element's touchstart event | |
*/ | |
mouseProto._touchStart = function (event) { | |
var self = this; | |
// Ignore the event if another widget is already being handled | |
if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) { | |
return; | |
} | |
// Set the flag to prevent other widgets from inheriting the touch event | |
touchHandled = true; | |
// Track movement to determine if interaction was a click | |
self._touchMoved = false; | |
// Simulate the mouseover event | |
simulateMouseEvent(event, 'mouseover'); | |
// Simulate the mousemove event | |
simulateMouseEvent(event, 'mousemove'); | |
// Simulate the mousedown event | |
simulateMouseEvent(event, 'mousedown'); | |
}; | |
/** | |
* Handle the jQuery UI widget's touchmove events | |
* @param {Object} event The document's touchmove event | |
*/ | |
mouseProto._touchMove = function (event) { | |
// Ignore event if not handled | |
if (!touchHandled) { | |
return; | |
} | |
// Interaction was not a click | |
this._touchMoved = true; | |
// Simulate the mousemove event | |
simulateMouseEvent(event, 'mousemove'); | |
}; | |
/** | |
* Handle the jQuery UI widget's touchend events | |
* @param {Object} event The document's touchend event | |
*/ | |
mouseProto._touchEnd = function (event) { | |
// Ignore event if not handled | |
if (!touchHandled) { | |
return; | |
} | |
// Simulate the mouseup event | |
simulateMouseEvent(event, 'mouseup'); | |
// Simulate the mouseout event | |
simulateMouseEvent(event, 'mouseout'); | |
// If the touch interaction did not move, it should trigger a click | |
if (!this._touchMoved) { | |
// Simulate the click event | |
simulateMouseEvent(event, 'click'); | |
} | |
// Unset the flag to allow other widgets to inherit the touch event | |
touchHandled = false; | |
}; | |
/** | |
* A duck punch of the $.ui.mouse _mouseInit method to support touch events. | |
* This method extends the widget with bound touch event handlers that | |
* translate touch events to mouse events and pass them to the widget's | |
* original mouse event handling methods. | |
*/ | |
mouseProto._mouseInit = function () { | |
var self = this; | |
// Delegate the touch handlers to the widget's element | |
self.element | |
.bind('touchstart', $.proxy(self, '_touchStart')) | |
.bind('touchmove', $.proxy(self, '_touchMove')) | |
.bind('touchend', $.proxy(self, '_touchEnd')); | |
// Call the original $.ui.mouse init method | |
_mouseInit.call(self); | |
}; | |
})(jQuery); |