IE8下的替代elementFromPoint函数
因为IE8下的elementFromPoint(x, y)中,x, y 不能同时为非立即数,所以自己写一个替代的函数。[javascript]
/*
* 该函数用于模仿: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; www.zzzyk.com
// 如果所有包含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;
}
});
补充:web前端 , JavaScript ,