📄 eventmanager.js
字号:
/*
* Ext JS Library 2.2
* Copyright(c) 2006-2008, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
/** * @class Ext.EventManager * Registers event handlers that want to receive a normalized EventObject instead of the standard browser event and provides * several useful events directly. * See {@link Ext.EventObject} for more details on normalized event objects. * @singleton */Ext.EventManager = function(){ var docReadyEvent, docReadyProcId, docReadyState = false; var resizeEvent, resizeTask, textEvent, textSize; var E = Ext.lib.Event; var D = Ext.lib.Dom; // fix parser confusion var xname = 'Ex' + 't'; var elHash = {}; var addListener = function(el, ename, fn, wrap, scope){ var id = Ext.id(el); if(!elHash[id]){ elHash[id] = {}; } var es = elHash[id]; if(!es[ename]){ es[ename] = []; } var ls = es[ename]; ls.push({ id: id, ename: ename, fn: fn, wrap: wrap, scope: scope }); E.on(el, ename, wrap); if(ename == "mousewheel" && el.addEventListener){ // workaround for jQuery el.addEventListener("DOMMouseScroll", wrap, false); E.on(window, 'unload', function(){ el.removeEventListener("DOMMouseScroll", wrap, false); }); } if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document Ext.EventManager.stoppedMouseDownEvent.addListener(wrap); } } var removeListener = function(el, ename, fn, scope){ el = Ext.getDom(el); var id = Ext.id(el), es = elHash[id], wrap; if(es){ var ls = es[ename], l; if(ls){ for(var i = 0, len = ls.length; i < len; i++){ l = ls[i]; if(l.fn == fn && (!scope || l.scope == scope)){ wrap = l.wrap; E.un(el, ename, wrap); ls.splice(i, 1); break; } } } } if(ename == "mousewheel" && el.addEventListener && wrap){ el.removeEventListener("DOMMouseScroll", wrap, false); } if(ename == "mousedown" && el == document && wrap){ // fix stopped mousedowns on the document Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap); } } var removeAll = function(el){ el = Ext.getDom(el); var id = Ext.id(el), es = elHash[id], ls; if(es){ for(var ename in es){ if(es.hasOwnProperty(ename)){ ls = es[ename]; for(var i = 0, len = ls.length; i < len; i++){ E.un(el, ename, ls[i].wrap); ls[i] = null; } } es[ename] = null; } delete elHash[id]; } } var fireDocReady = function(){ if(!docReadyState){ docReadyState = Ext.isReady = true; if(Ext.isGecko || Ext.isOpera) { document.removeEventListener("DOMContentLoaded", fireDocReady, false); } } if(docReadyProcId){ clearInterval(docReadyProcId); docReadyProcId = null; } if(docReadyEvent){ docReadyEvent.fire(); docReadyEvent.clearListeners(); } }; var initDocReady = function(){ docReadyEvent = new Ext.util.Event(); if(Ext.isReady){ return; } // no matter what, make sure it fires on load E.on(window, 'load', fireDocReady); if(Ext.isGecko || Ext.isOpera) { document.addEventListener('DOMContentLoaded', fireDocReady, false); } else if(Ext.isIE){ docReadyProcId = setInterval(function(){ try{ // throws errors until DOM is ready Ext.isReady || (document.documentElement.doScroll('left')); }catch(e){ return; } fireDocReady(); // no errors, fire }, 5); document.onreadystatechange = function(){ if(document.readyState == 'complete'){ document.onreadystatechange = null; fireDocReady(); } }; } else if(Ext.isSafari){ docReadyProcId = setInterval(function(){ var rs = document.readyState; if(rs == 'complete') { fireDocReady(); } }, 10); } }; var createBuffered = function(h, o){ var task = new Ext.util.DelayedTask(h); return function(e){ // create new event object impl so new events don't wipe out properties e = new Ext.EventObjectImpl(e); task.delay(o.buffer, h, null, [e]); }; }; var createSingle = function(h, el, ename, fn, scope){ return function(e){ Ext.EventManager.removeListener(el, ename, fn, scope); h(e); }; }; var createDelayed = function(h, o){ return function(e){ // create new event object impl so new events don't wipe out properties e = new Ext.EventObjectImpl(e); setTimeout(function(){ h(e); }, o.delay || 10); }; }; var listen = function(element, ename, opt, fn, scope){ var o = (!opt || typeof opt == "boolean") ? {} : opt; fn = fn || o.fn; scope = scope || o.scope; var el = Ext.getDom(element); if(!el){ throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; } var h = function(e){ // prevent errors while unload occurring if(!window[xname]){ return; } e = Ext.EventObject.setEvent(e); var t; if(o.delegate){ t = e.getTarget(o.delegate, el); if(!t){ return; } }else{ t = e.target; } if(o.stopEvent === true){ e.stopEvent(); } if(o.preventDefault === true){ e.preventDefault(); } if(o.stopPropagation === true){ e.stopPropagation(); } if(o.normalized === false){ e = e.browserEvent; } fn.call(scope || el, e, t, o); }; if(o.delay){ h = createDelayed(h, o); } if(o.single){ h = createSingle(h, el, ename, fn, scope); } if(o.buffer){ h = createBuffered(h, o); } addListener(el, ename, fn, h, scope); return h; }; var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/; var pub = { /** * Appends an event handler to an element. The shorthand version {@link #on} is equivalent. Typically you will * use {@link Ext.Element#addListener} directly on an Element in favor of calling this version. * @param {String/HTMLElement} el The html element or id to assign the event handler to * @param {String} eventName The type of event to listen for * @param {Function} handler The handler function the event invokes This function is passed * the following parameters:<ul> * <li>evt : EventObject<div class="sub-desc">The {@link Ext.EventObject EventObject} describing the event.</div></li> * <li>t : Element<div class="sub-desc">The {@link Ext.Element Element} which was the target of the event. * Note that this may be filtered by using the <tt>delegate</tt> option.</div></li> * <li>o : Object<div class="sub-desc">The options object from the addListener call.</div></li> * </ul> * @param {Object} scope (optional) The scope in which to execute the handler * function (the handler function's "this" context) * @param {Object} options (optional) An object containing handler configuration properties. * This may contain any of the following properties:<ul> * <li>scope {Object} : The scope in which to execute the handler function. The handler function's "this" context.</li> * <li>delegate {String} : A simple selector to filter the target or look for a descendant of the target</li> * <li>stopEvent {Boolean} : True to stop the event. That is stop propagation, and prevent the default action.</li> * <li>preventDefault {Boolean} : True to prevent the default action</li> * <li>stopPropagation {Boolean} : True to prevent event propagation</li> * <li>normalized {Boolean} : False to pass a browser event to the handler function instead of an Ext.EventObject</li> * <li>delay {Number} : The number of milliseconds to delay the invocation of the handler after te event fires.</li> * <li>single {Boolean} : True to add a handler to handle just the next firing of the event, and then remove itself.</li> * <li>buffer {Number} : Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed * by the specified number of milliseconds. If the event fires again within that time, the original * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</li> * </ul><br> * <p>See {@link Ext.Element#addListener} for examples of how to use these options.</p> */ addListener : function(element, eventName, fn, scope, options){ if(typeof eventName == "object"){ var o = eventName; for(var e in o){ if(propRe.test(e)){ continue; } if(typeof o[e] == "function"){ // shared options listen(element, e, o, o[e], o.scope); }else{ // individual options listen(element, e, o[e]); } } return; } return listen(element, eventName, options, fn, scope); }, /** * Removes an event handler from an element. The shorthand version {@link #un} is equivalent. Typically * you will use {@link Ext.Element#removeListener} directly on an Element in favor of calling this version. * @param {String/HTMLElement} el The id or html element from which to remove the event * @param {String} eventName The type of event * @param {Function} fn The handler function to remove */ removeListener : function(element, eventName, fn, scope){ return removeListener(element, eventName, fn, scope); }, /** * Removes all event handers from an element. Typically you will use {@link Ext.Element#removeAllListeners} * directly on an Element in favor of calling this version. * @param {String/HTMLElement} el The id or html element from which to remove the event */ removeAll : function(element){ return removeAll(element); }, /** * Fires when the document is ready (before onload and before images are loaded). Can be * accessed shorthanded as Ext.onReady().
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -