From c72e2e0f06d8ab691dfd541a1f3d872d8cb1a701 Mon Sep 17 00:00:00 2001 From: Michael Deal Date: Wed, 21 Nov 2012 02:25:41 -0800 Subject: [PATCH] update event library --- js/Window/Event.js | 143 ++++++++++++++++++++++++++------------------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/js/Window/Event.js b/js/Window/Event.js index f3c39bf..74893c1 100644 --- a/js/Window/Event.js +++ b/js/Window/Event.js @@ -1,13 +1,23 @@ /* ---------------------------------------------------- - Event.js : 1.0.9 : 2012/07/28 : MIT License + Event.js : 1.1.1 : 2012/11/19 : MIT License ---------------------------------------------------- https://github.com/mudcube/Event.js ---------------------------------------------------- - 1 : click, dblclick, dbltap - 1+ : tap, longpress, drag, swipe - 2+ : pinch, rotate - : mousewheel, devicemotion, shake + 1 : click, dblclick, dbltap + 1+ : tap, longpress, drag, swipe + 2+ : pinch, rotate + : mousewheel, devicemotion, shake + ---------------------------------------------------- + TODO + ---------------------------------------------------- + * switch configuration to 4th argument on addEventListener + * bbox calculation for elements scaled with transform. + ---------------------------------------------------- + NOTES + ---------------------------------------------------- + * When using other libraries that may have built in "Event" namespace, + i.e. Typescript, you can use "eventjs" instead of "Event" for all example calls. ---------------------------------------------------- REQUIREMENTS: querySelector, querySelectorAll ---------------------------------------------------- @@ -88,8 +98,8 @@ console.log(self.identifier); console.log(self.start); console.log(self.fingers); // somewhere between "2" and "4". - self.disable(); // disable event. - self.enable(); // enable event. + self.pause(); // disable event. + self.resume(); // enable event. self.remove(); // remove event. } }); @@ -212,6 +222,7 @@ */ if (typeof(Event) === "undefined") var Event = {}; +if (typeof(eventjs) === "undefined") var eventjs = Event; Event = (function(root) { "use strict"; @@ -258,26 +269,39 @@ root.supports = function (target, type) { if (target.setAttribute && target.removeAttribute) { target.setAttribute(type, ""); var isSupported = typeof target[type] === "function"; - if (typeof target[type] !== "undefined") target[type] = undefined; + if (typeof target[type] !== "undefined") target[type] = null; target.removeAttribute(type); return isSupported; } }; +var clone = function (obj) { + if (!obj || typeof (obj) !== 'object') return obj; + var temp = new obj.constructor(); + for (var key in obj) { + if (!obj[key] || typeof (obj[key]) !== 'object') { + temp[key] = obj[key]; + } else { // clone sub-object + temp[key] = clone(obj[key]); + } + } + return temp; +}; + /// Handle custom *EventListener commands. -var eventManager = function(target, type, listener, configure, trigger) { +var eventManager = function(target, type, listener, configure, trigger, fromOverwrite) { configure = configure || {}; // Check for element to load on interval (before onload). if (typeof(target) === "string" && type === "ready") { - var time = (new Date).getTime(); + var time = (new Date()).getTime(); var timeout = configure.timeout; var ms = configure.interval || 1000 / 60; - var interval = setInterval(function() { - if ((new Date).getTime() - time > timeout) { - clearInterval(interval); + var interval = window.setInterval(function() { + if ((new Date()).getTime() - time > timeout) { + window.clearInterval(interval); } if (document.querySelector(target)) { - clearInterval(interval); + window.clearInterval(interval); listener(); } }, ms); @@ -292,11 +316,12 @@ var eventManager = function(target, type, listener, configure, trigger) { } } /// Handle multiple targets. + var event; + var events = {}; if (target.length > 0) { - var events = {}; - for (var n = 0, length = target.length; n < length; n ++) { - var event = eventManager(target[n], type, listener, clone(configure), trigger); - if (event) events[n] = event; + for (var n0 = 0, length0 = target.length; n0 < length0; n0 ++) { + event = eventManager(target[n0], type, listener, clone(configure), trigger); + if (event) events[n0] = event; } return createBatchCommands(events); } @@ -305,18 +330,17 @@ var eventManager = function(target, type, listener, configure, trigger) { if (type.indexOf && type.indexOf(",") !== -1) type = type.split(","); // Attach or remove multiple events associated with a target. if (typeof(type) !== "string") { // Has multiple events. - var events = {}; if (typeof(type.length) === "number") { // Handle multiple listeners glued together. - for (var n = 0, length = type.length; n < length; n ++) { // Array [type] - var event = eventManager(target, type[n], listener, clone(configure), trigger); - if (event) events[type[n]] = event; + for (var n1 = 0, length1 = type.length; n1 < length1; n1 ++) { // Array [type] + event = eventManager(target, type[n1], listener, clone(configure), trigger); + if (event) events[type[n1]] = event; } } else { // Handle multiple listeners. for (var key in type) { // Object {type} if (typeof(type[key]) === "function") { // without configuration. - var event = eventManager(target, key, type[key], clone(configure), trigger); + event = eventManager(target, key, type[key], clone(configure), trigger); } else { // with configuration. - var event = eventManager(target, key, type[key].listener, clone(type[key]), trigger); + event = eventManager(target, key, type[key].listener, clone(type[key]), trigger); } if (event) events[key] = event; } @@ -324,12 +348,12 @@ var eventManager = function(target, type, listener, configure, trigger) { return createBatchCommands(events); } // Ensure listener is a function. - if (typeof(listener) !== "function") return createError("Listener is not a function! ", target, type, listener); + if (typeof(listener) !== "function") return createError("Listener is not a function!"); // Generate a unique wrapper identifier. var useCapture = configure.useCapture || false; var id = normalize(type) + getID(target) + "." + getID(listener) + "." + (useCapture ? 1 : 0); // Handle the event. - if (root.Gesture._gestureHandlers[type]) { // Fire custom event. + if (root.Gesture && root.Gesture._gestureHandlers[type]) { // Fire custom event. if (trigger === "remove") { // Remove event listener. if (!wrappers[id]) return; // Already removed. wrappers[id].remove(); @@ -339,7 +363,7 @@ var eventManager = function(target, type, listener, configure, trigger) { // Retains "this" orientation. if (configure.useCall && !root.modifyEventListener) { var tmp = listener; - var listener = function(event, self) { + listener = function(event, self) { for (var key in self) event[key] = self[key]; return tmp.call(target, event); }; @@ -348,11 +372,12 @@ var eventManager = function(target, type, listener, configure, trigger) { configure.gesture = type; configure.target = target; configure.listener = listener; + configure.fromOverwrite = fromOverwrite; // Record wrapper. wrappers[id] = root.proxy[type](configure); } } else { // Fire native event. - var type = normalize(type); + type = normalize(type); if (trigger === "remove") { // Remove event listener. if (!wrappers[id]) return; // Already removed. target[remove](type, listener, useCapture); @@ -394,7 +419,7 @@ var createBatchCommands = function(events) { var createError = function(message) { if (typeof(console) === "undefined") return; if (typeof(console.error) === "undefined") return; - console.error(arguments); + console.error(message); }; /// Handle naming discrepancies between platforms. @@ -426,7 +451,7 @@ var normalize = (function() { } else { return type; } - } + }; })(); /// Event wrappers to keep track of all events placed in the window. @@ -477,7 +502,7 @@ if (root.modifyEventListener) (function() { var handle = trigger + "EventListener"; var handler = proto[handle]; proto[handle] = function (type, listener, useCapture) { - if (root.Gesture._gestureHandlers[type]) { // capture custom events. + if (root.Gesture && root.Gesture._gestureHandlers[type]) { // capture custom events. var configure = useCapture; if (typeof(useCapture) === "object") { configure.useCall = true; @@ -485,9 +510,9 @@ if (root.modifyEventListener) (function() { configure = { useCall: true, useCapture: useCapture - } + }; } - eventManager(this, type, listener, configure, trigger); + eventManager(this, type, listener, configure, trigger, true); handler.call(this, type, listener, useCapture); } else { // use native function. handler.call(this, normalize(type), listener, useCapture); @@ -527,8 +552,6 @@ if (root.modifySelectors) (function() { return root; })(Event); - - /* ---------------------------------------------------- Event.proxy : 0.4.2 : 2012/07/29 : MIT License @@ -577,7 +600,7 @@ root.pointerSetup = function(conf, self) { self.target = conf.target; self.pointerType = Event.pointerType; /// - if (Event.modifyEventListener) conf.listener = Event.createPointerEvent; + if (Event.modifyEventListener && conf.fromOverwrite) conf.listener = Event.createPointerEvent; /// Convenience commands. var fingers = 0; var type = self.gesture.indexOf("pointer") === 0 && Event.modifyEventListener ? "pointer" : "mouse"; @@ -732,7 +755,7 @@ root.pointerEnd = function(event, self, conf, onPointerUp) { } } /* - // This should work but fails in Safari on iOS4. + // This should work but fails in Safari on iOS4 so not using it. var touches = event.changedTouches || root.getCoords(event); var length = touches.length; // Record changed touches have ended (this should work). @@ -912,8 +935,6 @@ root.getBoundingBox = function(o) { return root; })(Event.proxy); - - /* "Click" event proxy. ---------------------------------------------------- @@ -978,8 +999,6 @@ Event.Gesture._gestureHandlers.click = root.click; return root; })(Event.proxy); - - /* "Double-Click" aka "Double-Tap" event proxy. ---------------------------------------------------- @@ -1074,8 +1093,6 @@ Event.Gesture._gestureHandlers.dblclick = root.dblclick; return root; })(Event.proxy); - - /* "Drag" event proxy (1+ fingers). ---------------------------------------------------- @@ -1167,8 +1184,6 @@ Event.Gesture._gestureHandlers.drag = root.drag; return root; })(Event.proxy); - - /* "Gesture" event proxy (2+ fingers). ---------------------------------------------------- @@ -1317,8 +1332,6 @@ Event.Gesture._gestureHandlers.gesture = root.gesture; return root; })(Event.proxy); - - /* "Pointer" event proxy (1+ fingers). ---------------------------------------------------- @@ -1374,8 +1387,6 @@ Event.Gesture._gestureHandlers.pointerup = root.pointerup; return root; })(Event.proxy); - - /* "Device Motion" and "Shake" event proxy. ---------------------------------------------------- @@ -1479,8 +1490,6 @@ Event.Gesture._gestureHandlers.shake = root.shake; return root; })(Event.proxy); - - /* "Swipe" event proxy (1+ fingers). ---------------------------------------------------- @@ -1531,10 +1540,24 @@ root.swipe = function(conf) { var velocity2 var degree1; var degree2; + /// Calculate centroid of gesture. + var start = { x: 0, y: 0 }; + var endx = 0; + var endy = 0; + var length = 0; + /// for (var sid in conf.tracker) { var touch = conf.tracker[sid]; var xdist = touch.move.x - touch.start.x; var ydist = touch.move.y - touch.start.y; + + endx += touch.move.x; + endy += touch.move.y; + start.x += touch.start.x; + start.y += touch.start.y; + length ++; + + var distance = Math.sqrt(xdist * xdist + ydist * ydist); var ms = touch.moveTime - touch.startTime; var degree2 = Math.atan2(xdist, ydist) / RAD_DEG + 180; @@ -1548,8 +1571,14 @@ root.swipe = function(conf) { } else { return; } - } + } + /// if (velocity1 > conf.threshold) { + start.x /= length; + start.y /= length; + self.start = start; + self.x = endx / length; + self.y = endy / length; self.angle = -((((degree1 / conf.snap + 0.5) >> 0) * conf.snap || 360) - 360); self.velocity = velocity1; self.fingers = conf.gestureFingers; @@ -1573,8 +1602,6 @@ Event.Gesture._gestureHandlers.swipe = root.swipe; return root; })(Event.proxy); - - /* "Tap" and "Longpress" event proxy. ---------------------------------------------------- @@ -1691,8 +1718,6 @@ Event.Gesture._gestureHandlers.longpress = root.longpress; return root; })(Event.proxy); - - /* "Mouse Wheel" event proxy. ---------------------------------------------------- @@ -1726,7 +1751,7 @@ root.wheel = function(conf) { var onMouseWheel = function(event) { event = event || window.event; self.state = count++ ? "change" : "start"; - self.wheelDelta = event.detail ? event.detail * -40 : event.wheelDelta; + self.wheelDelta = event.detail ? event.detail * -20 : event.wheelDelta; conf.listener(event, self); clearTimeout(interval); interval = setTimeout(function() { @@ -1751,6 +1776,4 @@ Event.Gesture._gestureHandlers.wheel = root.wheel; return root; -})(Event.proxy); - - +})(Event.proxy); \ No newline at end of file