2010-04-15 56 views
16

下面的函數獲取目標元素在一個下拉菜單:訪問event.target unobstrusive的Javascript

function getTarget(evt){ 

var targetElement = null; 

//if it is a standard browser 
if (typeof evt.target != 'undefined'){ 
    targetElement = evt.target; 
} 
//otherwise it is IE then adapt syntax 
else{ 
    targetElement = evt.srcElement; 
} 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

    return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 

不用說,它工作在火狐,Chrome,Safari和Opera,但在IE8不(我猜也是以前的版本)。 當我試着使用IE8調試它,我得到就行了錯誤「未找到成員」:

targetElement = evt.srcElement; 

與其他後續錯誤一起,但我認爲這是關鍵線。 任何幫助將不勝感激。


對不起,出於某種原因格式不正確。

下面是函數再次

function getTarget(evt){ 

var targetElement = null; 

//if it is a standard browser get target 
if (typeof evt.target != 'undefined'){ 
    targetElement = evt.target; 
} 
//otherwise it is IE then adapt syntax and get target 
else{ 
    targetElement = evt.srcElement; 
} 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

      return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 

} //結束了getTarget

+4

你應該使用jQuery。 – SLaks 2010-04-15 01:15:17

+1

是的,這將是簡單的方法;) – Mirko 2010-04-15 09:45:38

回答

2

以我的經驗,您所描述的問題是沒有關係的,其中在獲得事件(窗口或處理參數),而是由於無論該事件是否「適當地」提出。例如,如果您有文本輸入元素,並且您在不傳入事件對象的情況下調用其onchange方法,則event.srcElement屬性將爲空。

下面的代碼從Jehiah是有用

function fireEvent(element,event){ 
    if (document.createEventObject){ 
     // dispatch for IE 
     var evt = document.createEventObject(); 
     return element.fireEvent('on'+event,evt) 
    } 
    else{ 
     // dispatch for firefox + others 
     var evt = document.createEvent("HTMLEvents"); 
     evt.initEvent(event, true, true); // event type,bubbling,cancelable 
     return !element.dispatchEvent(evt); 
    } 
} 

調用示例:

fireEvent(element,'change'); 
32

的問題是,在IE中,事件對象不會被髮送作爲處理函數的參數,它僅僅是一個全球性財產(window.event):

function getTarget(evt){ 
evt = evt || window.event; // get window.event if argument is falsy (in IE) 

// get srcElement if target is falsy (IE) 
var targetElement = evt.target || evt.srcElement; 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

    return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 
+0

我其實做 evt = evt || window.event; 在調用函數之前,然後我解析evt到getTarget函數... – Mirko 2010-04-15 10:10:43

0

我也遇到了這個問題。 問題是:在IE8中,事件必須是window.event,而不是在params中聲明的事件。

我定如下:

function onclick(event){ 
     if (is_ie8()){ 
     clicked_element = window.event.srcElement 
     } else { 
     clicked_element = event.target 
     } 
    } 
1

見過最短的版本:

function getTarget(e) { 
var evn = e || window.event; 
return evn.srcElement || e.target; 
}