2011-08-22 4 views
6

Ho una domanda sull'efficienza del filtro jQuery. Ho appena scritto un bel lungo espressione e mi chiedevo se jQuery ferma il filtraggio se l'attuale numero di partite è 0.jQuery continua a filtrare se trova 0 corrispondenze?

passengers.filter('input.FromDate[value="01/09/2011"]') 
      .closest('tr') 
      .filter('input.ToDate[value="08/09/2011"]') 
      .length; 

Se dopo la prima filter() possibile chiamare il numero di partite è 0 sarà jQuery continuare a cercare il DOM o rinuncerà alle chiamate aggiuntive e restituirà 0?

risposta

1

La cosa bella delle chiamate concatenabili con jQuery è che quando non ci sono corrispondenze, non accadrà nulla di male.

Quando si chiama .filter e zero partite sono stati ceduto, si sono esecuzione delle chiamate di metodo in seguito incatenati, per definizione, perché vengono richiamati direttamente sul oggetto restituito (che è quello che è il concatenamento).

Quando non ci sono corrispondenze, JavaScript invocherà ancora ogni metodo successivamente concatenato su ciascun oggetto restituito. La quantità di elaborazione sprecata dipende da come è stato implementato il metodo specifico.

$.fn.doesItTryToDoStuff = function() { 
    alert('called'); 

    // here I could have some wasteful process 
    // which could foolishly be executed 
    // even when there are no elements 


    return this.each(function() { 
     $(this).css("border", "1px solid red"); 
    }); 
}; 

$("input").filter("[value='foo']").doesItTryToDoStuff().doesItTryToDoStuff(); 

Demo.

mi aspetterei che la maggior parte i metodi di jQuery sono codificate in modo tale che nulla drastica avviene prima la lunghezza della collezione è stato testato, ma non si sa mai.

+0

Contrassegnare questo come la risposta accettata in quanto riguarda l'efficienza che è in realtà la mia domanda. – weenoid

3

Il filtro su qualcosa che non esiste restituirà un set vuoto spostato. I filtri successivi verranno chiamati ma non avranno alcun effetto.

$('div').filter('.isnt-here').end().filter('.spacer').length; 

L'esecuzione di questo nella pagina domanda restituisce 25.

+0

Quindi sarebbe più efficiente lasciare l'espressione così com'è o separare le chiamate filter() e controllare la lunghezza dopo ogni chiamata? – weenoid

+0

'filter' usa internamente' grep'. Puoi guardare la fonte qui, ['filter'] (http://james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.fn.filter) e [' grep'] (http: // james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.grep). Non sarò troppo preoccupato di avere un paio di filtri extra a meno che non l'abbia identificato come collo di bottiglia nella mia applicazione. –

0

Il filtro in jQuery restituirà un oggetto jQuery con l'elenco DOM di elementi corrispondenti, il filtro successivo verrà chiamato su quegli elementi DOM e così via.

Se non ci sono corrispondenze, il filtraggio in jQuery restituirà un oggetto jQuery con elenco DOM vuoto e chiamerà il filtro successivo per la lista vuota, quindi non restituirà alcuna corrispondenza.

È come restringere la portata del filtro.

Problemi correlati