From 518f2175f1222ee06d74461b7fc52f93134343bb Mon Sep 17 00:00:00 2001 From: Kin Blas Date: Wed, 9 Feb 2011 23:57:29 -0800 Subject: [PATCH] Initial checkin of jquery.mobile.mouse.js. This version doesn't handle touch events yet. --- experiments/fast-click/jquery.mobile.mouse.js | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 experiments/fast-click/jquery.mobile.mouse.js diff --git a/experiments/fast-click/jquery.mobile.mouse.js b/experiments/fast-click/jquery.mobile.mouse.js new file mode 100644 index 00000000..27051870 --- /dev/null +++ b/experiments/fast-click/jquery.mobile.mouse.js @@ -0,0 +1,135 @@ +/* +* jQuery Mobile Framework : "mouse" plugin +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ + +// This plugin is an experiment for abstracting away the touch and mouse +// events so that developers don't have to worry about which method of input +// the device their document is loaded on supports. +// +// The idea here is to allow the developer to register listeners for the +// basic mouse events, such as mousedown, mousemove, mouseup, and click, +// and the plugin will take care of registering the correct listeners +// behind the scenes to invoke the listener at the fastest possible time +// for that device, while still retaining the order of event firing in +// the traditional mouse environment, should multiple handlers be registered +// on the same element for different events. +// +// The current version simply adds mBind and mUnbind to the $.fn space, +// but we're considering other methods for making this easier. One alternative +// would be to allow users to use virtual mouse event names, such as +// "vmousedown", "vmouseup", etc, to trigger the traditional jQuery special/custom +// event api, which would then trigger this same code. + +(function($, window, document, undefined) { + +var dataSequencerName = "mouseEventSequencer"; + +function sequencerEventCallback(event, data) +{ + var seq = $(this).data(dataSequencerName); + if (seq){ + seq.handleEvent(event, data); + } +} + +function MouseEventSequencer(element) +{ + this.element = element; + this.activeHandlers = {}; +} + +$.extend(MouseEventSequencer.prototype, { + bind: function(eventType, data, namespace) { + if (!this.activeHandlers[eventType]){ + this.element.bind(eventType.substr(1), sequencerEventCallback); + this.activeHandlers[eventType] = 0; + } + this.activeHandlers[eventType] = 1; + }, + + unbind: function(eventType, data, namespace) { + if (this.activeHandlers[eventType]){ + --this.activeHandlers[eventType]; + if (!this.activeHandlers[eventType]){ + this.element.unbind(eventType.substr(1), sequencerEventCallback); + } + } + this.activeHandlers[eventType] = 1; + }, + + handleEvent: function(event, data) { + var result; + switch(event.type) { + case "mouseover": + result = this.handleOver(event, data); + break; + case "mousedown": + result = this.handleDown(event, data); + break; + case "mousemove": + result = this.handleMove(event, data); + break; + case "mouseup": + result = this.handleUp(event, data); + break; + case "click": + result = this.handleClick(event, data); + break; + case "mouseout": + result = this.handleOut(event, data); + break; + } + return result; + }, + + handleTouchStart: function(event, data){ + } +}); + +function mouseEventCallback(event, data) { + if (this.ignoreMouseEvents) { + return; + } + event = $.Event(event); + event.type = "v" + event.type; + this.element.trigger(event, data); +} + +var handleFuncNames = "handleOver handleDown handleMove handleUp handleClick handleOut".split(" "); +for (var i = 0; i < handleFuncNames.length; i++) { + MouseEventSequencer.prototype[handleFuncNames[i]] = mouseEventCallback; +} + +function getSpecialEventObject(eventType) +{ + return { + setup: function(data, namespace) { + var $this = $(this); + var seq = $this.data(dataSequencerName); + if (!seq){ + $this.data(dataSequencerName, seq = new MouseEventSequencer($this)); + } + seq.bind(eventType, data, namespace); + }, + + teardown: function(data, namespace) { + var $this = $(this); + var seq = $this.data(dataSequencerName); + if (seq){ + seq.unbind(eventType, data, namespace); + } + } + }; +} + +// Expose our custom events to the jQuery bind/unbind mechanism. + +var vevents = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout".split(" "); +for (var i = 0; i < vevents.length; i++){ + $.event.special[vevents[i]] = getSpecialEventObject(vevents[i]); +} + +})(jQuery, window, document); \ No newline at end of file