2009-05-28 11 views
8

Ho un pezzo di HTML:Span all'interno Ancora con bubbling degli eventi

<li class="addToFriends"><a href="....">Something something<span>INSIDE SPAN</span>something</a></li> 

Per gestire la richiesta AJAX quando si clicca su di ancoraggio gestore su eventi click Mi sono registrato:

$('.addToFriends a').click(function(event){ 
    var target = $(event.target); 
    if (target.is('a')) { 
       // if I click on SPAN element following fragment won't execute! 


     // do ajax request 
    }  
    event.preventDefault(); 
}); 

Le mie domande sono :

  • perché l'evento click viene generato per l'elemento span? Dopotutto, non ho associato l'evento click agli elementi SPAN
  • a parte la domanda precedente, ho pensato che se non avessi gestito l'evento click SPAN, il browser userà l'evento-bubbling per aumentare l'evento click per l'ancora (se ho vinto chiamare event.stopPropagation()). Ma ho anche non ha funzionato per me come l'evento click viene generato solo una volta

Così ora, ho ottenuto rotonda che problema che ho la mia soluzione è:

$('.addToFriends a').click(function(event){ 
    var target = $(event.target); 
    if (!target.is('a')) { 
     target = target.parent('a') 
    } 
      ... 
}); 

Ma ancora, io sono curioso di sapere perchè funziona così ...

Grazie,

Paweł

+0

Grazie mille per l'aiuto. Dopo aver studiato gli articoli citati, tutto è cristallino. E invece di fare riferimento a ** e.target ** (che può cambiare) mi riferisco a ** this ** (che è sempre ancora). – dragonfly

+0

Grazie, esaminerò più approfonditamente le specifiche e l'articolo. Ad ogni modo, potresti rispondere a questa domanda:> perché l'evento click viene generato per l'elemento spaziatura > elemento? Dopotutto, non legavo lo > evento click sugli elementi SPAN perché, principalmente, questo è un problema per me. – dragonfly

risposta

11

è necessario utilizzare il currentTarget del vostro evento.

$('.addToFriends a').click(function(event){ 
    event.currentTarget;  
    ... 
}); 
+0

Se avessi letto più attentamente quella risposta avrei notato che hai suggerito di usare currentTarget invece di target. Questa era la soluzione in sé. Come clusmy di me :) – dragonfly

1

Ok, ma se clicco su SPAN e chiamo stopPropagation() Metodo mio codice in quella forma non funziona:

$('.addToFriends a').click(function(event){ 
    var target = $(event.target); 
    if (target.is('a')) { 
     // do ajax request 
     event.stopPropagation();    
     event.preventDefault(); 
    } 

});

Tuttavia, mi mancano alcuni punti cruciali relativi al bubbling degli eventi.

1

È sempre possibile leggere specification. È disponibile anche un buon tutorial here.

StopPropagation ha significato solo se sono stati definiti gestori di eventi di clic sia per gli elementi SPAN che per quelli A. Chiamando stopPropagation nel gestore eventi SPAN si impedirà il richiamo del gestore A. Questo presuppone la fase di bolla predefinita.

Problemi correlati