Mirko Mirko - 2 months ago 18
Javascript Question

Access event.target in IE8 unobstrusive Javascript

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:

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

Answer

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.

The following code from Jehiah is useful

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