文件:ext-2.3.0/source/core/Ext.js 概述:Ext.js主要负责创建Ext全局对象,构建其命名空间,定义extend类继承方法,探测浏览器信息和对Javascript原生库进行扩展。 分析: 一、创建Ext全局对象 Js代码 // 创建Ext全局对象,大多数JS库为了避免和其他JS库命名冲突,都会把自己创建的类或函数封装到一个全局变量中去, // 这样就相当于创造了自己的命名空间,可以算是一个单例模式。例如,jQuery就是全部都封装到$变量中去。 Ext = {version: '2.3.0'}; 二、设置全局undefined变量 Js代码 // 兼容旧浏览器,早期的浏览器实现中,undefined并不是全局变量。就是说,你要判断一个变量是否是没定义, // 你需要这样写if (typeof a == 'undefined'),不可以写成if (a == undefined)。所以,上面的代码就可以理解了。 // 右面的window["undefined"],因为window对象没有undefined属性,所以其值为undefined, // 把undefined赋值给window的undefined属性上,就相当于把undefined设置成了全局变量, // 这样以后你再判断一个变量是否是未定义的时候,就不需要使用typeof,直接判断就可以了。 window["undefined"] = window["undefined"]; 三、定义apply方法属性复制函数 Js代码 // apply方法,把对象c中的属性复制到对象o中,支持默认属性defaults设置。这个方法属于对象属性的一个浅拷贝函数。 Ext.apply = function(o, c, defaults){ if(defaults){ // 如果默认值defaults存在,那么先把defaults上得属性复制给对象o Ext.apply(o, defaults); } if(o && c && typeof c == 'object'){ for(var p in c){ o[p] = c[p]; } } return o; }; 四、扩展Ext对象 Js代码 (function(){ // idSeed,用来生成自增长的id值。 var idSeed = 0; // ua,浏览器的用户代理,主要用来识别浏览器的型号、版本、内核和操作系统等。 var ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, // isStrict,表示当前浏览器是否是标准模式。 // 如果正确的设置了网页的doctype,则compatMode为CSS1Compat,否则为BackCompat isStrict = document.compatMode == "CSS1Compat", // isOpera,表示是否是opera浏览器。 isOpera = check(/opera/), // isChrome,表示是否是谷歌浏览器。 isChrome = check(/chrome/), // isWebKit,表示当前浏览器是否使用WebKit引擎。 // WebKit是浏览器内核,Safari和Chrome使用WebKit引擎。 isWebKit = check(/webkit/), // isSafari,表示是否是苹果浏览器,下面代码是对其版本识别。 isSafari = !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2 isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), // isIE,表示是否是IE浏览器,下面代码是对其版本识别。 isIE = !isOpera && check(/msie/), isIE7 = isIE && check(/msie 7/), isIE8 = isIE && check(/msie 8/), isIE6 = isIE && !isIE7 && !isIE8, // isGecko,表示当前浏览器是否使用Gecko引擎。 // Gecko是浏览器内核,Firefox使用Gecko引擎。 isGecko = !isWebKit && check(/gecko/), isGecko2 = isGecko && check(/rv:1\.8/), isGecko3 = isGecko && check(/rv:1\.9/), // isBorderBox,表示浏览器是否是IE的盒模式。 // 众所周知,IE的盒模式和W3C的盒模式不一致。当IE浏览器在怪异模式下,就会导致错误的盒模式。 isBorderBox = isIE && !isStrict, // isWindows,表示是否是windows操作系统。 isWindows = check(/windows|win32/), // isMac,表示是否是苹果操作系统。 isMac = check(/macintosh|mac os x/), // isAir,AIR(Adobe Integrated Runtime),是adobe开发的一个平台吧,不太了解,没用过。 isAir = check(/adobeair/), // isLinux,表示是否是Liunx操作系统。 isLinux = check(/linux/), // isSecure,表示是否是https连接。 isSecure = /^https/i.test(window.location.protocol); // 缓存一下CSS的背景图像,防止图像闪烁,应该是IE6的一个bug。 if(isIE6){ try{ document.execCommand("BackgroundImageCache", false, true); }catch(e){} } // 扩展Ext对象,有一些属性,这个文件中没有使用,现在先不解释其作用,后面遇到了再讲。 Ext.apply(Ext, { // isStrict,表示是否是标准模式。 isStrict : isStrict, // isSecure,表示是否是https连接。 isSecure : isSecure, // isReady,表示Dom文档树是否加载完成 isReady : false, // enableGarbageCollector和enableListenerCollection这两个变量在Element中使用了,解析到Element时再解释其含义。 enableGarbageCollector : true, enableListenerCollection:false, // SSL_SECURE_URL,这个值在构造隐藏的iframe时,用来设置src属性的,只是当是https连接的时候才用。 SSL_SECURE_URL : "javascript:false", // BLANK_IMAGE_URL,1像素透明图片地址 BLANK_IMAGE_URL : "http:/"+"/extjs.com/s.gif", // emptyFn,空函数 emptyFn : function(){}, // applyIf,把对象c的属性复制到对象o上,只复制o没有的属性 applyIf : function(o, c){ if(o && c){
Ext.js源代码分析
最新推荐文章于 2022-08-02 10:12:38 发布