mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 02:50:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			210 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
| * jQuery.UI.iPad plugin
 | |
| * Copyright (c) 2010 Stephen von Takach
 | |
| * licensed under MIT.
 | |
| * Date: 27/8/2010
 | |
| *
 | |
| * Project Home: 
 | |
| * http://code.google.com/p/jquery-ui-for-ipad-and-iphone/
 | |
| *
 | |
| * Modified: 19/01/2012 
 | |
| * Organized as a proper plugin and added addTouch()
 | |
| */
 | |
| 
 | |
| (function (factory) {
 | |
|     if (typeof define === 'function' && define.amd) {
 | |
|         // AMD. Register as an anonymous module.
 | |
|         define(['jquery'], factory);
 | |
|     } else if (typeof module === 'object' && module.exports) {
 | |
|         // Node/CommonJS
 | |
|         module.exports = factory(require('jquery'));
 | |
|     } else {
 | |
|         // Browser globals
 | |
|         factory(jQuery);
 | |
|     }
 | |
| }(function ($) {
 | |
| 	
 | |
| 	var lastTap = null;				// Holds last tapped element (so we can compare for double tap)
 | |
| 	var tapValid = false;			// Are we still in the .6 second window where a double tap can occur
 | |
| 	var tapTimeout = null;			// The timeout reference
 | |
| 	var rightClickPending = false;	// Is a right click still feasible
 | |
| 	var rightClickEvent = null;		// the original event
 | |
| 	var holdTimeout = null;			// timeout reference
 | |
| 	var cancelMouseUp = false;		// prevents a click from occuring as we want the context menu
 | |
| 
 | |
| 	function cancelTap() {
 | |
| 		tapValid = false;
 | |
| 	};
 | |
| 	
 | |
| 	function cancelHold() {
 | |
| 		if (rightClickPending) {
 | |
| 			window.clearTimeout(holdTimeout);
 | |
| 			rightClickPending = false;
 | |
| 			rightClickEvent = null;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	function startHold(event) {
 | |
| 		if (rightClickPending)
 | |
| 			return;
 | |
| 
 | |
| 		rightClickPending = true; // We could be performing a right click
 | |
| 		rightClickEvent = (event.changedTouches)[0];
 | |
| 		holdTimeout = window.setTimeout(doRightClick, 800);
 | |
| 	};
 | |
| 
 | |
| 	function doRightClick() {
 | |
| 		rightClickPending = false;
 | |
| 
 | |
| 		// We need to mouse up (as we were down)
 | |
| 		var first = rightClickEvent,
 | |
| 			simulatedEvent = document.createEvent("MouseEvent");
 | |
| 		simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 				false, false, false, false, 0, null);
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 		// Emulate a right click
 | |
| 		simulatedEvent = document.createEvent("MouseEvent");
 | |
| 		simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 				false, false, false, false, 2, null);
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 		// Show a context menu
 | |
| 		simulatedEvent = document.createEvent("MouseEvent");
 | |
| 		simulatedEvent.initMouseEvent("contextmenu", true, true, window, 1, first.screenX + 50, first.screenY + 5, first.clientX + 50, first.clientY + 5,
 | |
| 	                                  false, false, false, false, 2, null);
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 		// Note: I don't mouse up the right click here however feel free to add if required
 | |
| 		cancelMouseUp = true;
 | |
| 		rightClickEvent = null; // Release memory
 | |
| 	};
 | |
| 
 | |
| 	// mouse over event then mouse down
 | |
| 	function iPadTouchStart(event) {
 | |
| 		var touches = event.changedTouches,
 | |
| 			first = touches[0],
 | |
| 			type = "mouseover",
 | |
| 			simulatedEvent = document.createEvent("MouseEvent");
 | |
| 
 | |
| 		// Mouse over first - I have live events attached on mouse over
 | |
| 		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 	                            false, false, false, false, 0, null);
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 		type = "mousedown";
 | |
| 		simulatedEvent = document.createEvent("MouseEvent");
 | |
| 
 | |
| 		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 	                            false, false, false, false, 0, null);
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 
 | |
| 		if (!tapValid) {
 | |
| 			lastTap = first.target;
 | |
| 			tapValid = true;
 | |
| 			tapTimeout = window.setTimeout(cancelTap, 600);
 | |
| 			startHold(event);
 | |
| 		}
 | |
| 		else {
 | |
| 			window.clearTimeout(tapTimeout);
 | |
| 
 | |
| 			// If a double tap is still a possibility and the elements are the same then perform a double click
 | |
| 			if (first.target == lastTap) {
 | |
| 				lastTap = null;
 | |
| 				tapValid = false;
 | |
| 
 | |
| 				type = "click";
 | |
| 				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);
 | |
| 
 | |
| 				type = "dblclick";
 | |
| 				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);
 | |
| 			}
 | |
| 			else {
 | |
| 				lastTap = first.target;
 | |
| 				tapValid = true;
 | |
| 				tapTimeout = window.setTimeout(cancelTap, 600);
 | |
| 				startHold(event);
 | |
| 			}
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	function iPadTouchHandler(event) {
 | |
| 		var type = "",
 | |
| 			button = 0; /*left*/
 | |
| 
 | |
| 		if (event.touches.length > 1)
 | |
| 			return;
 | |
| 
 | |
| 		switch (event.type) {
 | |
| 			case "touchstart":
 | |
| 				if ($(event.changedTouches[0].target).is("select")) {
 | |
| 					return;
 | |
| 				}
 | |
| 				iPadTouchStart(event); /*We need to trigger two events here to support one touch drag and drop*/
 | |
| 				event.preventDefault();
 | |
| 				return false;
 | |
| 				break;
 | |
| 
 | |
| 			case "touchmove":
 | |
| 				cancelHold();
 | |
| 				type = "mousemove";
 | |
| 				event.preventDefault();
 | |
| 				break;
 | |
| 
 | |
| 			case "touchend":
 | |
| 				if (cancelMouseUp) {
 | |
| 					cancelMouseUp = false;
 | |
| 					event.preventDefault();
 | |
| 					return false;
 | |
| 				}
 | |
| 				cancelHold();
 | |
| 				type = "mouseup";
 | |
| 				break;
 | |
| 
 | |
| 			default:
 | |
| 				return;
 | |
| 		}
 | |
| 
 | |
| 		var touches = event.changedTouches,
 | |
| 			first = touches[0],
 | |
| 			simulatedEvent = document.createEvent("MouseEvent");
 | |
| 
 | |
| 		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 	                            false, false, false, false, button, null);
 | |
| 
 | |
| 		first.target.dispatchEvent(simulatedEvent);
 | |
| 
 | |
| 		if (type == "mouseup" && tapValid && first.target == lastTap) {	// This actually emulates the ipads default behaviour (which we prevented)
 | |
| 			simulatedEvent = document.createEvent("MouseEvent");		// This check avoids click being emulated on a double tap
 | |
| 
 | |
| 			simulatedEvent.initMouseEvent("click", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | |
| 	                            false, false, false, false, button, null);
 | |
| 
 | |
| 			first.target.dispatchEvent(simulatedEvent);
 | |
| 		}
 | |
| 	};
 | |
| 	
 | |
| 	var touchAvailable = ("ontouchend" in document);
 | |
| 
 | |
| 	$.fn.addTouch = function() {
 | |
| 	    if (touchAvailable) {
 | |
|             this.each(function(i,el){
 | |
|                 el.addEventListener("touchstart", iPadTouchHandler, false);
 | |
|                 el.addEventListener("touchmove", iPadTouchHandler, false);
 | |
|                 el.addEventListener("touchend", iPadTouchHandler, false);
 | |
|                 el.addEventListener("touchcancel", iPadTouchHandler, false);
 | |
|             });
 | |
| 	    }
 | |
| 	};
 | |
| 
 | |
| }));
 |