[英]Access event.target in IE8 unobtrusive 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;
}
毋庸置疑,它適用於Firefox,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
問題是在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;
}
有史以來最短的版本:
function getTarget(e) {
var evn = e || window.event;
return evn.srcElement || e.target;
}
根據我的經驗,您描述的問題與獲取事件的位置(窗口或處理程序參數)無關,而是由於事件是否“正確”引發。 例如,如果您有一個文本輸入元素並且在不傳入事件對象的情況下調用其onchange方法,則event.srcElement屬性將為null。
來自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');
我也遇到了這個問題。 問題是:在IE8中,事件必須是window.event
,而不是在params中聲明的事件。
我修復如下:
function onclick(event){
if (is_ie8()){
clicked_element = window.event.srcElement
} else {
clicked_element = event.target
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.