ext-base-event.js
资源名称:ext-3.1.0.zip [点击查看]
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:11k
源码类别:
JavaScript
开发平台:
JavaScript
- /*!
- * Ext JS Library 3.1.0
- * Copyright(c) 2006-2009 Ext JS, LLC
- * licensing@extjs.com
- * http://www.extjs.com/license
- */
- Ext.lib.Event = function() {
- var loadComplete = false,
- unloadListeners = {},
- retryCount = 0,
- onAvailStack = [],
- _interval,
- locked = false,
- win = window,
- doc = document,
- // constants
- POLL_RETRYS = 200,
- POLL_INTERVAL = 20,
- EL = 0,
- TYPE = 0,
- FN = 1,
- WFN = 2,
- OBJ = 2,
- ADJ_SCOPE = 3,
- SCROLLLEFT = 'scrollLeft',
- SCROLLTOP = 'scrollTop',
- UNLOAD = 'unload',
- MOUSEOVER = 'mouseover',
- MOUSEOUT = 'mouseout',
- // private
- doAdd = function() {
- var ret;
- if (win.addEventListener) {
- ret = function(el, eventName, fn, capture) {
- if (eventName == 'mouseenter') {
- fn = fn.createInterceptor(checkRelatedTarget);
- el.addEventListener(MOUSEOVER, fn, (capture));
- } else if (eventName == 'mouseleave') {
- fn = fn.createInterceptor(checkRelatedTarget);
- el.addEventListener(MOUSEOUT, fn, (capture));
- } else {
- el.addEventListener(eventName, fn, (capture));
- }
- return fn;
- };
- } else if (win.attachEvent) {
- ret = function(el, eventName, fn, capture) {
- el.attachEvent("on" + eventName, fn);
- return fn;
- };
- } else {
- ret = function(){};
- }
- return ret;
- }(),
- // private
- doRemove = function(){
- var ret;
- if (win.removeEventListener) {
- ret = function (el, eventName, fn, capture) {
- if (eventName == 'mouseenter') {
- eventName = MOUSEOVER;
- } else if (eventName == 'mouseleave') {
- eventName = MOUSEOUT;
- }
- el.removeEventListener(eventName, fn, (capture));
- };
- } else if (win.detachEvent) {
- ret = function (el, eventName, fn) {
- el.detachEvent("on" + eventName, fn);
- };
- } else {
- ret = function(){};
- }
- return ret;
- }();
- function checkRelatedTarget(e) {
- return !elContains(e.currentTarget, pub.getRelatedTarget(e));
- }
- function elContains(parent, child) {
- if(parent && parent.firstChild){
- while(child) {
- if(child === parent) {
- return true;
- }
- child = child.parentNode;
- if(child && (child.nodeType != 1)) {
- child = null;
- }
- }
- }
- return false;
- }
- // private
- function _tryPreloadAttach() {
- var ret = false,
- notAvail = [],
- element, i, len, v,
- tryAgain = !loadComplete || (retryCount > 0);
- if (!locked) {
- locked = true;
- for (i = 0, len = onAvailStack.length; i < len; i++) {
- v = onAvailStack[i];
- if(v && (element = doc.getElementById(v.id))){
- if(!v.checkReady || loadComplete || element.nextSibling || (doc && doc.body)) {
- element = v.override ? (v.override === true ? v.obj : v.override) : element;
- v.fn.call(element, v.obj);
- v = null;
- } else {
- notAvail.push(v);
- }
- }
- }
- retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
- if (tryAgain) {
- startInterval();
- } else {
- clearInterval(_interval);
- _interval = null;
- }
- ret = !(locked = false);
- }
- return ret;
- }
- // private
- function startInterval() {
- if(!_interval){
- var callback = function() {
- _tryPreloadAttach();
- };
- _interval = setInterval(callback, POLL_INTERVAL);
- }
- }
- // private
- function getScroll() {
- var dd = doc.documentElement,
- db = doc.body;
- if(dd && (dd[SCROLLTOP] || dd[SCROLLLEFT])){
- return [dd[SCROLLLEFT], dd[SCROLLTOP]];
- }else if(db){
- return [db[SCROLLLEFT], db[SCROLLTOP]];
- }else{
- return [0, 0];
- }
- }
- // private
- function getPageCoord (ev, xy) {
- ev = ev.browserEvent || ev;
- var coord = ev['page' + xy];
- if (!coord && coord !== 0) {
- coord = ev['client' + xy] || 0;
- if (Ext.isIE) {
- coord += getScroll()[xy == "X" ? 0 : 1];
- }
- }
- return coord;
- }
- var pub = {
- extAdapter: true,
- onAvailable : function(p_id, p_fn, p_obj, p_override) {
- onAvailStack.push({
- id: p_id,
- fn: p_fn,
- obj: p_obj,
- override: p_override,
- checkReady: false });
- retryCount = POLL_RETRYS;
- startInterval();
- },
- // This function should ALWAYS be called from Ext.EventManager
- addListener: function(el, eventName, fn) {
- el = Ext.getDom(el);
- if (el && fn) {
- if (eventName == UNLOAD) {
- if (unloadListeners[el.id] === undefined) {
- unloadListeners[el.id] = [];
- }
- unloadListeners[el.id].push([eventName, fn]);
- return fn;
- }
- return doAdd(el, eventName, fn, false);
- }
- return false;
- },
- // This function should ALWAYS be called from Ext.EventManager
- removeListener: function(el, eventName, fn) {
- el = Ext.getDom(el);
- var i, len, li;
- if (el && fn) {
- if (eventName == UNLOAD) {
- if (unloadListeners[id] !== undefined) {
- for (i = 0, len = unloadListeners[id].length; i < len; i++) {
- li = unloadListeners[id][i];
- if (li && li[TYPE] == eventName && li[FN] == fn) {
- unloadListeners[id].splice(i, 1);
- }
- }
- }
- return;
- }
- doRemove(el, eventName, fn, false);
- }
- },
- getTarget : function(ev) {
- ev = ev.browserEvent || ev;
- return this.resolveTextNode(ev.target || ev.srcElement);
- },
- resolveTextNode : Ext.isGecko ? function(node){
- if(!node){
- return;
- }
- // work around firefox bug, https://bugzilla.mozilla.org/show_bug.cgi?id=101197
- var s = HTMLElement.prototype.toString.call(node);
- if(s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]'){
- return;
- }
- return node.nodeType == 3 ? node.parentNode : node;
- } : function(node){
- return node && node.nodeType == 3 ? node.parentNode : node;
- },
- getRelatedTarget : function(ev) {
- ev = ev.browserEvent || ev;
- return this.resolveTextNode(ev.relatedTarget ||
- (ev.type == MOUSEOUT ? ev.toElement :
- ev.type == MOUSEOVER ? ev.fromElement : null));
- },
- getPageX : function(ev) {
- return getPageCoord(ev, "X");
- },
- getPageY : function(ev) {
- return getPageCoord(ev, "Y");
- },
- getXY : function(ev) {
- return [this.getPageX(ev), this.getPageY(ev)];
- },
- stopEvent : function(ev) {
- this.stopPropagation(ev);
- this.preventDefault(ev);
- },
- stopPropagation : function(ev) {
- ev = ev.browserEvent || ev;
- if (ev.stopPropagation) {
- ev.stopPropagation();
- } else {
- ev.cancelBubble = true;
- }
- },
- preventDefault : function(ev) {
- ev = ev.browserEvent || ev;
- if (ev.preventDefault) {
- ev.preventDefault();
- } else {
- ev.returnValue = false;
- }
- },
- getEvent : function(e) {
- e = e || win.event;
- if (!e) {
- var c = this.getEvent.caller;
- while (c) {
- e = c.arguments[0];
- if (e && Event == e.constructor) {
- break;
- }
- c = c.caller;
- }
- }
- return e;
- },
- getCharCode : function(ev) {
- ev = ev.browserEvent || ev;
- return ev.charCode || ev.keyCode || 0;
- },
- //clearCache: function() {},
- // deprecated, call from EventManager
- getListeners : function(el, eventName) {
- Ext.EventManager.getListeners(el, eventName);
- },
- // deprecated, call from EventManager
- purgeElement : function(el, recurse, eventName) {
- Ext.EventManager.purgeElement(el, recurse, eventName);
- },
- _load : function(e) {
- loadComplete = true;
- var EU = Ext.lib.Event;
- if (Ext.isIE && e !== true) {
- // IE8 complains that _load is null or not an object
- // so lets remove self via arguments.callee
- doRemove(win, "load", arguments.callee);
- }
- },
- _unload : function(e) {
- var EU = Ext.lib.Event,
- i, j, l, v, ul, id, len, index, scope;
- for (id in unloadListeners) {
- ul = unloadListeners[id];
- for (i = 0, len = ul.length; i < len; i++) {
- v = ul[i];
- if (v) {
- try{
- scope = v[ADJ_SCOPE] ? (v[ADJ_SCOPE] === true ? v[OBJ] : v[ADJ_SCOPE]) : win;
- v[FN].call(scope, EU.getEvent(e), v[OBJ]);
- }catch(ex){}
- }
- }
- };
- unloadListeners = null;
- Ext.EventManager._unload();
- doRemove(win, UNLOAD, EU._unload);
- }
- };
- // Initialize stuff.
- pub.on = pub.addListener;
- pub.un = pub.removeListener;
- if (doc && doc.body) {
- pub._load(true);
- } else {
- doAdd(win, "load", pub._load);
- }
- doAdd(win, UNLOAD, pub._unload);
- _tryPreloadAttach();
- return pub;
- }();