2011-08-22 19 views
6

Tengo una pregunta sobre la eficiencia del filtrado jQuery. Acabo de escribir bastante larga expresión y me preguntaba si se detiene el filtrado jQuery si el número actual de partidos es 0.¿jQuery continúa filtrando si encuentra 0 coincidencias?

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

Si después de la primera llamada filter() el número de coincidencias es 0 se jQuery continuar la búsqueda el DOM o ¿renunciará a las llamadas adicionales y simplemente devuelve 0?

Respuesta

1

Lo bueno de las llamadas encadenadas con jQuery es que cuando no hay coincidencias, no pasa nada malo.

Cuando se llama a .filter y cero partidos se han producido, que son la ejecución de las llamadas a métodos posteriormente encadenados por definición, ya que se invocan directamente sobre el objeto devuelto (eso es lo que es el encadenamiento).

Cuando no hay coincidencias, JavaScript invocará cada método posteriormente encadenado en cada objeto devuelto. La cantidad de procesamiento desperdiciado depende de cómo se haya implementado el método específico.

$.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.

yo esperaría que la mayoría de los métodos de jQuery se codifican de tal manera que nada drástico ocurre antes de que la longitud de la colección ha sido probado, pero nunca se sabe.

+0

Marcando esto como la respuesta aceptada, ya que aborda la eficiencia, que es de lo que realmente se trataba mi pregunta. – weenoid

3

Al filtrar en algo que no existe va a devolver un conjunto vacío envuelto. Se llamarán los filtros posteriores, pero no tendrán ningún efecto.

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

Ejecutando esto en la página de preguntas, devuelve 25.

+0

¿Sería más eficiente dejar la expresión tal como está o separar las llamadas de filtro() y verificar la longitud después de cada llamada? – weenoid

+0

'filter' usa' grep' internamente. Puede ver la fuente aquí, ['filter'] (http://james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.fn.filter) y [' grep'] (http: // james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.grep). No estaré demasiado preocupado por tener un par de filtros adicionales a menos que lo haya identificado como un cuello de botella en mi aplicación. –

0

El filtrado en jQuery devolverá un objeto jQuery con la lista DOM de elementos coincidentes, se invocará el filtro posterior en esos elementos DOM, y así sucesivamente.

Si no hay coincidencias, filtrar en jQuery devolverá un objeto jQuery con la lista DOM vacía y llamará al filtro subsiguiente para la lista vacía, por lo que no devolverá ninguna coincidencia.

Es como reducir el alcance del filtro.

Cuestiones relacionadas