2009-01-27 7 views
24

Qu'est-ce qu'un jQuery et/ou les meilleures pratiques pour obtenir la cible d'origine d'un événement dans jQuery (ou dans le navigateur javascript en général).Meilleure façon d'obtenir la cible d'origine

Je me sers quelque chose comme ça

$('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;}       
}); 

qui fonctionne, mais je ne suis pas satisfait de la fonctionnalité de deux lignes renifler. Y a-t-il un meilleur moyen?

+1

Nous sommes tombés sur cette vieille question se demandant pourquoi ** [cette réponse] (http://stackoverflow.com/a/4816990/2407212) ** avec seulement un tiers de voix autant que la réponse acceptée me semble très nettement meilleure. – Jonathan

Répondre

34

Vous pouvez le faire en une ligne avec var originalElement = e.srcElement || e.originalTarget; mais ce n'est pas assez JQuery comme ;-)

[Edit: Mais selon http://docs.jquery.com/Events/jQuery.Event#event.targetevent.target pourrait faire ...]

+8

N'est-ce pas le genre de chose que jQuery devrait faire abstraction? Je suis vraiment surpris de ça. – cletus

+0

Je me souviens d'avoir essayé e.target il y a un certain temps déjà. On dirait qu'ils ont été corrigés depuis (ou bien j'ai été corrigé depuis un moment). En outre, les astuces de terminaison de fantaisie me lisent comme deux lignes;) –

+0

Vous êtes un épargnant de vie de freaking! Merci Dieu pour ce one-lier ... –

22

Je crois e .target est ce que vous avez besoin

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

Si vous allez à la jQuery in Action website et télécharger le code source, jetez un oeil à

  • Chapitre 4- dom.2.propagation.html

qui traite de la propagation des événements avec des gestionnaires de bulles et de capture

19

L'utilisation event.originalTarget peut causer des « Autorisation refusée pour accéder la propriété XYZ d'un contexte non-chrome » -erreur, donc je vous recommande d'utiliser ce qui suit:

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

event.target fonctionne sur Firefox, Opera, Google Chrome et Safari.

+1

+1: C'est la seule version qui a fonctionné pour moi cross-browser. –

0

en Javascript normal, var t = (e.originalTarget)? E.originalTarget: e.srcElement; devrait suffire à le lire dans tous les navigateurs.

+0

C'est la même chose que 'var t = e.srcElement || e.originalTarget; '(seulement plus long!) –

2

En conjonction avec How to detect a click outside an element?, voici comment vous pourriez piéger un sous-widget avec une fonctionnalité similaire de cache-lorsque-cliqué-dehors pour empêcher votre propre pop-over de se cacher avec elle; dans ce cas, nous emprisonnent la fenêtre contextuelle sur Datepicker JQuery UI widget:

// 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); 
}); 
Questions connexes