2010-04-15 14 views
16

La función siguiente obtiene el elemento de destino en un menú desplegable:event.target acceso en IE8 unobstrusive 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; 
} 

hace falta decir que funciona en Firefox, Chrome, Safari y Opera, pero no lo hace en IE8 (y creo que en versiones anteriores también). Cuando intento para depurarlo con IE8 me sale el "Miembro no encontrado" error en la línea:

targetElement = evt.srcElement; 

junto con otros errores posteriores, pero creo que esta es la línea clave. Cualquier ayuda será apreciada.


Disculpe, por alguna razón, el formato no es el correcto.

Aquí es de nuevo la función

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

} // fin getTarget

+4

que puedes usar jQuery. – SLaks

+1

Sí, esa sería la manera fácil;) – Mirko

Respuesta

2

En mi experiencia, el problema que usted describe no está relacionada con la que se obtiene el evento (ventana o parámetro de controlador), sino más bien debido a si el evento fue o no "planteado correctamente". Por ejemplo, si tiene un elemento de entrada de texto y llama a su método onchange sin pasar un objeto de evento, la propiedad event.srcElement será nula.

El siguiente código de Jehiah es útil

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

Ejemplo llamada:

fireEvent(element,'change'); 
32

El problema es que en el IE, el objeto de evento no se envía como un argumento del manipulador, es sólo un mundial propiedad (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; 
} 
+0

De hecho, hago evt = evt || window.event; antes de invocar la función y luego analizo evt a la función getTarget ... – Mirko

0

me encontré con este problema también. Y el problema es: en IE8, el evento debe ser window.event, no el evento que se declara en params.

i fijo de la siguiente manera:

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

versión más corta jamás visto:

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