2009-11-05 17 views
6

La seguente domanda è ispirata da this blog entry a ajaxian.com e this comment by paul irish.Perché l'espressione per live deve essere valutata in jQuery

Ecco un modo per dichiarare l'evento dal vivo.

$("li a").live(...) 

Come per this blog entry, è la mia comprensione che vivono gli eventi non sono altro che un fermo tutto a livello di documento. Qualsiasi evento che bolle fino alla cima viene catturato da eventi dal vivo e se il selettore corrisponde, la funzione viene invocata.

E 'la mia comprensione che il documento pronto se invoco

$("li a").live('click', ..) 

allora tutto jQuery dovrebbe fare è mettere il selettore letterale 'li a' in memoria da qualche parte. Ora, quando si verifica un clic e se quel clic bolle fino in cima allora live dovrebbe verificare qual è l'elemento di destinazione. Se l'elemento obiettivo soddisfa la regola di 'li a', la funzione dovrebbe essere attivata altrimenti ignorato questo evento ribollente.

Sulla base di tale presunzione sul documento pronto quando mi chiamo

$("li a").live('click', ..) 

quindi idealmente jQuery non dovrebbe effettivamente andare alla ricerca di tutte l'elemento Matching 'li a' perché jquery non fa nulla con quegli elementi. So per certo che gli elementi attualmente presenti nel documento corrispondente a 'li a' non sono associati a nessun gestore di eventi.

Se tutto jQuery ha a che fare è quello di mettere il letterale 'li a' al livello principale del documento allora perché andare alla ricerca di elementi che corrispondono ai criteri 'li a' sul documento pronto. Ma sulla base del link al commento che ho citato all'inizio, sembra che jQuery in realtà vada alla ricerca di elementi pronti per il documento.

La mia domanda è perché il metodo live dovrebbe trovare tutti i metodi "li a" quando non ha intenzione di fare nulla con loro. Immagino che la sintassi live dovrebbe essere stata qualcosa come

$.live('li a', 'click', function(){}) 

Mi manca qualcosa qui?

risposta

5

La mia comprensione del perché afferra tutti gli elementi del DOM è perché questo è ciò che la funzione $() lo fa, poi, dopo che ha selezionato gli elementi DOM esegue la funzione live().

In tal caso, è necessario utilizzare uno dei suggerimenti proposti altrove nelle risposte qui.

0

C'è un modo non documentato in questo momento, che avrebbe funzionato senza selezionare in precedenza gli elementi

jQuery.fn.selector="p"; 
jQuery.fn.live('click',function(){ 
    alert('clicked'); 
}); 

Questo consente di impostare il gestore vivere senza jQuery corrispondenza gli elementi che attualmente esistono nel DOM, che ignora comunque .

2

ho inciso questo problema eseguendo l'override find():

jQuery.fn.find = function(old) { 
    return function() { 
     var m = arguments[0].match(/^lazy:(.*)/); 
     if(m) { 
      this.selector = m[1]; 
      return this; 
     } 
     return old.apply(this, arguments); 
    } 
} (jQuery.fn.find); 

    // this will select elements... 
    $("input").live("click", function() { 

    // this won't 
    $("lazy:input").live("click", function() { 
2

live è solo un modo per delegare eventi a persone che non lo capiscono facilmente.

Hai un aspetto familiare e hai bisogno di prestazioni. Suggerirei di utilizzare effettivamente la delega degli eventi in modo esplicito anziché live.

$(document).bind('click', function(event) 
{ 
    var $target = $(event.target); 

    if($target.is('li a')) 
    { 
     // Do something with $target 
    } 
});