Доступ к 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
Ответы
Ответ 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
}
}