2010-02-23 13 views
6

C'è un modo per lasciare che l'elemento interno di un compia qualcosa?jQuery come eseguire l'evento solo sull'elemento interno

Ho elementi di elenco che possono contenere tag a con una determinata classe.

I tag interni a sono associati a un gestore eventi in tempo reale. Gli elementi della lista hanno anche un gestore di eventi click.

Qualcosa di simile

<li>some text<a class="someClassName">some text</a></li> 

con il gestore per i a tag

$('#somelist li a').live("click", function(e) 

e questo è come viene aggiunto l'evento per la voce li

$(markers).each(function(i,marker){ 
    $("<li />") 
    .html("Locatie "+'<a class="ol id"><strong>'+ids[i]+'</strong></a>') 
    .click(function(e){ 
      showLocation(marker, i); 
    }) 
    .appendTo("#somelist "); 
+0

La prego di inviare più di codice? Cosa viene aggiunto dinamicamente? Sia il 'a' che il' li'? Proprio il 'a'? Il clic per 'li' si usa' bind() 'e' a' sta usando 'live()'? – user113716

+0

Gli elementi li vengono aggiunti dinamicamente all'inizio C'è un extra un tag aggiunto agli elementi della lista in una fase successiva quando si fa clic su una casella di controllo. Controllo con hasClass su cui si fa clic su uno. Suppongo di avere un legame e un evento dal vivo quindi – Richard

+0

ok, stai dicendo, dovrei usare dal vivo in modo coerente. Posso provarlo definitivamente e provare anche la soluzione di @Alex. Posso tornare più tardi per verificare se uno o l'altro o entrambi hanno funzionato. Grazie ad entrambi per il prezioso input sofar. – Richard

risposta

9

Il metodo live in jQuery funziona tramite la delega degli eventi, che è l'atto di catturare tutti gli eventi bubbled dai singoli elementi su un antenato comune (nel caso specifico è document).

L'interruzione della propagazione/bubbling dell'evento click si verifica sull'elemento gestore (che è l'antenato comune, non sull'elemento stesso) ed esiste molto al di sopra dello li che si sta tentando di evitare.

Quindi, quando viene chiamato il metodo stopPropagation, abbiamo già attraversato il dominio e superato l'elemento li.

Si tratta essenzialmente di mettere un segnale di stop 200ft dopo l'intersezione.

Quindi è necessario utilizzare bind e stopPropagation o trovare una soluzione diversa.

Ecco un esempio di cosa sto parlando: http://jsbin.com/ibuxo (controllare la console)

si può vedere il codice o modificarlo in http://jsbin.com/ibuxo/edit

La mia proposta di soluzione a questo problema potrebbe essere quella di utilizzare bind anziché live.

Questo richiede di fare un po 'di lavoro in più, ma non è così male.

Probabilmente stai usando live perché stai aggiungendo nuovi elementi e vuoi che abbiano la stessa funzionalità. Dovresti farlo legandoli quando li inserisci nella pagina. Ecco un esempio

$(function(){ 
    var myAnchorHandler = function(e){ 
    alert('clicked!'); 
    e.stopPropagation(); 
    return false; 
    }; 

    // initial bind 
    $('#somelist li a').click(myAnchorHandler); 

    // code where you input more li elements to the list with links 
    $('#somelist').append(
    // bind your function to the element now, and then append it 
    $('<li><a>hi</a></li>').find('a').click(myAnchorHandler).parent() 
); 
}); 
+0

buona spiegazione, anche se non capisco completamente la termonologia. Qualche idea su soluzioni diverse, forse, al momento sono fuori idee. – Richard

+0

grazie per l'ultimo aggiornamento, lo verificherò – Richard

+1

Posso andare più nel dettaglio su di esso se lo desideri, ma più o meno, se vuoi essere in grado di bloccare qualcosa che accada sul 'li' o è necessario utilizzare 'bind' per gestire i clic, o è necessario modificare qualsiasi gestore attualmente sul' li' per ignorare tutto ciò che ha avuto origine in un elemento di ancoraggio figlio. –

-1

Avere il gestore per i tag <a> restituiscono false.

0

Soluzione da Autore:

ho aggiunto tutti i tag a come sopra, in modo che nessun disguido con vivo più.

$(markers).each(function(i,marker){ 
    listitem = $("<li />") 
    .html("Location ") 
    .click(function(e){ 
     showLocation(marker, i); 
    }) 
    .appendTo("#somelist"); 
    $("<a />") 
    .html("<strong>"+ids[i]+"</strong>") 
    .addClass('ol id') 
    .click(function(){ 
     $('#ginfo').show(); 
     return false; 
    }) 
    .appendTo(listitem); 

Ecco una pagina interessante per spiegare spumeggiante evento: How to stop event bubbling with jquery live?

Problemi correlati