自然,我们都习惯了 IE,在 IE 中要在函数中获得各事件对象很容易,直接用 event、event.srcElemtn、event.fromElement、event.toElement 就行了。在 FireFox 中获得触发事件的元素可以用 event.target,但其他两个 fromElement 和 toElement 就要费些周折。
所以,为了保持一致的使用方式,也为了保持原有的使用习惯,我们加入以下 JS 代码(代码有些紧凑,未加注释,应该很好理解):
<script language="javascript">
//addEventListener是为一个事件添加一个监听,使用方法见http://cindylu520.iteye.com/admin/blogs/588652
//此处if判断是否是火狐浏览器
if(window.addEventListener) { FixPrototypeForGecko(); }
function FixPrototypeForGecko()
{
//prototype属性允许你向一个对象添加属性和方法
//__defineGetter__和__defineSetter__是Firefox的特有方法,可以利用来它自定义对象的方法。
//使用方法见:http://cindylu520.iteye.com/admin/blogs/588667
//runtimeStyle 运行时的样式!如果与style的属性重叠,将覆盖style的属性!
HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);
//代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状态。
window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);
//event.srcElement当前事件的源,IE下,event对象有srcElement属性,但是没有target属性;Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的
Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);
//当前事件有移动成分时,如onmouseover、onmouseout等fromElement、toElement表示移动事件的两个端点
Event.prototype.__defineGetter__("fromElement", element_prototype_get_fromElement);
Event.prototype.__defineGetter__("toElement", element_prototype_get_toElement);
}
function element_prototype_get_runtimeStyle() { return this.style; }
function window_prototype_get_event() { return SearchEvent(); }
function event_prototype_get_srcElement() { return this.target; }
function element_prototype_get_fromElement() {
var node;
//relatedTarget 事件属性返回与事件的目标节点相关的节点。
//对于 mouseover 事件来说,该属性是鼠标指针移到目标节点上时所离开的那个节点。
//对于 mouseout 事件来说,该属性是离开目标时,鼠标指针进入的节点。
//对于其他类型的事件来说,这个属性没有用。
//详情:http://cindylu520.iteye.com/admin/blogs/588678
if(this.type == "mouseover") node = this.relatedTarget;
else if (this.type == "mouseout") node = this.target;
if(!node) return;
while (node.nodeType != 1)
node = node.parentNode;
return node;
}
function element_prototype_get_toElement() {
var node;
if(this.type == "mouseout") node = this.relatedTarget;
else if (this.type == "mouseover") node = this.target;
if(!node) return;
while (node.nodeType != 1)
node = node.parentNode;
return node;
}
function SearchEvent()
{
if(document.all) return window.event;
func = SearchEvent.caller;
while(func!=null){
var arg0=func.arguments[0];
if(arg0 instanceof Event) {
return arg0;
}
func=func.caller;
}
return null;
}
</script>
好了,现在不管是在 IE 中还是在 FireFox 中,触发事件后都有了 event、event.srcElement、event.fromElement、event.toElement 属性了。这就来做个测试吧:
<script>
function test(){
alert("event:" + event +", srcElement:"+event.srcElement.innerHTML+
", fromElement:"+event.fromElement.innerHTML + ", toElement:"+event.toElement.innerHTML)
}
</script>
<button onmouseout="test()">MouseOut</button><button onmouseover="test()">MouseOver</button>
页面中有两个按钮 MouseOut 和 MouseOver,你掠过第一个按钮到第二个按钮上是,有看到这样内容的窗口:
从上图可以看出,其实我是在 Google 的 Chrome 浏览器中作的测试,也是有效的。标题虽说是兼容 IE 和 FireFox,但宽松点说就是 IE 和非 IE,因为 IE 总喜欢剑起偏锋,不按规范办事,不过这种事在 IE 8 中是收敛了许多。
(转自:http://kb.cnblogs.com/b/286274/)
分享到:
相关推荐
### 给moz-firefox下添加IE方法和属性 #### 背景介绍 在Web开发过程中,由于不同的浏览器对Web标准的支持程度不一,开发者往往需要处理浏览器间的兼容性问题。尤其是在早期,Internet Explorer(IE)与其他现代...
在本例中,代码的目标是使Firefox支持`insertAdjacentElement`这个IE特有的方法,以及一些与事件相关的属性,如`returnValue`、`cancelBubble`、`srcElement`、`fromElement`、`toElement`、`offsetX`和`offsetY`。...
IE支持这两个属性,而Firefox则使用event.relatedTarget属性。 cancelBubble是一个布尔属性,将其设置为true时可以阻止事件继续向上冒泡。此功能在IE中可用,而在标准的W3C DOM中,推荐使用stopPropagation()方法。...
此外,还有一些浏览器特有的属性,如IE的`srcElement`(与DOM的`event.target`类似)、`fromElement`和`toElement`(表示鼠标移出和移入的元素),以及`cancelBubble`(用于阻止事件冒泡,等同于`stopPropagation()`...
这四个属性分别用来判断当前浏览器是否是 Mozilla、IE、Firefox 或 Opera。 Browser = new Object(); Browser.isMozilla = (typeof document.implementation != 'undefined') && (typeof document.implementation...