IE8下的替代elementFromPoint函数
因为IE8下的elementFromPoint(x, y)中,x, y 不能同时为非立即数,所以自己写一个替代的函数。
/* * 该函数用于模仿:elementFromPoint. * 获取parent这个元素下,含有tagCls这个class属性,又包含(x, y)这个client位置的最佳元素。 * return el; */getPerfectTag : function(parent, tagCls, x, y) {// 第一层筛选:parent下,所有含tagCls的元素var children = KISSY.DOM.query('.' + tagCls, parent); tags = [];if(children.length === 0) return null;// 第二层筛选: 包含(x, y)点的元素tags = getInXY(children);function getInXY(children) {var tags = [];hx.each(children, function(item) {var x0 = item.offsetLeft,y0 = item.offsetTop,x1 = x0 + item.offsetWidth,y1 = y0 + item.offsetHeight;// 该item包含了鼠标所在的点if( (x0<=x && x1>=x) && (y0<=y && y1>=y)) {var obj = {item : item,zindex : $(item).css('zindex') || null,isTop : $(item).children("." + tagCls).length === 0 // 它的孩子是否已经不含有tagCls};tags.push(obj);}});return tags;}var len = tags.length;// 如果所有包含tagCls的元素,均不包含(x, y),那么需要查找children的所有后代元素。因为可能子元素偏离父元素的盒子模型。if(len === 0) {var tag;function getAllChildren(el, all) {var all = all || [];if(el === null) return null;all.push(el);hx.each($(el).children(), function(item) {getAllChildren(item, all);});return all;}// 逐个查找满足tagCls的元素的所有后代元素,并把该集合放入(x, y)进行匹配,匹配成功则算是查找成功。hx.each(children, function(item) {var all = getAllChildren(item);var temps = getInXY(all);if(temps.length > 0) {tag = temps[0].item;return false;}});return tag;}