]> git.proxmox.com Git - extjs.git/blame - extjs/classic/classic/src/EventManager.js
add extjs 6.0.1 sources
[extjs.git] / extjs / classic / classic / src / EventManager.js
CommitLineData
6527f429
DM
1/**\r
2 * @class Ext.EventManager\r
3 * Registers event handlers on DOM elements.\r
4 * \r
5 * This class is deprecated. Please use the Ext.dom.Element api to attach listeners to\r
6 * DOM Elements. For example:\r
7 * \r
8 * var element = Ext.get('myId');\r
9 * \r
10 * element.on('click', function(e) {\r
11 * // event handling logic here\r
12 * });\r
13 *\r
14 * @singleton\r
15 * @deprecated 5.0.0\r
16 */\r
17Ext.define('Ext.EventManager', {\r
18 singleton: true,\r
19\r
20 mouseLeaveRe: /(mouseout|mouseleave)/,\r
21 mouseEnterRe: /(mouseover|mouseenter)/,\r
22\r
23 /**\r
24 * Appends an event handler to an element. The shorthand version {@link #on} is equivalent.\r
25 * Typically you will use {@link Ext.dom.Element#addListener} directly on an Element in favor of\r
26 * calling this version.\r
27 *\r
28 * {@link Ext.EventManager#on} is an alias for {@link Ext.EventManager#addListener}.\r
29 *\r
30 * @param {String/Ext.dom.Element/HTMLElement/Window} el The html element or id to assign the event handler to.\r
31 *\r
32 * @param {String} eventName The name of the event to listen for.\r
33 * May also be an object who's property names are event names.\r
34 *\r
35 * @param {Function/String} [handler] The handler function the event invokes. A String parameter\r
36 * is assumed to be method name in `scope` object, or Element object if no scope is provided.\r
37 * @param {Ext.event.Event} handler.event The {@link Ext.event.Event EventObject} describing the event.\r
38 * @param {Ext.dom.Element} handler.target The Element which was the target of the event.\r
39 * Note that this may be filtered by using the `delegate` option.\r
40 * @param {Object} handler.options The options object from the addListener call.\r
41 *\r
42 * @param {Object} [scope] The scope (`this` reference) in which the handler function is executed.\r
43 * Defaults to the Element.\r
44 *\r
45 * @param {Object} [options] An object containing handler configuration properties.\r
46 * This may contain any of the following properties (See {@link Ext.dom.Element#addListener}\r
47 * for examples of how to use these options.):\r
48 * @param {Object} options.scope The scope (`this` reference) in which the handler function is executed. Defaults to the Element.\r
49 * @param {String} options.delegate A simple selector to filter the target or look for a descendant of the target. See {@link Ext.dom.Query} for\r
50 * information about simple selectors.\r
51 * @param {Boolean} options.stopEvent True to stop the event. That is stop propagation, and prevent the default action.\r
52 * @param {Boolean} options.preventDefault True to prevent the default action\r
53 * @param {Boolean} options.stopPropagation True to prevent event propagation\r
54 * @param {Boolean} options.normalized False to pass a browser event to the handler function instead of an Ext.event.Event\r
55 * @param {Number} options.delay The number of milliseconds to delay the invocation of the handler after te event fires.\r
56 * @param {Boolean} options.single True to add a handler to handle just the next firing of the event, and then remove itself.\r
57 * @param {Number} options.buffer Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed\r
58 * by the specified number of milliseconds. If the event fires again within that time, the original\r
59 * handler is *not* invoked, but the new handler is scheduled in its place.\r
60 * @param {Ext.dom.Element} options.target Only call the handler if the event was fired on the target Element,\r
61 * *not* if the event was bubbled up from a child node.\r
62 * @param {Boolean} options.capture `true` to initiate capture which will fire the listeners on the target Element *before* any descendant Elements.\r
63 * Normal events start with the target element and propagate upward to ancestor elements, whereas captured events propagate from the top of the DOM\r
64 * downward to descendant elements. This option is the same as the useCapture parameter in the javascript addEventListener method.\r
65 */\r
66 addListener: function(element, eventName, fn, scope, options) {\r
67 //<debug>\r
68 Ext.log.warn("Ext.EventManager is deprecated. " +\r
69 "Use Ext.dom.Element#addListener to attach an event listener.");\r
70 //</debug>\r
71 Ext.get(element).addListener(eventName, fn, scope, options);\r
72 },\r
73\r
74 /**\r
75 * Adds a listener to be notified when the browser window is resized and provides resize event buffering (100 milliseconds),\r
76 * passes new viewport width and height to handlers.\r
77 * @param {Function} fn The handler function the window resize event invokes.\r
78 * @param {Object} scope The scope (<code>this</code> reference) in which the handler function executes. Defaults to the browser window.\r
79 * @param {Boolean} [options] Options object as passed to {@link Ext.dom.Element#addListener}\r
80 * @deprecated 5.0.0 Use {@link Ext#method-on Ext.on}('resize', fn) to attach a window resize listener.\r
81 */\r
82 onWindowResize: function(fn, scope, options) {\r
83 //<debug>\r
84 Ext.log.warn("Ext.EventManager is deprecated. " +\r
85 "Use Ext.on('resize', fn) to attach a window resize listener.");\r
86 //</debug>\r
87 Ext.GlobalEvents.on('resize', fn, scope, options);\r
88 },\r
89\r
90 /**\r
91 * Adds a listener to be notified when the browser window is unloaded.\r
92 * @param {Function} fn The handler function the window unload event invokes.\r
93 * @param {Object} scope The scope (<code>this</code> reference) in which the handler function executes. Defaults to the browser window.\r
94 * @param {Boolean} options Options object as passed to {@link Ext.dom.Element#addListener}\r
95 * @deprecated 5.0.0\r
96 */\r
97 onWindowUnload: function(fn, scope, options) {\r
98 //<debug>\r
99 Ext.log.warn("Ext.EventManager is deprecated. " +\r
100 "Use Ext.getWin().on('unload', fn) to attach a window unload listener.");\r
101 //</debug>\r
102 Ext.getWin().on('unload', fn, scope, options);\r
103 },\r
104\r
105 /**\r
106 * Recursively removes all previous added listeners from an element and its children.\r
107 * Typically you will use {@link Ext.dom.Element#clearListeners} directly on an Element\r
108 * in favor of calling this method.\r
109 * @param {String/Ext.dom.Element/HTMLElement/Window} el The id or html element from which\r
110 * to remove all event handlers.\r
111 * @param {String} eventName (optional) The name of the event.\r
112 * @deprecated 5.0.0\r
113 */\r
114 purgeElement: function(element, eventName) {\r
115 //<debug>\r
116 Ext.log.warn("Ext.EventManager is deprecated. " +\r
117 "Call clearListeners() on a Ext.dom.Element to remove all listeners.");\r
118 //</debug>\r
119 Ext.get(element).clearListeners();\r
120 },\r
121\r
122 /**\r
123 * Removes all event handers from an element. Typically you will use {@link\r
124 * Ext.dom.Element#clearListeners} directly on an Element in favor of calling this method.\r
125 * @param {String/Ext.dom.Element/HTMLElement/Window} el The id or html element from which\r
126 * to remove all event handlers.\r
127 * @deprecated 5.0.0\r
128 */\r
129 removeAll: function(element) {\r
130 //<debug>\r
131 Ext.log.warn("Ext.EventManager is deprecated. " +\r
132 "Call clearListeners() on a Ext.dom.Element to remove all listeners.");\r
133 //</debug>\r
134 Ext.get(element).clearListeners();\r
135 },\r
136\r
137 /**\r
138 * Removes an event handler from an element. The shorthand version {@link #un} is equivalent. Typically\r
139 * you will use {@link Ext.dom.Element#removeListener} directly on an Element in favor of calling this version.\r
140 *\r
141 * {@link Ext.EventManager#on} is an alias for {@link Ext.EventManager#addListener}.\r
142 *\r
143 * @param {String/Ext.dom.Element/HTMLElement/Window} el The id or html element from which to remove the listener.\r
144 * @param {String} eventName The name of the event.\r
145 * @param {Function} fn The handler function to remove. **This must be a reference to the function passed\r
146 * into the {@link #addListener} call.**\r
147 * @param {Object} scope If a scope (`this` reference) was specified when the listener was added,\r
148 * then this must refer to the same object.\r
149 */\r
150 removeListener: function(element, eventName, fn, scope, options) {\r
151 //<debug>\r
152 Ext.log.warn("Ext.EventManager is deprecated. " +\r
153 "Use Ext.dom.Element#removeListener to remove an event listener.");\r
154 //</debug>\r
155 Ext.get(element).removeListener(eventName, fn, scope, options);\r
156 },\r
157\r
158 /**\r
159 * Removes the passed window resize listener.\r
160 * @param {Function} fn The method the event invokes\r
161 * @param {Object} scope The scope of handler\r
162 * @deprecated 5.0.0\r
163 */\r
164 removeResizeListener: function(fn, scope) {\r
165 //<debug>\r
166 Ext.log.warn("Ext.EventManager is deprecated. " +\r
167 "Use Ext.on('resize', fn) to detach a window resize listener.");\r
168 //</debug>\r
169 Ext.GlobalEvents.un('resize', fn, scope);\r
170 },\r
171\r
172 /**\r
173 * Removes the passed window unload listener.\r
174 * @param {Function} fn The method the event invokes\r
175 * @param {Object} scope The scope of handler\r
176 * @deprecated 5.0.0\r
177 */\r
178 removeUnloadListener: function(fn, scope) {\r
179 //<debug>\r
180 Ext.log.warn("Ext.EventManager is deprecated. " +\r
181 "Use Ext.getWin().un('unload', fn) to detach a window unload listener.");\r
182 //</debug>\r
183 Ext.getWin().un('unload', fn, scope);\r
184 },\r
185\r
186 /**\r
187 * Stop the event (preventDefault and stopPropagation)\r
188 * @param {Event} event The event to stop\r
189 * @deprecated 5.0.0\r
190 */\r
191 stopEvent: function(event) {\r
192 //<debug>\r
193 Ext.log.warn("Ext.EventManager.stopEvent() is deprecated. " +\r
194 "Call stopEvent() directly on the Ext.event.Event instance instead.");\r
195 //</debug>\r
196 this.stopPropagation(event);\r
197 this.preventDefault(event);\r
198 },\r
199\r
200 /**\r
201 * Cancels bubbling of the event.\r
202 * @param {Event} event The event to stop bubbling.\r
203 * @deprecated 5.0.0\r
204 */\r
205 stopPropagation: function(event) {\r
206 //<debug>\r
207 Ext.log.warn("Ext.EventManager.stopPropagation() is deprecated. " +\r
208 "Call stopPropagation() directly on the Ext.event.Event instance instead.");\r
209 //</debug>\r
210 event = event.browserEvent || event;\r
211 if (event.stopPropagation) {\r
212 event.stopPropagation();\r
213 } else {\r
214 event.cancelBubble = true;\r
215 }\r
216 },\r
217\r
218 /**\r
219 * Prevents the browsers default handling of the event.\r
220 * @param {Event} event The event to prevent the default\r
221 * @deprecated 5.0.0\r
222 */\r
223 preventDefault: function(event) {\r
224 //<debug>\r
225 Ext.log.warn("Ext.EventManager.preventDefault() is deprecated. " +\r
226 "Call preventDefault() directly on the Ext.event.Event instance instead.");\r
227 //</debug>\r
228 event = event.browserEvent || event;\r
229 if (event.preventDefault) {\r
230 event.preventDefault();\r
231 } else {\r
232 event.returnValue = false;\r
233 // Some keys events require setting the keyCode to -1 to be prevented\r
234 try {\r
235 // all ctrl + X and F1 -> F12\r
236 if (event.ctrlKey || event.keyCode > 111 && event.keyCode < 124) {\r
237 event.keyCode = -1;\r
238 }\r
239 } catch (e) {\r
240 // see this outdated document http://support.microsoft.com/kb/934364/en-us for more info\r
241 }\r
242 }\r
243 },\r
244\r
245 /**\r
246 * Get the id of the element. If one has not been assigned, automatically assign it.\r
247 * @param {HTMLElement/Ext.dom.Element} element The element to get the id for.\r
248 * @return {String} id\r
249 * @deprecated 5.0.0\r
250 */\r
251 getId: function(element) {\r
252 //<debug>\r
253 Ext.log.warn("Ext.EventManager.getId() is deprecated. " +\r
254 "Call Ext.get() to assign ids to elements.");\r
255 //</debug>\r
256 element = Ext.get(element);\r
257 return element.id;\r
258 },\r
259\r
260 /**\r
261 * Gets the related target from the event.\r
262 * @param {Object} event The event\r
263 * @return {HTMLElement} The related target.\r
264 * @deprecated 5.0.0\r
265 */\r
266 getRelatedTarget: function(event) {\r
267 //<debug>\r
268 Ext.log.warn("Ext.EventManager.getRelatedTarget() is deprecated. " +\r
269 "Call getRelatedTarget() directly on the Ext.event.Event instance instead.");\r
270 //</debug>\r
271 event = event.browserEvent || event;\r
272 var target = event.relatedTarget;\r
273 if (!target) {\r
274 if (this.mouseLeaveRe.test(event.type)) {\r
275 target = event.toElement;\r
276 } else if (this.mouseEnterRe.test(event.type)) {\r
277 target = event.fromElement;\r
278 }\r
279 }\r
280 return this.resolveTextNode(target);\r
281 },\r
282\r
283 /**\r
284 * Gets the x coordinate from the event\r
285 * @param {Object} event The event\r
286 * @return {Number} The x coordinate\r
287 * @deprecated 5.0.0\r
288 */\r
289 getPageX: function(event) {\r
290 //<debug>\r
291 Ext.log.warn("Ext.EventManager.getPageX() is deprecated. " +\r
292 "Call getX() directly on the Ext.event.Event instance instead.");\r
293 //</debug>\r
294 return this.getPageXY(event)[0];\r
295 },\r
296\r
297 /**\r
298 * Gets the x & y coordinate from the event\r
299 * @param {Object} event The event\r
300 * @return {Number[]} The x/y coordinate\r
301 * @deprecated 5.0.0\r
302 */\r
303 getPageXY: function(event) {\r
304 //<debug>\r
305 Ext.log.warn("Ext.EventManager.getPageXY() is deprecated. " +\r
306 "Call getXY() directly on the Ext.event.Event instance instead.");\r
307 //</debug>\r
308 event = event.browserEvent || event;\r
309 var x = event.pageX,\r
310 y = event.pageY,\r
311 docEl = document.documentElement,\r
312 body = document.body;\r
313\r
314 // pageX/pageY not available (undefined, not null), use clientX/clientY instead\r
315 if (!x && x !== 0) {\r
316 x = event.clientX + (docEl && docEl.scrollLeft || body && body.scrollLeft || 0) - (docEl && docEl.clientLeft || body && body.clientLeft || 0);\r
317 y = event.clientY + (docEl && docEl.scrollTop || body && body.scrollTop || 0) - (docEl && docEl.clientTop || body && body.clientTop || 0);\r
318 }\r
319 return [x, y];\r
320 },\r
321\r
322 /**\r
323 * Gets the y coordinate from the event\r
324 * @param {Object} event The event\r
325 * @return {Number} The y coordinate\r
326 * @deprecated 5.0.0\r
327 */\r
328 getPageY: function(event) {\r
329 //<debug>\r
330 Ext.log.warn("Ext.EventManager.getPageY() is deprecated. " +\r
331 "Call getY() directly on the Ext.event.Event instance instead.");\r
332 //</debug>\r
333 return this.getPageXY(event)[1];\r
334 },\r
335\r
336 /**\r
337 * Gets the target of the event.\r
338 * @param {Object} event The event\r
339 * @return {HTMLElement} target\r
340 * @deprecated 5.0.0\r
341 */\r
342 getTarget: function(event) {\r
343 //<debug>\r
344 Ext.log.warn("Ext.EventManager.getTarget() is deprecated. " +\r
345 "Call getTarget() directly on the Ext.event.Event instance instead.");\r
346 //</debug>\r
347 event = event.browserEvent || event;\r
348 return Ext.EventManager.resolveTextNode(event.target || event.srcElement);\r
349 },\r
350\r
351 // technically no need to browser sniff this, however it makes\r
352 // no sense to check this every time, for every event, whether\r
353 // the string is equal.\r
354 /**\r
355 * @method\r
356 * Resolve any text nodes accounting for browser differences.\r
357 * @private\r
358 * @param {HTMLElement} node The node\r
359 * @return {HTMLElement} The resolved node\r
360 * @deprecated 5.0.0\r
361 */\r
362 resolveTextNode: Ext.isGecko ?\r
363 function(node) {\r
364 if (node) {\r
365 // work around firefox bug, https://bugzilla.mozilla.org/show_bug.cgi?id=101197\r
366 var s = HTMLElement.prototype.toString.call(node);\r
367 if (s !== '[xpconnect wrapped native prototype]' && s !== '[object XULElement]') {\r
368 return node.nodeType === 3 ? node.parentNode: node;\r
369 }\r
370 }\r
371 }\r
372 :\r
373 function(node) {\r
374 return node && node.nodeType === 3 ? node.parentNode: node;\r
375 }\r
376}, function(EventManager) {\r
377 /**\r
378 * @member Ext.EventManager\r
379 * @method on\r
380 * @inheritdoc Ext.EventManager#addListener\r
381 */\r
382 EventManager.on = EventManager.addListener;\r
383\r
384 /**\r
385 * @member Ext.EventManager\r
386 * @method un\r
387 * @inheritdoc Ext.EventManager#removeListener\r
388 */\r
389 EventManager.un = EventManager.removeListener;\r
390});