Подтвердить что ты не робот

Доступ к event.target в IE8 ненавязчивый 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, я получаю сообщение об ошибке "Member not Found" в строке:

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

}//end getTarget

4b9b3361

Ответ 1

По моему опыту, описанная вами проблема не связана с тем, где получено событие (параметр окна или обработчика), а скорее из-за того, было ли событие поднято "правильно". Например, если у вас есть элемент ввода текста и вы вызываете его метод 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

Проблема заключается в том, что в 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;
 }

Ответ 3

Самая короткая из когда-либо виденных страниц:

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

Ответ 4

Я тоже встретил эту проблему. И проблема в том, что в IE8 событие должно быть window.event, а не событие, объявленное в параметрах.

I зафиксировано как показано ниже:

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