`
y1d2y3xyz
  • 浏览: 257125 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Extjs源码之--Ext.lib.Dom(Dom的基本封装)

阅读更多
Extjs的对Dom最基础的封装,主要包括:元素的包含关系,元素或文档的可视宽高,获取元素的位置,设置元素的位置,这些都是elment最基础的属性,这涉及到各个浏览器兼容器问题,如果想获得详细解答,可以看看 Nicholas C.Zakas 的《javascript高级程序设计》第二版 第11章261-268页

(function(){
	var doc = document,
                  //浏览器盒状模式:BackCompa->Quirks Modet和CSS1Compat->Standards Mode 跟文档声明相关
		isCSS1 = doc.compatMode == "CSS1Compat",//Ext.isStrict就是这么做的,为什么Ext不用这个,这里重新设置下,而且下面也有用这个,有点想不通这么做的用意
		MAX = Math.max,		
        ROUND = Math.round,
		PARSEINT = parseInt;
		
	Ext.lib.Dom = {
	    isAncestor : function(p, c) {//判断p是否包含子节点c
		    var ret = false;
			
			p = Ext.getDom(p);
			c = Ext.getDom(c);
			if (p && c) {
          //contains IE,Safari 3+,Opear 8+,Chorme 支持 contains
				if (p.contains) {
					return p.contains(c);
				} else if (p.compareDocumentPosition) {//ff 支持compareDocumentPosition,并有返回值,1->无关 2->居前 3->居后 8->包含 16->被包含
					return !!(p.compareDocumentPosition(c) & 16);
				} else {//循环查找的方式
					while (c = c.parentNode) {
						ret = c == p || ret;	        			
					}
				}	            
			}	
			return ret;
		},
	//这个调用下面的方法	
        getViewWidth : function(full) {
            return full ? this.getDocumentWidth() : this.getViewportWidth();
        },
        //这个调用下面的方法	
        getViewHeight : function(full) {
            return full ? this.getDocumentHeight() : this.getViewportHeight();
        },
        //接下来的四个方法很简单,也就是从浏览器版本和盒子模型上的兼容性做判断
        getDocumentHeight: function() {            
            return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight());
        },

        getDocumentWidth: function() {            
            return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth());
        },

        getViewportHeight: function(){
	        return Ext.isIE ? 
	        	   (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
	        	   self.innerHeight;
        },

        getViewportWidth : function() {
	        return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth :
	        	   Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;
        },
        
        getY : function(el) {
            return this.getXY(el)[1];
        },

        getX : function(el) {
            return this.getXY(el)[0];
        },
        //核心获取节点的x y 是位置
        getXY : function(el) {
            var p, 
            	pe, 
            	b,
            	bt, 
            	bl,     
            	dbd,       	
            	x = 0,
            	y = 0, 
            	scroll,
            	hasAbsolute, 
            	bd = (doc.body || doc.documentElement),
            	ret = [0,0];
            	
            el = Ext.getDom(el);

            if(el != bd){
            //getBoundingClientRect,IE,FF3+,Opera9.5+ 都支持,IE和其他浏览器对于文档的位置是不一样的,IE为(2,2),其他为(0,0)
	            if (el.getBoundingClientRect) {
	                b = el.getBoundingClientRect();
	                scroll = fly(document).getScroll();
	                ret = [ROUND(b.left + scroll.left), ROUND(b.top + scroll.top)];
	            } else {  
		            p = el;		
		            hasAbsolute = fly(el).isStyle("position", "absolute");
		//循环向上查找元素,并改变元素的x,y
		            while (p) {
			            pe = fly(p);		
		                x += p.offsetLeft;
		                y += p.offsetTop;
		
		                hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");
		                		
		                if (Ext.isGecko) {		  //isGecko 需要加上边框值                  
		                    y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0;
		                    x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0;	
		
		                    if (p != el && !pe.isStyle('overflow','visible')) {
		                        x += bl;
		                        y += bt;
		                    }
		                }
		                p = p.offsetParent;
		            }
		
		            if (Ext.isSafari && hasAbsolute) {
		                x -= bd.offsetLeft;
		                y -= bd.offsetTop;
		            }
		
		            if (Ext.isGecko && !hasAbsolute) {
		                dbd = fly(bd);
		                x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0;
		                y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0;
		            }
		
		            p = el.parentNode;
		            while (p && p != bd) {
		                if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
		                    x -= p.scrollLeft;
		                    y -= p.scrollTop;
		                }
		                p = p.parentNode;
		            }
		            ret = [x,y];
	            }
         	}
            return ret
        },

        setXY : function(el, xy) {
            (el = Ext.fly(el, '_setXY')).position();
            //参见 Ext.Element.translatePoints,其返回left,top值
            var pts = el.translatePoints(xy),
            	style = el.dom.style,
            	pos;            	
            
            for (pos in pts) {	            
	            if(!isNaN(pts[pos])) style[pos] = pts[pos] + "px"
            }
        },

        setX : function(el, x) {
            this.setXY(el, [x, false]);
        },

        setY : function(el, y) {
            this.setXY(el, [false, y]);
        }
    };
})();
分享到:
评论

相关推荐

    extjs-Ext.ux.form.LovCombo下拉框

    标题中的"extjs-Ext.ux.form.LovCombo下拉框"表明我们要讨论的是EXTJS中的一个特定组件,它是EXTJS的扩展插件,用于实现具有多选功能的下拉框。这个组件在处理火狐浏览器兼容性问题上做了优化,解决了在火狐浏览器下...

    3------通过实例学习------Ext.js------.docx

    Ext.get('example').dom.innerHTML = txt; } else if (btn == 'cancel') { // do something on cancel } }, animateTarget: 'addAddressBtn', icon: Ext.window.MessageBox.INFO }); }); ``` 在上述...

    ext-lang-en.js和ext-lang-zh_CN.js

    Extjs中实现国际化要用到的文件ext-lang-zh_CN.js和ext-lang-en.js

    extjs jsb文件(ext-4.2.1.883.jsb2)

    从ext官方论坛上下的。 文件名: ext-4.2.1.883.jsb2 对应版本ext-4.2.1.883

    ext-4.2.1.883.jsb2

    从spket IDE 官网下载。 文件名: ext-4.2.1.883.jsb2 对应版本ext-4.2.*版本。spket自动提示ExtJs4,需要ext4.2.1.jsp2文件。

    extjs-docs-6.0.0-classic.part01.rar

    Ext JS 6最大的变化就是将Ext JS和Touch合并为一个单一的框架。之前的框架的核心(数据、控制器、模型等等)已被调和为一个单一的公共平台。这样,数据和逻辑就能共享,从而帮助开发人员进一步去优化他们的应用程序...

    Extjs 6.2 最新sdk ext-6.2.0-gpl.zip

    官方最新版本Extjs6.2版本sdk,创建新项目的时候需要用, 全面的核心框架,具有最新的Javascript标准支持 新的漂亮组件和主题,以创建漂亮的企业应用程序 现代工具链,用于构建优化,高性能,通用的应用程序 用于可视...

    Extjs源码之--Ext事件机制/继承关系

    在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理主要由EventManager.js这个文件负责,它是EXTJS事件系统的基础。 首先,EXTJS的事件机制基于观察者...

    ext-4.2.1.883.7z 官方最新版7z压缩

    标题中的"ext-4.2.1.883.7z"指的是ExtJS框架的一个特定版本,4.2.1.883,它被压缩成了7z格式的文件。7z是一种高效的文件压缩格式,由7-Zip软件创建,以提供更高的压缩比和更快的解压缩速度。7z文件通常需要使用支持7...

    ExtJs选中var editor = new Ext.ux.grid.RowEditor详解

    ### ExtJs选中 `var editor = new Ext.ux.grid.RowEditor` 详解 在Web开发领域,特别是使用ExtJs框架进行复杂用户界面构建时,`RowEditor` 是一个非常实用的功能,它允许用户直接在表格行内编辑数据,极大地提高了...

    ext-7.0.0-gpl.zip

    标题中的"ext-7.0.0-gpl.zip"是一个软件扩展或库的压缩包,遵循GPL(GNU General Public License)开源协议。这通常意味着它是一个免费的、可修改的软件,用户可以查看源代码并根据需要进行定制,但必须保留原始许可...

    ExtJs学习资料28-Ext.data.JsonStore数据存储器.doc

    这段代码包含了ExtJs的基本样式表和JavaScript库,以及中文语言包,确保了组件的正常显示和中文支持。 接着,引入`Global.js`文件,这里通常包含了一些全局设置和初始化函数。同时,定义了一个CSS样式,用于设置...

    ext-7.2.0.67.zip

    Sencha Ext JS is the most comprehensive JavaScript framework for building data-intensive, cross-platform web and mobile applications for any modern device. Ext JS includes 140+ pre-integrated and ...

    ext-4.2.0.663 EXTJS官方最新版7z压缩

    在本压缩包"ext-4.2.0.663 EXTJS官方最新版7z压缩"中,文件名"ext-4.2.0.663"表明这是EXTJS 4.2.0的某个更新版本,具体为663号更新。这个版本可能包含了EXTJS框架的新特性、bug修复或者性能改进。由于使用了7z压缩,...

    extjs-620-docs.zip

    extjs-620-docs官方文档extjs-620-docs官方文档extjs-620-docs官方文档

    extjs-4.2.1.883.7z

    js框架 extjs-4.2.1.883.7z

    extjs2.2.1

    无论是界面之美,还是功能之强,ext的表格控件都高居榜首。 单选行,多选行,高亮显示选中的行,推拽改变列宽度,按列排序,这些基本功能ExtJS轻量级实现。 自动生成行号,支持checkbox全选,动态选择显示哪些列,...

    extjs-docs-6.0.0-classic.part02.rar

    Ext JS 6最大的变化就是将Ext JS和Touch合并为一个单一的框架。之前的框架的核心(数据、控制器、模型等等)已被调和为一个单一的公共平台。这样,数据和逻辑就能共享,从而帮助开发人员进一步去优化他们的应用程序...

    extjs-5.0.0.736.zip

    在本压缩包"extjs-5.0.0.736.zip"中,包含的是Ext JS 5.0 Beta版,这是一个早期的预览版本,旨在让开发者提前试用并提供反馈,以便在正式版本发布前改进。 Ext JS 5带来了许多新特性与改进,首先,它引入了MVVM...

    extjs-700-docs离线文档.zip

    这个"extjs-700-docs离线文档.zip"文件包含了ExtJS 7.0.0版本的完整离线开发文档,旨在帮助开发者在没有网络连接的情况下也能便捷地查阅API、示例和指南。 1. **ExtJS 7.0.0**: 这是ExtJS的一个主要版本,它引入了...

Global site tag (gtag.js) - Google Analytics