在 IE8 不显眼的 Javascript 中访问 event.target

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2642095/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 01:16:51  来源:igfitidea点击:

Access event.target in IE8 unobtrusive Javascript

javascripteventsinternet-explorer-8

提问by Mirko

The following function gets the target element in a dropdown menu:

以下函数获取下拉菜单中的目标元素:

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;
 }

Needless to say, it works in Firefox, Chrome, Safari and Opera but it does not in IE8 (and I guess in previous versions as well). When I try to debug it with IE8 I get the error "Member not Found" on the line:

不用说,它适用于 Firefox、Chrome、Safari 和 Opera,但不适用于 IE8(我猜在以前的版本中也是如此)。当我尝试使用 IE8 调试它时,我在行中收到错误“找不到成员”:

targetElement = evt.srcElement;

along with other subsequent errors, but I think this is the key line. Any help will be appreciated.

以及其他后续错误,但我认为这是关键所在。任何帮助将不胜感激。



Sorry, for some reason the formatting is not correct.

抱歉,由于某种原因,格式不正确。

Here is the function again

又是这个功能

 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;
}

}// end getTarget

}// 结束getTarget

采纳答案by Richard Collette

In my experience, the problem you describe is not related to where the event is obtained (window or handler parameter) but rather due to whether or not the event was raised "properly". For example, if you have a text input element and you call its onchange method without passing in an event object, the event.srcElement property will be null.

根据我的经验,您描述的问题与获取事件的位置(窗口或处理程序参数)无关,而是与事件是否“正确”引发有关。例如,如果您有一个文本输入元素,并且您在不传入事件对象的情况下调用其 onchange 方法,则 event.srcElement 属性将为 null。

The following code from Jehiahis useful

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);
   }
}

Example call:

示例调用:

fireEvent(element,'change');

回答by CMS

The problem is that in IE, the event object is not sent as an argument of the handler, it is just a global property (window.event):

问题是在 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;
 }

回答by Ivanzinho

Shortest version ever seen:

见过的最短版本:

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

回答by Bui Minh Thu

I met this problem too. And the problem is: in IE8, the event must be window.event, not the event that is declared in params.

我也遇到了这个问题。问题是:在 IE8 中,事件必须是window.event,而不是在 params 中声明的事件。

I fixed as below:

我固定如下:

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