本来event.target用得好好的,结果IE不支持,只有一个event.srcElement.
但是这两者只有区别的,target的话可以准确定位到事件触发的元素,顾名思义是目标嘛。
而srcElement有时却不尽人意,比方说有些情况是TABLE注册了事件,然后当事件触发时再用event对象来获取触发事件的Element,获取Element后再做逻辑判断来调用其他业务操作。
在这种比较复杂的情况之下往往很容易出现Element混淆的情况(指srcElement),拿到的不是目标事件的对象,而是注册事件的TABLE。如果是自己写的JavaScript还好,但如果不是的话,往往比较麻烦了,因为改动越多,就越有可能产生BUG。
无奈之下只好看看有没有办法解决IE下的这个问题。
想到的解决办法有两个。
1、用坐标解决,即判断目标元素的坐标范围和事件的鼠标坐标进行匹配。
2、在目标元素上添加onclick事件。
首先试了下第二种方法,结果也是为未能解决,原因是原来代码的业务问题,事件太多被其他事件覆盖或者混淆之类。所以只好跑回直接直观的第一种方法之上,虽然个人不太喜欢,因为比较土,但也没办法了。谁叫IE也是那么土。
具体代码如下:
var isClickEL = function(el){
if(!isIE()||!el)return false;
var coords = getCoords(el);
var elTop = coords.top;
var elBottom = 0;
var elLeft = coords.left;
var elRight = 0;
var elHeight = el.offsetHeight;
var elWidth = el.offsetWidth;
elBottom = elTop + elHeight;
elRight = elLeft + elWidth;
var ev = window.event;
if(!ev)return false;
var mouseX = ev.clientX;
var mouseY = ev.clientY;
var isInTheWidth = (mouseX>=elLeft && mouseX<=elRight);
var isInTheHeight = (mouseY>=elTop && mouseY<=elBottom);
return (isInTheWidth && isInTheHeight);
}
var getCoords = function(el){
var box = el.getBoundingClientRect(),
isQuirk = (document.documentMode) ? (document.documentMode==5) ? true : false : ((document.compatMode=="CSS1Compat") ? false : true),
doc = el.ownerDocument,
body = doc.body,
html = doc.documentElement,
clientTop = html.clientTop || body.clientTop || 0,
clientLeft = html.clientLeft || body.clientLeft || 0,
top = box.top + (self.pageYOffset || !isQuirk && html.scrollTop || body.scrollTop ) - clientTop,
left = box.left + (self.pageXOffset || !isQuirk && html.scrollLeft || body.scrollLeft) - clientLeft;
return { top: top, left: left };
};
getCoords方法是网上看到的,觉得还不错。而在坐标方面没有太精确,例如边框大小像素之类的,因为也不需要太精确。