在IE8中访问event.target unobstrusive Javascript

时间:2010-04-15 01:09:26

标签: javascript events internet-explorer-8

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

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

4 个答案:

答案 0 :(得分: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;
 }

答案 1 :(得分:2)

根据我的经验,您描述的问题与获取事件的位置(窗口或处理程序参数)无关,而是由于事件是否“正确”引发。例如,如果您有一个文本输入元素并且在不传入事件对象的情况下调用其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');

答案 2 :(得分:1)

有史以来最短的版本:

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

答案 3 :(得分:0)

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

我修正如下:

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