EventObject.html 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>The source code</title>
  6. <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
  7. <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
  8. <style type="text/css">
  9. .highlight { display: block; background-color: #ddd; }
  10. </style>
  11. <script type="text/javascript">
  12. function highlight() {
  13. document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
  14. }
  15. </script>
  16. </head>
  17. <body onload="prettyPrint(); highlight();">
  18. <pre class="prettyprint lang-js"><span id='Ext-EventObject'>/**
  19. </span> * @class Ext.EventObject
  20. Just as {@link Ext.Element} wraps around a native DOM node, Ext.EventObject
  21. wraps the browser's native event-object normalizing cross-browser differences,
  22. such as which mouse button is clicked, keys pressed, mechanisms to stop
  23. event-propagation along with a method to prevent default actions from taking place.
  24. For example:
  25. function handleClick(e, t){ // e is not a standard event object, it is a Ext.EventObject
  26. e.preventDefault();
  27. var target = e.getTarget(); // same as t (the target HTMLElement)
  28. ...
  29. }
  30. var myDiv = {@link Ext#get Ext.get}(&quot;myDiv&quot;); // get reference to an {@link Ext.Element}
  31. myDiv.on( // 'on' is shorthand for addListener
  32. &quot;click&quot;, // perform an action on click of myDiv
  33. handleClick // reference to the action handler
  34. );
  35. // other methods to do the same:
  36. Ext.EventManager.on(&quot;myDiv&quot;, 'click', handleClick);
  37. Ext.EventManager.addListener(&quot;myDiv&quot;, 'click', handleClick);
  38. * @singleton
  39. * @markdown
  40. */
  41. Ext.define('Ext.EventObjectImpl', {
  42. uses: ['Ext.util.Point'],
  43. <span id='Ext-EventObject-property-BACKSPACE'> /** Key constant @type Number */
  44. </span> BACKSPACE: 8,
  45. <span id='Ext-EventObject-property-TAB'> /** Key constant @type Number */
  46. </span> TAB: 9,
  47. <span id='Ext-EventObject-property-NUM_CENTER'> /** Key constant @type Number */
  48. </span> NUM_CENTER: 12,
  49. <span id='Ext-EventObject-property-ENTER'> /** Key constant @type Number */
  50. </span> ENTER: 13,
  51. <span id='Ext-EventObject-property-RETURN'> /** Key constant @type Number */
  52. </span> RETURN: 13,
  53. <span id='Ext-EventObject-property-SHIFT'> /** Key constant @type Number */
  54. </span> SHIFT: 16,
  55. <span id='Ext-EventObject-property-CTRL'> /** Key constant @type Number */
  56. </span> CTRL: 17,
  57. <span id='Ext-EventObject-property-ALT'> /** Key constant @type Number */
  58. </span> ALT: 18,
  59. <span id='Ext-EventObject-property-PAUSE'> /** Key constant @type Number */
  60. </span> PAUSE: 19,
  61. <span id='Ext-EventObject-property-CAPS_LOCK'> /** Key constant @type Number */
  62. </span> CAPS_LOCK: 20,
  63. <span id='Ext-EventObject-property-ESC'> /** Key constant @type Number */
  64. </span> ESC: 27,
  65. <span id='Ext-EventObject-property-SPACE'> /** Key constant @type Number */
  66. </span> SPACE: 32,
  67. <span id='Ext-EventObject-property-PAGE_UP'> /** Key constant @type Number */
  68. </span> PAGE_UP: 33,
  69. <span id='Ext-EventObject-property-PAGE_DOWN'> /** Key constant @type Number */
  70. </span> PAGE_DOWN: 34,
  71. <span id='Ext-EventObject-property-END'> /** Key constant @type Number */
  72. </span> END: 35,
  73. <span id='Ext-EventObject-property-HOME'> /** Key constant @type Number */
  74. </span> HOME: 36,
  75. <span id='Ext-EventObject-property-LEFT'> /** Key constant @type Number */
  76. </span> LEFT: 37,
  77. <span id='Ext-EventObject-property-UP'> /** Key constant @type Number */
  78. </span> UP: 38,
  79. <span id='Ext-EventObject-property-RIGHT'> /** Key constant @type Number */
  80. </span> RIGHT: 39,
  81. <span id='Ext-EventObject-property-DOWN'> /** Key constant @type Number */
  82. </span> DOWN: 40,
  83. <span id='Ext-EventObject-property-PRINT_SCREEN'> /** Key constant @type Number */
  84. </span> PRINT_SCREEN: 44,
  85. <span id='Ext-EventObject-property-INSERT'> /** Key constant @type Number */
  86. </span> INSERT: 45,
  87. <span id='Ext-EventObject-property-DELETE'> /** Key constant @type Number */
  88. </span> DELETE: 46,
  89. <span id='Ext-EventObject-property-ZERO'> /** Key constant @type Number */
  90. </span> ZERO: 48,
  91. <span id='Ext-EventObject-property-ONE'> /** Key constant @type Number */
  92. </span> ONE: 49,
  93. <span id='Ext-EventObject-property-TWO'> /** Key constant @type Number */
  94. </span> TWO: 50,
  95. <span id='Ext-EventObject-property-THREE'> /** Key constant @type Number */
  96. </span> THREE: 51,
  97. <span id='Ext-EventObject-property-FOUR'> /** Key constant @type Number */
  98. </span> FOUR: 52,
  99. <span id='Ext-EventObject-property-FIVE'> /** Key constant @type Number */
  100. </span> FIVE: 53,
  101. <span id='Ext-EventObject-property-SIX'> /** Key constant @type Number */
  102. </span> SIX: 54,
  103. <span id='Ext-EventObject-property-SEVEN'> /** Key constant @type Number */
  104. </span> SEVEN: 55,
  105. <span id='Ext-EventObject-property-EIGHT'> /** Key constant @type Number */
  106. </span> EIGHT: 56,
  107. <span id='Ext-EventObject-property-NINE'> /** Key constant @type Number */
  108. </span> NINE: 57,
  109. <span id='Ext-EventObject-property-A'> /** Key constant @type Number */
  110. </span> A: 65,
  111. <span id='Ext-EventObject-property-B'> /** Key constant @type Number */
  112. </span> B: 66,
  113. <span id='Ext-EventObject-property-C'> /** Key constant @type Number */
  114. </span> C: 67,
  115. <span id='Ext-EventObject-property-D'> /** Key constant @type Number */
  116. </span> D: 68,
  117. <span id='Ext-EventObject-property-E'> /** Key constant @type Number */
  118. </span> E: 69,
  119. <span id='Ext-EventObject-property-F'> /** Key constant @type Number */
  120. </span> F: 70,
  121. <span id='Ext-EventObject-property-G'> /** Key constant @type Number */
  122. </span> G: 71,
  123. <span id='Ext-EventObject-property-H'> /** Key constant @type Number */
  124. </span> H: 72,
  125. <span id='Ext-EventObject-property-I'> /** Key constant @type Number */
  126. </span> I: 73,
  127. <span id='Ext-EventObject-property-J'> /** Key constant @type Number */
  128. </span> J: 74,
  129. <span id='Ext-EventObject-property-K'> /** Key constant @type Number */
  130. </span> K: 75,
  131. <span id='Ext-EventObject-property-L'> /** Key constant @type Number */
  132. </span> L: 76,
  133. <span id='Ext-EventObject-property-M'> /** Key constant @type Number */
  134. </span> M: 77,
  135. <span id='Ext-EventObject-property-N'> /** Key constant @type Number */
  136. </span> N: 78,
  137. <span id='Ext-EventObject-property-O'> /** Key constant @type Number */
  138. </span> O: 79,
  139. <span id='Ext-EventObject-property-P'> /** Key constant @type Number */
  140. </span> P: 80,
  141. <span id='Ext-EventObject-property-Q'> /** Key constant @type Number */
  142. </span> Q: 81,
  143. <span id='Ext-EventObject-property-R'> /** Key constant @type Number */
  144. </span> R: 82,
  145. <span id='Ext-EventObject-property-S'> /** Key constant @type Number */
  146. </span> S: 83,
  147. <span id='Ext-EventObject-property-T'> /** Key constant @type Number */
  148. </span> T: 84,
  149. <span id='Ext-EventObject-property-U'> /** Key constant @type Number */
  150. </span> U: 85,
  151. <span id='Ext-EventObject-property-V'> /** Key constant @type Number */
  152. </span> V: 86,
  153. <span id='Ext-EventObject-property-W'> /** Key constant @type Number */
  154. </span> W: 87,
  155. <span id='Ext-EventObject-property-X'> /** Key constant @type Number */
  156. </span> X: 88,
  157. <span id='Ext-EventObject-property-Y'> /** Key constant @type Number */
  158. </span> Y: 89,
  159. <span id='Ext-EventObject-property-Z'> /** Key constant @type Number */
  160. </span> Z: 90,
  161. <span id='Ext-EventObject-property-CONTEXT_MENU'> /** Key constant @type Number */
  162. </span> CONTEXT_MENU: 93,
  163. <span id='Ext-EventObject-property-NUM_ZERO'> /** Key constant @type Number */
  164. </span> NUM_ZERO: 96,
  165. <span id='Ext-EventObject-property-NUM_ONE'> /** Key constant @type Number */
  166. </span> NUM_ONE: 97,
  167. <span id='Ext-EventObject-property-NUM_TWO'> /** Key constant @type Number */
  168. </span> NUM_TWO: 98,
  169. <span id='Ext-EventObject-property-NUM_THREE'> /** Key constant @type Number */
  170. </span> NUM_THREE: 99,
  171. <span id='Ext-EventObject-property-NUM_FOUR'> /** Key constant @type Number */
  172. </span> NUM_FOUR: 100,
  173. <span id='Ext-EventObject-property-NUM_FIVE'> /** Key constant @type Number */
  174. </span> NUM_FIVE: 101,
  175. <span id='Ext-EventObject-property-NUM_SIX'> /** Key constant @type Number */
  176. </span> NUM_SIX: 102,
  177. <span id='Ext-EventObject-property-NUM_SEVEN'> /** Key constant @type Number */
  178. </span> NUM_SEVEN: 103,
  179. <span id='Ext-EventObject-property-NUM_EIGHT'> /** Key constant @type Number */
  180. </span> NUM_EIGHT: 104,
  181. <span id='Ext-EventObject-property-NUM_NINE'> /** Key constant @type Number */
  182. </span> NUM_NINE: 105,
  183. <span id='Ext-EventObject-property-NUM_MULTIPLY'> /** Key constant @type Number */
  184. </span> NUM_MULTIPLY: 106,
  185. <span id='Ext-EventObject-property-NUM_PLUS'> /** Key constant @type Number */
  186. </span> NUM_PLUS: 107,
  187. <span id='Ext-EventObject-property-NUM_MINUS'> /** Key constant @type Number */
  188. </span> NUM_MINUS: 109,
  189. <span id='Ext-EventObject-property-NUM_PERIOD'> /** Key constant @type Number */
  190. </span> NUM_PERIOD: 110,
  191. <span id='Ext-EventObject-property-NUM_DIVISION'> /** Key constant @type Number */
  192. </span> NUM_DIVISION: 111,
  193. <span id='Ext-EventObject-property-F1'> /** Key constant @type Number */
  194. </span> F1: 112,
  195. <span id='Ext-EventObject-property-F2'> /** Key constant @type Number */
  196. </span> F2: 113,
  197. <span id='Ext-EventObject-property-F3'> /** Key constant @type Number */
  198. </span> F3: 114,
  199. <span id='Ext-EventObject-property-F4'> /** Key constant @type Number */
  200. </span> F4: 115,
  201. <span id='Ext-EventObject-property-F5'> /** Key constant @type Number */
  202. </span> F5: 116,
  203. <span id='Ext-EventObject-property-F6'> /** Key constant @type Number */
  204. </span> F6: 117,
  205. <span id='Ext-EventObject-property-F7'> /** Key constant @type Number */
  206. </span> F7: 118,
  207. <span id='Ext-EventObject-property-F8'> /** Key constant @type Number */
  208. </span> F8: 119,
  209. <span id='Ext-EventObject-property-F9'> /** Key constant @type Number */
  210. </span> F9: 120,
  211. <span id='Ext-EventObject-property-F10'> /** Key constant @type Number */
  212. </span> F10: 121,
  213. <span id='Ext-EventObject-property-F11'> /** Key constant @type Number */
  214. </span> F11: 122,
  215. <span id='Ext-EventObject-property-F12'> /** Key constant @type Number */
  216. </span> F12: 123,
  217. <span id='Ext-EventObject-property-WHEEL_SCALE'> /**
  218. </span> * The mouse wheel delta scaling factor. This value depends on browser version and OS and
  219. * attempts to produce a similar scrolling experience across all platforms and browsers.
  220. *
  221. * To change this value:
  222. *
  223. * Ext.EventObjectImpl.prototype.WHEEL_SCALE = 72;
  224. *
  225. * @type Number
  226. * @markdown
  227. */
  228. WHEEL_SCALE: (function () {
  229. var scale;
  230. if (Ext.isGecko) {
  231. // Firefox uses 3 on all platforms
  232. scale = 3;
  233. } else if (Ext.isMac) {
  234. // Continuous scrolling devices have momentum and produce much more scroll than
  235. // discrete devices on the same OS and browser. To make things exciting, Safari
  236. // (and not Chrome) changed from small values to 120 (like IE).
  237. if (Ext.isSafari &amp;&amp; Ext.webKitVersion &gt;= 532.0) {
  238. // Safari changed the scrolling factor to match IE (for details see
  239. // https://bugs.webkit.org/show_bug.cgi?id=24368). The WebKit version where this
  240. // change was introduced was 532.0
  241. // Detailed discussion:
  242. // https://bugs.webkit.org/show_bug.cgi?id=29601
  243. // http://trac.webkit.org/browser/trunk/WebKit/chromium/src/mac/WebInputEventFactory.mm#L1063
  244. scale = 120;
  245. } else {
  246. // MS optical wheel mouse produces multiples of 12 which is close enough
  247. // to help tame the speed of the continuous mice...
  248. scale = 12;
  249. }
  250. // Momentum scrolling produces very fast scrolling, so increase the scale factor
  251. // to help produce similar results cross platform. This could be even larger and
  252. // it would help those mice, but other mice would become almost unusable as a
  253. // result (since we cannot tell which device type is in use).
  254. scale *= 3;
  255. } else {
  256. // IE, Opera and other Windows browsers use 120.
  257. scale = 120;
  258. }
  259. return scale;
  260. }()),
  261. <span id='Ext-EventObject-property-clickRe'> /**
  262. </span> * Simple click regex
  263. * @private
  264. */
  265. clickRe: /(dbl)?click/,
  266. // safari keypress events for special keys return bad keycodes
  267. safariKeys: {
  268. 3: 13, // enter
  269. 63234: 37, // left
  270. 63235: 39, // right
  271. 63232: 38, // up
  272. 63233: 40, // down
  273. 63276: 33, // page up
  274. 63277: 34, // page down
  275. 63272: 46, // delete
  276. 63273: 36, // home
  277. 63275: 35 // end
  278. },
  279. // normalize button clicks, don't see any way to feature detect this.
  280. btnMap: Ext.isIE ? {
  281. 1: 0,
  282. 4: 1,
  283. 2: 2
  284. } : {
  285. 0: 0,
  286. 1: 1,
  287. 2: 2
  288. },
  289. <span id='Ext-EventObject-property-ctrlKey'> /**
  290. </span> * @property {Boolean} ctrlKey
  291. * True if the control key was down during the event.
  292. * In Mac this will also be true when meta key was down.
  293. */
  294. <span id='Ext-EventObject-property-altKey'> /**
  295. </span> * @property {Boolean} altKey
  296. * True if the alt key was down during the event.
  297. */
  298. <span id='Ext-EventObject-property-shiftKey'> /**
  299. </span> * @property {Boolean} shiftKey
  300. * True if the shift key was down during the event.
  301. */
  302. constructor: function(event, freezeEvent){
  303. if (event) {
  304. this.setEvent(event.browserEvent || event, freezeEvent);
  305. }
  306. },
  307. setEvent: function(event, freezeEvent){
  308. var me = this, button, options;
  309. if (event == me || (event &amp;&amp; event.browserEvent)) { // already wrapped
  310. return event;
  311. }
  312. me.browserEvent = event;
  313. if (event) {
  314. // normalize buttons
  315. button = event.button ? me.btnMap[event.button] : (event.which ? event.which - 1 : -1);
  316. if (me.clickRe.test(event.type) &amp;&amp; button == -1) {
  317. button = 0;
  318. }
  319. options = {
  320. type: event.type,
  321. button: button,
  322. shiftKey: event.shiftKey,
  323. // mac metaKey behaves like ctrlKey
  324. ctrlKey: event.ctrlKey || event.metaKey || false,
  325. altKey: event.altKey,
  326. // in getKey these will be normalized for the mac
  327. keyCode: event.keyCode,
  328. charCode: event.charCode,
  329. // cache the targets for the delayed and or buffered events
  330. target: Ext.EventManager.getTarget(event),
  331. relatedTarget: Ext.EventManager.getRelatedTarget(event),
  332. currentTarget: event.currentTarget,
  333. xy: (freezeEvent ? me.getXY() : null)
  334. };
  335. } else {
  336. options = {
  337. button: -1,
  338. shiftKey: false,
  339. ctrlKey: false,
  340. altKey: false,
  341. keyCode: 0,
  342. charCode: 0,
  343. target: null,
  344. xy: [0, 0]
  345. };
  346. }
  347. Ext.apply(me, options);
  348. return me;
  349. },
  350. <span id='Ext-EventObject-method-stopEvent'> /**
  351. </span> * Stop the event (preventDefault and stopPropagation)
  352. */
  353. stopEvent: function(){
  354. this.stopPropagation();
  355. this.preventDefault();
  356. },
  357. <span id='Ext-EventObject-method-preventDefault'> /**
  358. </span> * Prevents the browsers default handling of the event.
  359. */
  360. preventDefault: function(){
  361. if (this.browserEvent) {
  362. Ext.EventManager.preventDefault(this.browserEvent);
  363. }
  364. },
  365. <span id='Ext-EventObject-method-stopPropagation'> /**
  366. </span> * Cancels bubbling of the event.
  367. */
  368. stopPropagation: function(){
  369. var browserEvent = this.browserEvent;
  370. if (browserEvent) {
  371. if (browserEvent.type == 'mousedown') {
  372. Ext.EventManager.stoppedMouseDownEvent.fire(this);
  373. }
  374. Ext.EventManager.stopPropagation(browserEvent);
  375. }
  376. },
  377. <span id='Ext-EventObject-method-getCharCode'> /**
  378. </span> * Gets the character code for the event.
  379. * @return {Number}
  380. */
  381. getCharCode: function(){
  382. return this.charCode || this.keyCode;
  383. },
  384. <span id='Ext-EventObject-method-getKey'> /**
  385. </span> * Returns a normalized keyCode for the event.
  386. * @return {Number} The key code
  387. */
  388. getKey: function(){
  389. return this.normalizeKey(this.keyCode || this.charCode);
  390. },
  391. <span id='Ext-EventObject-method-normalizeKey'> /**
  392. </span> * Normalize key codes across browsers
  393. * @private
  394. * @param {Number} key The key code
  395. * @return {Number} The normalized code
  396. */
  397. normalizeKey: function(key){
  398. // can't feature detect this
  399. return Ext.isWebKit ? (this.safariKeys[key] || key) : key;
  400. },
  401. <span id='Ext-EventObject-method-getPageX'> /**
  402. </span> * Gets the x coordinate of the event.
  403. * @return {Number}
  404. * @deprecated 4.0 Replaced by {@link #getX}
  405. */
  406. getPageX: function(){
  407. return this.getX();
  408. },
  409. <span id='Ext-EventObject-method-getPageY'> /**
  410. </span> * Gets the y coordinate of the event.
  411. * @return {Number}
  412. * @deprecated 4.0 Replaced by {@link #getY}
  413. */
  414. getPageY: function(){
  415. return this.getY();
  416. },
  417. <span id='Ext-EventObject-method-getX'> /**
  418. </span> * Gets the x coordinate of the event.
  419. * @return {Number}
  420. */
  421. getX: function() {
  422. return this.getXY()[0];
  423. },
  424. <span id='Ext-EventObject-method-getY'> /**
  425. </span> * Gets the y coordinate of the event.
  426. * @return {Number}
  427. */
  428. getY: function() {
  429. return this.getXY()[1];
  430. },
  431. <span id='Ext-EventObject-method-getXY'> /**
  432. </span> * Gets the page coordinates of the event.
  433. * @return {Number[]} The xy values like [x, y]
  434. */
  435. getXY: function() {
  436. if (!this.xy) {
  437. // same for XY
  438. this.xy = Ext.EventManager.getPageXY(this.browserEvent);
  439. }
  440. return this.xy;
  441. },
  442. <span id='Ext-EventObject-method-getTarget'> /**
  443. </span> * Gets the target for the event.
  444. * @param {String} selector (optional) A simple selector to filter the target or look for an ancestor of the target
  445. * @param {Number/HTMLElement} maxDepth (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  446. * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
  447. * @return {HTMLElement}
  448. */
  449. getTarget : function(selector, maxDepth, returnEl){
  450. if (selector) {
  451. return Ext.fly(this.target).findParent(selector, maxDepth, returnEl);
  452. }
  453. return returnEl ? Ext.get(this.target) : this.target;
  454. },
  455. <span id='Ext-EventObject-method-getRelatedTarget'> /**
  456. </span> * Gets the related target.
  457. * @param {String} selector (optional) A simple selector to filter the target or look for an ancestor of the target
  458. * @param {Number/HTMLElement} maxDepth (optional) The max depth to search as a number or element (defaults to 10 || document.body)
  459. * @param {Boolean} returnEl (optional) True to return a Ext.Element object instead of DOM node
  460. * @return {HTMLElement}
  461. */
  462. getRelatedTarget : function(selector, maxDepth, returnEl){
  463. if (selector) {
  464. return Ext.fly(this.relatedTarget).findParent(selector, maxDepth, returnEl);
  465. }
  466. return returnEl ? Ext.get(this.relatedTarget) : this.relatedTarget;
  467. },
  468. <span id='Ext-EventObject-method-correctWheelDelta'> /**
  469. </span> * Correctly scales a given wheel delta.
  470. * @param {Number} delta The delta value.
  471. */
  472. correctWheelDelta : function (delta) {
  473. var scale = this.WHEEL_SCALE,
  474. ret = Math.round(delta / scale);
  475. if (!ret &amp;&amp; delta) {
  476. ret = (delta &lt; 0) ? -1 : 1; // don't allow non-zero deltas to go to zero!
  477. }
  478. return ret;
  479. },
  480. <span id='Ext-EventObject-method-getWheelDeltas'> /**
  481. </span> * Returns the mouse wheel deltas for this event.
  482. * @return {Object} An object with &quot;x&quot; and &quot;y&quot; properties holding the mouse wheel deltas.
  483. */
  484. getWheelDeltas : function () {
  485. var me = this,
  486. event = me.browserEvent,
  487. dx = 0, dy = 0; // the deltas
  488. if (Ext.isDefined(event.wheelDeltaX)) { // WebKit has both dimensions
  489. dx = event.wheelDeltaX;
  490. dy = event.wheelDeltaY;
  491. } else if (event.wheelDelta) { // old WebKit and IE
  492. dy = event.wheelDelta;
  493. } else if (event.detail) { // Gecko
  494. dy = -event.detail; // gecko is backwards
  495. // Gecko sometimes returns really big values if the user changes settings to
  496. // scroll a whole page per scroll
  497. if (dy &gt; 100) {
  498. dy = 3;
  499. } else if (dy &lt; -100) {
  500. dy = -3;
  501. }
  502. // Firefox 3.1 adds an axis field to the event to indicate direction of
  503. // scroll. See https://developer.mozilla.org/en/Gecko-Specific_DOM_Events
  504. if (Ext.isDefined(event.axis) &amp;&amp; event.axis === event.HORIZONTAL_AXIS) {
  505. dx = dy;
  506. dy = 0;
  507. }
  508. }
  509. return {
  510. x: me.correctWheelDelta(dx),
  511. y: me.correctWheelDelta(dy)
  512. };
  513. },
  514. <span id='Ext-EventObject-method-getWheelDelta'> /**
  515. </span> * Normalizes mouse wheel y-delta across browsers. To get x-delta information, use
  516. * {@link #getWheelDeltas} instead.
  517. * @return {Number} The mouse wheel y-delta
  518. */
  519. getWheelDelta : function(){
  520. var deltas = this.getWheelDeltas();
  521. return deltas.y;
  522. },
  523. <span id='Ext-EventObject-method-within'> /**
  524. </span> * Returns true if the target of this event is a child of el. Unless the allowEl parameter is set, it will return false if if the target is el.
  525. * Example usage:&lt;pre&gt;&lt;code&gt;
  526. // Handle click on any child of an element
  527. Ext.getBody().on('click', function(e){
  528. if(e.within('some-el')){
  529. alert('Clicked on a child of some-el!');
  530. }
  531. });
  532. // Handle click directly on an element, ignoring clicks on child nodes
  533. Ext.getBody().on('click', function(e,t){
  534. if((t.id == 'some-el') &amp;&amp; !e.within(t, true)){
  535. alert('Clicked directly on some-el!');
  536. }
  537. });
  538. &lt;/code&gt;&lt;/pre&gt;
  539. * @param {String/HTMLElement/Ext.Element} el The id, DOM element or Ext.Element to check
  540. * @param {Boolean} related (optional) true to test if the related target is within el instead of the target
  541. * @param {Boolean} allowEl (optional) true to also check if the passed element is the target or related target
  542. * @return {Boolean}
  543. */
  544. within : function(el, related, allowEl){
  545. if(el){
  546. var t = related ? this.getRelatedTarget() : this.getTarget(),
  547. result;
  548. if (t) {
  549. result = Ext.fly(el).contains(t);
  550. if (!result &amp;&amp; allowEl) {
  551. result = t == Ext.getDom(el);
  552. }
  553. return result;
  554. }
  555. }
  556. return false;
  557. },
  558. <span id='Ext-EventObject-method-isNavKeyPress'> /**
  559. </span> * Checks if the key pressed was a &quot;navigation&quot; key
  560. * @return {Boolean} True if the press is a navigation keypress
  561. */
  562. isNavKeyPress : function(){
  563. var me = this,
  564. k = this.normalizeKey(me.keyCode);
  565. return (k &gt;= 33 &amp;&amp; k &lt;= 40) || // Page Up/Down, End, Home, Left, Up, Right, Down
  566. k == me.RETURN ||
  567. k == me.TAB ||
  568. k == me.ESC;
  569. },
  570. <span id='Ext-EventObject-method-isSpecialKey'> /**
  571. </span> * Checks if the key pressed was a &quot;special&quot; key
  572. * @return {Boolean} True if the press is a special keypress
  573. */
  574. isSpecialKey : function(){
  575. var k = this.normalizeKey(this.keyCode);
  576. return (this.type == 'keypress' &amp;&amp; this.ctrlKey) ||
  577. this.isNavKeyPress() ||
  578. (k == this.BACKSPACE) || // Backspace
  579. (k &gt;= 16 &amp;&amp; k &lt;= 20) || // Shift, Ctrl, Alt, Pause, Caps Lock
  580. (k &gt;= 44 &amp;&amp; k &lt;= 46); // Print Screen, Insert, Delete
  581. },
  582. <span id='Ext-EventObject-method-getPoint'> /**
  583. </span> * Returns a point object that consists of the object coordinates.
  584. * @return {Ext.util.Point} point
  585. */
  586. getPoint : function(){
  587. var xy = this.getXY();
  588. return new Ext.util.Point(xy[0], xy[1]);
  589. },
  590. <span id='Ext-EventObject-method-hasModifier'> /**
  591. </span> * Returns true if the control, meta, shift or alt key was pressed during this event.
  592. * @return {Boolean}
  593. */
  594. hasModifier : function(){
  595. return this.ctrlKey || this.altKey || this.shiftKey || this.metaKey;
  596. },
  597. <span id='Ext-EventObject-method-injectEvent'> /**
  598. </span> * Injects a DOM event using the data in this object and (optionally) a new target.
  599. * This is a low-level technique and not likely to be used by application code. The
  600. * currently supported event types are:
  601. * &lt;p&gt;&lt;b&gt;HTMLEvents&lt;/b&gt;&lt;/p&gt;
  602. * &lt;ul&gt;
  603. * &lt;li&gt;load&lt;/li&gt;
  604. * &lt;li&gt;unload&lt;/li&gt;
  605. * &lt;li&gt;select&lt;/li&gt;
  606. * &lt;li&gt;change&lt;/li&gt;
  607. * &lt;li&gt;submit&lt;/li&gt;
  608. * &lt;li&gt;reset&lt;/li&gt;
  609. * &lt;li&gt;resize&lt;/li&gt;
  610. * &lt;li&gt;scroll&lt;/li&gt;
  611. * &lt;/ul&gt;
  612. * &lt;p&gt;&lt;b&gt;MouseEvents&lt;/b&gt;&lt;/p&gt;
  613. * &lt;ul&gt;
  614. * &lt;li&gt;click&lt;/li&gt;
  615. * &lt;li&gt;dblclick&lt;/li&gt;
  616. * &lt;li&gt;mousedown&lt;/li&gt;
  617. * &lt;li&gt;mouseup&lt;/li&gt;
  618. * &lt;li&gt;mouseover&lt;/li&gt;
  619. * &lt;li&gt;mousemove&lt;/li&gt;
  620. * &lt;li&gt;mouseout&lt;/li&gt;
  621. * &lt;/ul&gt;
  622. * &lt;p&gt;&lt;b&gt;UIEvents&lt;/b&gt;&lt;/p&gt;
  623. * &lt;ul&gt;
  624. * &lt;li&gt;focusin&lt;/li&gt;
  625. * &lt;li&gt;focusout&lt;/li&gt;
  626. * &lt;li&gt;activate&lt;/li&gt;
  627. * &lt;li&gt;focus&lt;/li&gt;
  628. * &lt;li&gt;blur&lt;/li&gt;
  629. * &lt;/ul&gt;
  630. * @param {Ext.Element/HTMLElement} target (optional) If specified, the target for the event. This
  631. * is likely to be used when relaying a DOM event. If not specified, {@link #getTarget}
  632. * is used to determine the target.
  633. */
  634. injectEvent: (function () {
  635. var API,
  636. dispatchers = {}, // keyed by event type (e.g., 'mousedown')
  637. crazyIEButtons;
  638. // Good reference: http://developer.yahoo.com/yui/docs/UserAction.js.html
  639. // IE9 has createEvent, but this code causes major problems with htmleditor (it
  640. // blocks all mouse events and maybe more). TODO
  641. if (!Ext.isIE &amp;&amp; document.createEvent) { // if (DOM compliant)
  642. API = {
  643. createHtmlEvent: function (doc, type, bubbles, cancelable) {
  644. var event = doc.createEvent('HTMLEvents');
  645. event.initEvent(type, bubbles, cancelable);
  646. return event;
  647. },
  648. createMouseEvent: function (doc, type, bubbles, cancelable, detail,
  649. clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
  650. button, relatedTarget) {
  651. var event = doc.createEvent('MouseEvents'),
  652. view = doc.defaultView || window;
  653. if (event.initMouseEvent) {
  654. event.initMouseEvent(type, bubbles, cancelable, view, detail,
  655. clientX, clientY, clientX, clientY, ctrlKey, altKey,
  656. shiftKey, metaKey, button, relatedTarget);
  657. } else { // old Safari
  658. event = doc.createEvent('UIEvents');
  659. event.initEvent(type, bubbles, cancelable);
  660. event.view = view;
  661. event.detail = detail;
  662. event.screenX = clientX;
  663. event.screenY = clientY;
  664. event.clientX = clientX;
  665. event.clientY = clientY;
  666. event.ctrlKey = ctrlKey;
  667. event.altKey = altKey;
  668. event.metaKey = metaKey;
  669. event.shiftKey = shiftKey;
  670. event.button = button;
  671. event.relatedTarget = relatedTarget;
  672. }
  673. return event;
  674. },
  675. createUIEvent: function (doc, type, bubbles, cancelable, detail) {
  676. var event = doc.createEvent('UIEvents'),
  677. view = doc.defaultView || window;
  678. event.initUIEvent(type, bubbles, cancelable, view, detail);
  679. return event;
  680. },
  681. fireEvent: function (target, type, event) {
  682. target.dispatchEvent(event);
  683. },
  684. fixTarget: function (target) {
  685. // Safari3 doesn't have window.dispatchEvent()
  686. if (target == window &amp;&amp; !target.dispatchEvent) {
  687. return document;
  688. }
  689. return target;
  690. }
  691. };
  692. } else if (document.createEventObject) { // else if (IE)
  693. crazyIEButtons = { 0: 1, 1: 4, 2: 2 };
  694. API = {
  695. createHtmlEvent: function (doc, type, bubbles, cancelable) {
  696. var event = doc.createEventObject();
  697. event.bubbles = bubbles;
  698. event.cancelable = cancelable;
  699. return event;
  700. },
  701. createMouseEvent: function (doc, type, bubbles, cancelable, detail,
  702. clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
  703. button, relatedTarget) {
  704. var event = doc.createEventObject();
  705. event.bubbles = bubbles;
  706. event.cancelable = cancelable;
  707. event.detail = detail;
  708. event.screenX = clientX;
  709. event.screenY = clientY;
  710. event.clientX = clientX;
  711. event.clientY = clientY;
  712. event.ctrlKey = ctrlKey;
  713. event.altKey = altKey;
  714. event.shiftKey = shiftKey;
  715. event.metaKey = metaKey;
  716. event.button = crazyIEButtons[button] || button;
  717. event.relatedTarget = relatedTarget; // cannot assign to/fromElement
  718. return event;
  719. },
  720. createUIEvent: function (doc, type, bubbles, cancelable, detail) {
  721. var event = doc.createEventObject();
  722. event.bubbles = bubbles;
  723. event.cancelable = cancelable;
  724. return event;
  725. },
  726. fireEvent: function (target, type, event) {
  727. target.fireEvent('on' + type, event);
  728. },
  729. fixTarget: function (target) {
  730. if (target == document) {
  731. // IE6,IE7 thinks window==document and doesn't have window.fireEvent()
  732. // IE6,IE7 cannot properly call document.fireEvent()
  733. return document.documentElement;
  734. }
  735. return target;
  736. }
  737. };
  738. }
  739. //----------------
  740. // HTMLEvents
  741. Ext.Object.each({
  742. load: [false, false],
  743. unload: [false, false],
  744. select: [true, false],
  745. change: [true, false],
  746. submit: [true, true],
  747. reset: [true, false],
  748. resize: [true, false],
  749. scroll: [true, false]
  750. },
  751. function (name, value) {
  752. var bubbles = value[0], cancelable = value[1];
  753. dispatchers[name] = function (targetEl, srcEvent) {
  754. var e = API.createHtmlEvent(name, bubbles, cancelable);
  755. API.fireEvent(targetEl, name, e);
  756. };
  757. });
  758. //----------------
  759. // MouseEvents
  760. function createMouseEventDispatcher (type, detail) {
  761. var cancelable = (type != 'mousemove');
  762. return function (targetEl, srcEvent) {
  763. var xy = srcEvent.getXY(),
  764. e = API.createMouseEvent(targetEl.ownerDocument, type, true, cancelable,
  765. detail, xy[0], xy[1], srcEvent.ctrlKey, srcEvent.altKey,
  766. srcEvent.shiftKey, srcEvent.metaKey, srcEvent.button,
  767. srcEvent.relatedTarget);
  768. API.fireEvent(targetEl, type, e);
  769. };
  770. }
  771. Ext.each(['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout'],
  772. function (eventName) {
  773. dispatchers[eventName] = createMouseEventDispatcher(eventName, 1);
  774. });
  775. //----------------
  776. // UIEvents
  777. Ext.Object.each({
  778. focusin: [true, false],
  779. focusout: [true, false],
  780. activate: [true, true],
  781. focus: [false, false],
  782. blur: [false, false]
  783. },
  784. function (name, value) {
  785. var bubbles = value[0], cancelable = value[1];
  786. dispatchers[name] = function (targetEl, srcEvent) {
  787. var e = API.createUIEvent(targetEl.ownerDocument, name, bubbles, cancelable, 1);
  788. API.fireEvent(targetEl, name, e);
  789. };
  790. });
  791. //---------
  792. if (!API) {
  793. // not even sure what ancient browsers fall into this category...
  794. dispatchers = {}; // never mind all those we just built :P
  795. API = {
  796. fixTarget: function (t) {
  797. return t;
  798. }
  799. };
  800. }
  801. function cannotInject (target, srcEvent) {
  802. //&lt;debug&gt;
  803. // TODO log something
  804. //&lt;/debug&gt;
  805. }
  806. return function (target) {
  807. var me = this,
  808. dispatcher = dispatchers[me.type] || cannotInject,
  809. t = target ? (target.dom || target) : me.getTarget();
  810. t = API.fixTarget(t);
  811. dispatcher(t, me);
  812. };
  813. }()) // call to produce method
  814. }, function() {
  815. Ext.EventObject = new Ext.EventObjectImpl();
  816. });
  817. </pre>
  818. </body>
  819. </html>