2010-02-06 5 views
0

iam liens ayant comme indiqué ci-dessousgestion des événements bubling dans jquery

<a item='1' href='javascript:void(0)'><img class='icon1' /><span>text1</span></a> 
<a item='1' href='javascript:void(0)'><img class='icon2' /><span>text2</span></a> 
<a item='1' href='javascript:void(0)'><img class='icon3' /><span>text3</span></a> 
<a item='1' href='javascript:void(0)'><img class='icon4' /><span>text4</span></a> 


$(function(){ 
$('a').click(_handleClick); 
}); 

function _handleClick(e) 
{ 
var _item=$(e.target).attr('item'); 
// do something with _item variable 
} 

// maintenant mon problème est lorsque l'utilisateur clique sur l'image « e » reçu dans _handleClick est l'image donc je ne peux pas lire l'article 'attr = 'alors comment bulle l'événement pour lire cette valeur.

Répondre

2

Vous ne devriez pas du tout avoir besoin de manipuler le bouillonnement d'événements puisque l'élément 'a' auquel est attaché le gestionnaire d'événements stocke également l'attribut 'item'. Dans ce cas, vous utilisez simplement 'this' pour faire référence à l'élément avec l'événement click, et $ (this) .attr ('item') récupérera la valeur de 'item'.

Cette ligne:

var _item=$(e.target).attr('item'); 

devrait être:

var _item=$(this).attr('item'); 

EDIT: Clarification de la première phrase, et a ajouté les informations suivantes:

Pour clarifier les choses, bouillonnement d'événement est automatique en jQuery. Si vous cliquez sur l'enfant d'un élément, l'événement se propage jusqu'au sommet et déclenche les événements au fur et à mesure.

Il est parfois nécessaire d'arrêter la mise à feu avec event.stopPropagation().

D'autres fois, il est pratique. Par exemple, considérons un 'div' qui a 100 enfants, qui devraient tous recevoir le même événement click. Au lieu de consommer toute la ressource dont il a besoin pour gérer les gestionnaires d'événements pour ces 100 enfants, vous pouvez attribuer un événement 1 click au parent, puis utiliser event.target pour déterminer lequel a été cliqué.

Une autre bonne chose à propos de cette approche, c'est que vous n'avez pas besoin d'utiliser live() lorsque vous ajoutez dynamiquement des enfants supplémentaires à ce parent. Comme ils déclenchent tous le cliquetis du parent à cause du bouillonnement, ils sont prêts à partir.

+0

Mais il y a deux éléments à l'intérieur de la balise d'ancrage, et ceux qui sont susceptibles d'être les véritables bénéficiaires de l'événement. L'autre réponse donnée à la recherche de l'ancre parentale est plus proche, bien qu'il ne soit pas impossible pour un clic de "pointer" vers l'ancre. – Pointy

+1

@Pointy - L'événement est attaché à l'élément 'a'. Quelle que soit la cible réelle, le gestionnaire d'événements est appelé sur le «a». C'est l'événement bouillonnant qui cause cela. La première phrase de ma réponse est un peu décevante, alors je vais la modifier. – user113716

+0

ah ok duhh; merci pour la clarification – Pointy

1

Essayez plutôt de faire la cible de cliquer directement:

$(function(){ 
    $('a').click(function() { 
    var _item = $(this).attr('item'); 
    // do something with _item variable   
    }); 
}); 

Bien que l'événement click est tiré sur tous les éléments parents, le e.target est toujours la source du clic, le plus profond enfant d'origine que vous avez cliqué. ..jQuery avec le $(this) gère cela, pas besoin de s'inquiéter quel élément enfant ci-dessous l'a déclenché.

0

var _item=$(e.target).parents('a').attr('item');

+0

Ceci est une meilleure réponse, bien qu'il ne soit pas impossible que l'événement soit directement déclenché sur l'étiquette d'ancrage. Je pense qu'il serait préférable de vérifier si l'élément cible est l'ancre, et sinon, utilisez "parents ('a')" pour le trouver. – Pointy

+0

Inutile de réfléchir sur les parents de la cible, car l'événement apparaîtra automatiquement dans le même élément que l'attribut 'item'. – user113716