Cuando el navegador llama a una función como resultado de un evento de DOM, JavaScript pasa un objeto a la función que contiene información sobre el evento. Pero funciona un poco diferente en IE que otros. Para trabajar en todos los navegadores, foo()
debe tomar un argumento * (yo uso e
):
function foo(e) {
var sender = (e && e.target) || (window.event && window.event.srcElement);
//sender is the DOM element which was clicked
alert(sender.href); //assumes the clicked element was an <a>
}
La primera línea asignará "emisor" el valor del elemento que se originó el evento en todos los navegadores.
Ahora, si su <a>
contiene elementos secundarios (por ejemplo, una imagen) y uno de los era el elemento real se hace clic, a continuación, ese elemento se convertirá en el "emisor". Si esto es una posibilidad, es necesario subir el DOM desde el emisor hasta que encuentre su enlace:
function foo(e) {
var sender = (e && e.target) || (window.event && window.event.srcElement);
//sender is the DOM element which was clicked
var myEle = sender;
//find the parent node until we hit the <a>
while(myEle.tagName.toUpperCase() != 'A') {
myEle = myEle.parentNode;
}
//myEle is now the <a>. sender is still the originator.
alert(myEle.href);
}
* También se puede acceder a los argumentos que se pasan a la función, incluso si no se declaran, mediante el uso de la matriz arguments[]
.
me gusta cortocircuito sobre tirnary veces, yo mismo ... var = emisor (window.event && window.event.srcElement) || mi.objetivo; – Tracker1
@cresentfresh onclick es semánticamente incorrecto y extremadamente inflexible. Ver técnicas de mejora progresiva. –