2009-01-27 14 views
24

¿Qué es un jQuery y/o las mejores prácticas para obtener el objetivo original de un evento en jQuery (o en el navegador javascript en general).La mejor manera de obtener el objetivo original

He estado usando algo como esto

$('body').bind('click', function(e){ 
     //depending on the browser, either srcElement or 
     //originalTarget will be populated with the first 
     //element that intercepted the click before it bubbled up 
     var originalElement = e.srcElement; 
     if(!originalElement){originalElement=e.originalTarget;}       
}); 

que funciona, pero no estoy satisfecho con la característica de dos líneas olfateando. ¿Hay una mejor manera?

+1

Tropezamos con esta vieja cuestión preguntando por qué ** [esta respuesta] (http://stackoverflow.com/a/4816990/2407212) ** con solo un tercio de los votos que la respuesta aceptada me parece mucho mejor. – Jonathan

Respuesta

34

Puede hacerlo en una línea con var originalElement = e.srcElement || e.originalTarget; pero no es bastante similar a jQuery ;-)

[Editar: Pero de acuerdo con http://docs.jquery.com/Events/jQuery.Event#event.targetevent.target podría hacer ...]

+8

¿No es este el tipo de cosas que jQuery debería estar abstrayendo? Estoy realmente sorprendido de esto. – cletus

+0

Recuerdo que intenté e.target hace un tiempo y me encontré con problemas. Parece que desde entonces han sido corregidos (o de lo contrario me han solucionado desde hace un tiempo). Además, los trucos de terminación elegantes me parecen dos líneas;) –

+0

¡Eres un maldito salvavidas! Gracias a Dios por este one-lier ... –

22

creo correo .target es lo que necesita

$('body').bind('click', function(e){ 
       e.target // the original target 
       e.target.id // the id of the original target            
}); 

Si vas a la jQuery in Action website y descargar el código fuente, echar un vistazo a

  • Capítulo 4 - dom.2.propagation.html

que se ocupa de la propagación de eventos con la burbuja y la captura de los manipuladores

19

Usando event.originalTarget puede causar "ha denegado el permiso para acceder a la propiedad 'XYZ' de una contexto sin cromo" -error, así que recomiendo el uso siguiente:

var target = event.target || event.srcElement || event.originalTarget; 

event.target trabajos en Firefox, Opera, Google Chrome y Safari.

+1

+1: Esta es la única versión que funcionó para mí en todos los navegadores. –

0

en Javascript normal, var t = (e.originalTarget)? E.originalTarget: e.srcElement; debería ser suficiente para leerlo en todos los navegadores.

+0

Esto es lo mismo que 'var t = e.srcElement || e.originalTarget; '(¡solo más!) –

2

En conjunción con How to detect a click outside an element?, aquí se explica cómo puede atrapar un subwidgets con una función similar de ocultar cuando se hace clic fuera para evitar que su propio pop-over se oculte junto con él; en este caso, estamos atrapando el jQuery UI DatePicker emergente sobre widgets:

// not using jquery .one handler for this, so we can persist outside click later 
$('html').click(function(evt) { 
    // just return if element has the datepicker as a parent 
    if ($(evt.target).parents('#ui-datepicker-div').length>0) return; 

    //toggle shut our widget pop-over 
    $('#mywidget').toggle(); 

    // now, unbind this event since our widget is closed: 
    $(this).unbind(evt); 
}); 
Cuestiones relacionadas