Доступ к event.target в IE8 ненавязчивый Javascript - PullRequest
16 голосов
/ 15 апреля 2010

Следующая функция получает целевой элемент в выпадающем меню:

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

} // end getTarget

Ответы [ 4 ]

32 голосов
/ 15 апреля 2010

Проблема в том, что в 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;
 }
2 голосов
/ 04 марта 2011

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

Самая короткая версия из всех:

function getTarget(e) {
var evn = e || window.event;
return evn.srcElement || e.target;
}
0 голосов
/ 15 сентября 2016

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

Я исправил как показано ниже:

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