簡體   English   中英

在IE8中訪問event.target不顯眼的Javascript

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM