172 lines
5.0 KiB
JavaScript
172 lines
5.0 KiB
JavaScript
|
define("dojo/mouse", ["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){
|
||
|
|
||
|
// module:
|
||
|
// dojo/mouse
|
||
|
|
||
|
has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat");
|
||
|
has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div"));
|
||
|
has.add("events-mousewheel", win.doc && 'onmousewheel' in win.doc);
|
||
|
|
||
|
var mouseButtons;
|
||
|
if((has("dom-quirks") && has("ie")) || !has("dom-addeventlistener")){
|
||
|
mouseButtons = {
|
||
|
LEFT: 1,
|
||
|
MIDDLE: 4,
|
||
|
RIGHT: 2,
|
||
|
// helper functions
|
||
|
isButton: function(e, button){ return e.button & button; },
|
||
|
isLeft: function(e){ return e.button & 1; },
|
||
|
isMiddle: function(e){ return e.button & 4; },
|
||
|
isRight: function(e){ return e.button & 2; }
|
||
|
};
|
||
|
}else{
|
||
|
mouseButtons = {
|
||
|
LEFT: 0,
|
||
|
MIDDLE: 1,
|
||
|
RIGHT: 2,
|
||
|
// helper functions
|
||
|
isButton: function(e, button){ return e.button == button; },
|
||
|
isLeft: function(e){ return e.button == 0; },
|
||
|
isMiddle: function(e){ return e.button == 1; },
|
||
|
isRight: function(e){ return e.button == 2; }
|
||
|
};
|
||
|
}
|
||
|
dojo.mouseButtons = mouseButtons;
|
||
|
|
||
|
/*=====
|
||
|
dojo.mouseButtons = {
|
||
|
// LEFT: Number
|
||
|
// Numeric value of the left mouse button for the platform.
|
||
|
LEFT: 0,
|
||
|
// MIDDLE: Number
|
||
|
// Numeric value of the middle mouse button for the platform.
|
||
|
MIDDLE: 1,
|
||
|
// RIGHT: Number
|
||
|
// Numeric value of the right mouse button for the platform.
|
||
|
RIGHT: 2,
|
||
|
|
||
|
isButton: function(e, button){
|
||
|
// summary:
|
||
|
// Checks an event object for a pressed button
|
||
|
// e: Event
|
||
|
// Event object to examine
|
||
|
// button: Number
|
||
|
// The button value (example: dojo.mouseButton.LEFT)
|
||
|
return e.button == button; // Boolean
|
||
|
},
|
||
|
isLeft: function(e){
|
||
|
// summary:
|
||
|
// Checks an event object for the pressed left button
|
||
|
// e: Event
|
||
|
// Event object to examine
|
||
|
return e.button == 0; // Boolean
|
||
|
},
|
||
|
isMiddle: function(e){
|
||
|
// summary:
|
||
|
// Checks an event object for the pressed middle button
|
||
|
// e: Event
|
||
|
// Event object to examine
|
||
|
return e.button == 1; // Boolean
|
||
|
},
|
||
|
isRight: function(e){
|
||
|
// summary:
|
||
|
// Checks an event object for the pressed right button
|
||
|
// e: Event
|
||
|
// Event object to examine
|
||
|
return e.button == 2; // Boolean
|
||
|
}
|
||
|
};
|
||
|
=====*/
|
||
|
|
||
|
function eventHandler(type, selectHandler){
|
||
|
// emulation of mouseenter/leave with mouseover/out using descendant checking
|
||
|
var handler = function(node, listener){
|
||
|
return on(node, type, function(evt){
|
||
|
if(selectHandler){
|
||
|
return selectHandler(evt, listener);
|
||
|
}
|
||
|
if(!dom.isDescendant(evt.relatedTarget, node)){
|
||
|
return listener.call(this, evt);
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
handler.bubble = function(select){
|
||
|
return eventHandler(type, function(evt, listener){
|
||
|
// using a selector, use the select function to determine if the mouse moved inside the selector and was previously outside the selector
|
||
|
var target = select(evt.target);
|
||
|
var relatedTarget = evt.relatedTarget;
|
||
|
if(target && (target != (relatedTarget && relatedTarget.nodeType == 1 && select(relatedTarget)))){
|
||
|
return listener.call(target, evt);
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
return handler;
|
||
|
}
|
||
|
var wheel;
|
||
|
if(has("events-mousewheel")){
|
||
|
wheel = 'mousewheel';
|
||
|
}else{ //firefox
|
||
|
wheel = function(node, listener){
|
||
|
return on(node, 'DOMMouseScroll', function(evt){
|
||
|
evt.wheelDelta = -evt.detail;
|
||
|
listener.call(this, evt);
|
||
|
});
|
||
|
};
|
||
|
}
|
||
|
return {
|
||
|
// summary:
|
||
|
// This module provide mouse event handling utility functions and exports
|
||
|
// mouseenter and mouseleave event emulation.
|
||
|
// example:
|
||
|
// To use these events, you register a mouseenter like this:
|
||
|
// | define(["dojo/on", dojo/mouse"], function(on, mouse){
|
||
|
// | on(targetNode, mouse.enter, function(event){
|
||
|
// | dojo.addClass(targetNode, "highlighted");
|
||
|
// | });
|
||
|
// | on(targetNode, mouse.leave, function(event){
|
||
|
// | dojo.removeClass(targetNode, "highlighted");
|
||
|
// | });
|
||
|
|
||
|
_eventHandler: eventHandler, // for dojo/touch
|
||
|
|
||
|
// enter: Synthetic Event
|
||
|
// This is an extension event for the mouseenter that IE provides, emulating the
|
||
|
// behavior on other browsers.
|
||
|
enter: eventHandler("mouseover"),
|
||
|
|
||
|
// leave: Synthetic Event
|
||
|
// This is an extension event for the mouseleave that IE provides, emulating the
|
||
|
// behavior on other browsers.
|
||
|
leave: eventHandler("mouseout"),
|
||
|
|
||
|
// wheel: Normalized Mouse Wheel Event
|
||
|
// This is an extension event for the mousewheel that non-Mozilla browsers provide,
|
||
|
// emulating the behavior on Mozilla based browsers.
|
||
|
wheel: wheel,
|
||
|
|
||
|
isLeft: mouseButtons.isLeft,
|
||
|
/*=====
|
||
|
isLeft: function(){
|
||
|
// summary:
|
||
|
// Test an event object (from a mousedown event) to see if the left button was pressed.
|
||
|
},
|
||
|
=====*/
|
||
|
|
||
|
isMiddle: mouseButtons.isMiddle,
|
||
|
/*=====
|
||
|
isMiddle: function(){
|
||
|
// summary:
|
||
|
// Test an event object (from a mousedown event) to see if the middle button was pressed.
|
||
|
},
|
||
|
=====*/
|
||
|
|
||
|
isRight: mouseButtons.isRight
|
||
|
/*=====
|
||
|
, isRight: function(){
|
||
|
// summary:
|
||
|
// Test an event object (from a mousedown event) to see if the right button was pressed.
|
||
|
}
|
||
|
=====*/
|
||
|
};
|
||
|
});
|