以下函数在下拉菜单中获取目标元素:
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
答案 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
}
}