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

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


(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]);
}
};
})();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//判断是否NT系统 function Boolean IsWindowsNt() library 'extlib.dll' ALIAS FOR "GetUserNameA;Ansi" //获得打印机总数 function integer GetPrinterCounts() library 'extlib.dll' ALIAS FOR "IsWindowsNt;Ansi" //得到打印机名称 function string GetPrinterName(integer iIndex) library 'extlib.dll' ALIAS FOR "GetPrinterName;Ansi" //得到缺省打印机 function string GetDefaultPrinter() library 'extlib.dll' ALIAS FOR "GetDefaultPrinter;Ansi" //在9x下自定义纸张大小 function integer SetPaperSizeFor9x(String PrinterName,integer PaperWidth,integer PaperLength) library 'extlib.dll' ALIAS FOR "SetPaperSizeFor9x;Ansi" //在NT下新增一个自定义大小的纸张 function integer AddFormForNT(string FormName,double PaperWidth,double PaperLength) library 'extlib.dll' ALIAS FOR "AddFormForNT;Ansi" //在NT下删除一个自定义大小的纸张 function integer DeleteFormForNT(String PrinterName,string FormName) library 'extlib.dll' ALIAS FOR "DeleteFormForNT;Ansi" //获取当前打印机所支持的纸张 function Integer GetPaperList(ref str_PaperList pList) library 'extlib.dll' ALIAS FOR "GetPaperList;Ansi" //获取指定打印机的端口 function string GetPrinterPort(string PrinterName) library 'extlib.dll' ALIAS FOR "GetPrinterPort;Ansi" //获取指定打印机的状态 function Integer GetPrinterStatus(string PrinterName) library 'extlib.dll' ALIAS FOR "GetPrinterStatus;Ansi" ////获取指定打印机的缺省纸张名称 function Integer GetPrinterPaper(string PrinterName) library 'extlib.dll' ALIAS FOR "GetPrinterPaper;Ansi" //获取指定打印机的纸张方向 function Integer GetPrinterOrientation(string PrinterName) library 'extlib.dll' ALIAS FOR "GetPrinterOrientation;Ansi" //设值指定打印机的纸张方向 function Integer SetPrinterOrientation(String PrinterName,Integer Orientation) library 'extlib.dll' ALIAS FOR "SetPrinterOrientation;Ansi" //设值缺省打印机 function Integer SetDefaultPrinter(String PrinterName) library 'extlib.dll' ALIAS FOR "SetDefaultPrinter;Ansi" //设置打印机属性 function Integer SetPrinterProperties(ulong HWND,String PrinterName) library 'extlib.dll' ALIAS FOR "SetPrinterProperties;Ansi" //设置缺省纸张 function Integer SetDefaultPaper(String PrinterName,Integer PaperIndex,Integer PaperWidth,Intege

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值