10

Al leer otra pregunta sobre el rendimiento de jQuery, comencé a pensar sobre el punto cuando valía la pena utilizar la delegación de eventos en lugar de vincularla a los elementos individualmente. Estaba pensando principalmente en jQuery, pero supongo que probablemente sea aplicable para Javascript en general.¿Cuántos elementos se necesitan para que la delegación de eventos valga la pena?

delegación de eventos tiene dos propósitos principales:

  1. permitiendo manipuladores para trabajar en los elementos que aún no han sido creados/insertados en el DOM.
  2. vinculante una función a un elemento ancestro común más que a varios elementos relacionados

Mi pregunta se refiere a la segunda de ellas. La respuesta general probablemente será "depende de la situación exacta", pero me pregunto si existe una regla empírica o una forma de evaluación comparativa para probar esto.

Entonces, la pregunta es: ¿Cuántos elementos necesita antes de que los beneficios de rendimiento de la delegación de eventos superen los costos de rendimiento?

+0

no lo hago conocer los costos de rendimiento de la delegación de eventos ... ¿Qué son? Los eventos aparecen de todos modos, y el objetivo del evento se almacena en la propiedad correspondiente del objeto de evento en todo momento. –

+1

@Sime El principal en el que había pensado era que cada vez que se dispara un evento, el selector en la llamada delegada debe ejecutarse para verificar si coincide con el objetivo del evento. Puede haber otros ... – lonesomeday

+2

Tenga en cuenta que cuando usa la delegación, distribuye eficazmente el costo de vincular controladores a lo largo de la vida de la página. Cuando se vincula mediante la búsqueda de elementos primero, se agrega más trabajo al momento de cargar la página, cuando los usuarios son más sensibles a las demoras. – Pointy

Respuesta

3

Suponiendo que esta estructura HTML:

<ul id="navUL"> 
    <li><a href="one.html">One</a></li> 
    <li><a href="two.html">Two</a></li> 
    <li><a href="three.html">Three</a></li> 
</ul> 

Sólo para aclarar las cosas (para mí) .... De acuerdo con documentos de jQuery (http://api.jquery.com/delegate/), esto:

$("#navUL").delegate("a", "click", function(){ 
    // anchor clicked 
}); 

... es equivalente a esto:

$("#navUL").each(function(){ 
    $("a", this).live("click", function(){ 
     // anchor clicked 
    }); 
}); 

Sin embargo, la delegación de eventos (como la conozco) es la siguiente:

$("#navUL").click(function(e) { 
    if (e.target.nodeName !== "A") { return false; } 
    // anchor clicked 
    // anchor is referenced by e.target 
}); 

Así que coger el evento click en el elemento UL, y luego averiguar cuál es el ancla en realidad se ha hecho clic a través de la propiedad event.target.

no sé sobre el método delegado(), pero esta última técnica siempre debe ser más rápido que la fijación controladores de eventos para cada anclaje en el elemento #navUL, así:

$("#navUL a").click(function() { 
    // anchor clicked 
    // anchor is referenced by the this value 
}); 
+0

¿No necesita un 'e.stopPropagation();' en su delegación como lo conoce, por ejemplo? –

+0

Hm, ¿por qué? El usuario hace clic en algún lugar dentro del elemento #navUL. El evento click se propaga al elemento #navUL (ya que no hay manejadores de clic conectados a los elementos A o LI). Dentro del controlador de clics #navUL, compruebo si se hizo clic en un delimitador. Si no, solo mato el evento (a través de return false;). Si es así, hago lo que pretendía (con el ancla). Es posible que desee evitar el comportamiento predeterminado del delimitador, pero no veo por qué querría evitar que el evento de clic burbujee el árbol DOM (de todos modos, no tengo controladores de clic establecidos en elementos ancestrales). –

+0

Sí, tienes razón. –

Cuestiones relacionadas