一、event.srcElement :
當前事件的源
var obj =
event.srcElement ? event.srcElement : event.target; //FF只能識別event.target
二、event.fromElement、event.toElement
- <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 屬性了。這就來作個測試吧:javascript
Java代碼
- <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,你掠過第一個按鈕到第二個按鈕上是,有看到這樣內容的窗口:java
從上圖能夠看出,其實我是在 Google 的 Chrome 瀏覽器中做的測試,也是有效的。標題雖然說是兼容 IE 和 FireFox,但寬鬆點說就是 IE 和非 IE,由於 IE 總喜歡劍起偏鋒,不按規範辦事,不過這種事在 IE 8 中是收斂了許多。node