Extjsソースの--Ext.lib.Dom(Domの基本パッケージ)
6288 ワード
ExtjsのDomに対する最も基本的なパッケージは、要素の包含関係、元素またはドキュメントの視認性の高さ、元素の位置、設定要素の位置、これらはelmentの最も基本的な属性であり、各ブラウザの互換性に関する問題があります.第二版第11章261-228ページ
(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]);
}
};
})();