mirror of
https://github.com/Hopiu/jquery-mobile.git
synced 2026-05-11 16:13:11 +00:00
135 lines
No EOL
3.8 KiB
JavaScript
135 lines
No EOL
3.8 KiB
JavaScript
/*
|
|
* 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); |