mouse.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. define(["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){
  2. // module:
  3. // dojo/mouse
  4. has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat");
  5. has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div"));
  6. has.add("events-mousewheel", win.doc && 'onmousewheel' in win.doc);
  7. var mouseButtons;
  8. if((has("dom-quirks") && has("ie")) || !has("dom-addeventlistener")){
  9. mouseButtons = {
  10. LEFT: 1,
  11. MIDDLE: 4,
  12. RIGHT: 2,
  13. // helper functions
  14. isButton: function(e, button){ return e.button & button; },
  15. isLeft: function(e){ return e.button & 1; },
  16. isMiddle: function(e){ return e.button & 4; },
  17. isRight: function(e){ return e.button & 2; }
  18. };
  19. }else{
  20. mouseButtons = {
  21. LEFT: 0,
  22. MIDDLE: 1,
  23. RIGHT: 2,
  24. // helper functions
  25. isButton: function(e, button){ return e.button == button; },
  26. isLeft: function(e){ return e.button == 0; },
  27. isMiddle: function(e){ return e.button == 1; },
  28. isRight: function(e){ return e.button == 2; }
  29. };
  30. }
  31. dojo.mouseButtons = mouseButtons;
  32. /*=====
  33. dojo.mouseButtons = {
  34. // LEFT: Number
  35. // Numeric value of the left mouse button for the platform.
  36. LEFT: 0,
  37. // MIDDLE: Number
  38. // Numeric value of the middle mouse button for the platform.
  39. MIDDLE: 1,
  40. // RIGHT: Number
  41. // Numeric value of the right mouse button for the platform.
  42. RIGHT: 2,
  43. isButton: function(e, button){
  44. // summary:
  45. // Checks an event object for a pressed button
  46. // e: Event
  47. // Event object to examine
  48. // button: Number
  49. // The button value (example: dojo.mouseButton.LEFT)
  50. return e.button == button; // Boolean
  51. },
  52. isLeft: function(e){
  53. // summary:
  54. // Checks an event object for the pressed left button
  55. // e: Event
  56. // Event object to examine
  57. return e.button == 0; // Boolean
  58. },
  59. isMiddle: function(e){
  60. // summary:
  61. // Checks an event object for the pressed middle button
  62. // e: Event
  63. // Event object to examine
  64. return e.button == 1; // Boolean
  65. },
  66. isRight: function(e){
  67. // summary:
  68. // Checks an event object for the pressed right button
  69. // e: Event
  70. // Event object to examine
  71. return e.button == 2; // Boolean
  72. }
  73. };
  74. =====*/
  75. function eventHandler(type, selectHandler){
  76. // emulation of mouseenter/leave with mouseover/out using descendant checking
  77. var handler = function(node, listener){
  78. return on(node, type, function(evt){
  79. if(selectHandler){
  80. return selectHandler(evt, listener);
  81. }
  82. if(!dom.isDescendant(evt.relatedTarget, node)){
  83. return listener.call(this, evt);
  84. }
  85. });
  86. };
  87. handler.bubble = function(select){
  88. return eventHandler(type, function(evt, listener){
  89. // using a selector, use the select function to determine if the mouse moved inside the selector and was previously outside the selector
  90. var target = select(evt.target);
  91. var relatedTarget = evt.relatedTarget;
  92. if(target && (target != (relatedTarget && relatedTarget.nodeType == 1 && select(relatedTarget)))){
  93. return listener.call(target, evt);
  94. }
  95. });
  96. };
  97. return handler;
  98. }
  99. var wheel;
  100. if(has("events-mousewheel")){
  101. wheel = 'mousewheel';
  102. }else{ //firefox
  103. wheel = function(node, listener){
  104. return on(node, 'DOMMouseScroll', function(evt){
  105. evt.wheelDelta = -evt.detail;
  106. listener.call(this, evt);
  107. });
  108. };
  109. }
  110. return {
  111. // summary:
  112. // This module provide mouse event handling utility functions and exports
  113. // mouseenter and mouseleave event emulation.
  114. // example:
  115. // To use these events, you register a mouseenter like this:
  116. // | define(["dojo/on", "dojo/mouse"], function(on, mouse){
  117. // | on(targetNode, mouse.enter, function(event){
  118. // | dojo.addClass(targetNode, "highlighted");
  119. // | });
  120. // | on(targetNode, mouse.leave, function(event){
  121. // | dojo.removeClass(targetNode, "highlighted");
  122. // | });
  123. _eventHandler: eventHandler, // for dojo/touch
  124. // enter: Synthetic Event
  125. // This is an extension event for the mouseenter that IE provides, emulating the
  126. // behavior on other browsers.
  127. enter: eventHandler("mouseover"),
  128. // leave: Synthetic Event
  129. // This is an extension event for the mouseleave that IE provides, emulating the
  130. // behavior on other browsers.
  131. leave: eventHandler("mouseout"),
  132. // wheel: Normalized Mouse Wheel Event
  133. // This is an extension event for the mousewheel that non-Mozilla browsers provide,
  134. // emulating the behavior on Mozilla based browsers.
  135. wheel: wheel,
  136. isLeft: mouseButtons.isLeft,
  137. /*=====
  138. isLeft: function(){
  139. // summary:
  140. // Test an event object (from a mousedown event) to see if the left button was pressed.
  141. },
  142. =====*/
  143. isMiddle: mouseButtons.isMiddle,
  144. /*=====
  145. isMiddle: function(){
  146. // summary:
  147. // Test an event object (from a mousedown event) to see if the middle button was pressed.
  148. },
  149. =====*/
  150. isRight: mouseButtons.isRight
  151. /*=====
  152. , isRight: function(){
  153. // summary:
  154. // Test an event object (from a mousedown event) to see if the right button was pressed.
  155. }
  156. =====*/
  157. };
  158. });