Veo que los controladores de eventos registrados a través de .on()
se encuentran en $.cache
. También veo que los controladores de eventos también se mantienen en $(elem).data()
.
Los objetos contenidos en $.cache
se refieren a los nodos DOM en los que se registran los eventos. Esto lleva a la pérdida de memoria cuando los nodos DOM están separados, y esto hace que las llamadas a .off()
sean obligatorias.
Tengo una situación en la que no sé cuándo se desconectará el nodo DOM (al que adjunté el controlador de eventos). Si bien puedo mantener la referencia a ese nodo DOM en mi código y llamar al .off()
para limpiar, no me parece agradable, porque no es sencillo saber cuándo se eliminará el nodo DOM.
¿Cuál es la mejor manera de hacerlo?
1. Si la relación entre el elemento y los controladores se mantiene a través de un número de serie (y si el manejador no se refiere al elemento), no veo una razón por la cual las entradas .cache deberían conducir a la memoria fuga. Por alguna razón, no sé qué tan justificable es, la entrada de la memoria caché se refiere al elemento. Tengo curiosidad por saber por qué se requiere la referencia al elemento. 2. No conozco los casos en que la expansión de un elemento no puede contener referencias a objetos (manejadores) directamente. Si expando puede contener referencias, no veo la necesidad de una estructura paralela como .cache para contener referencias. – user968903
@ user968903: 1. Solo provocan fugas si no utiliza los métodos de jQuery que eliminan la entrada relacionada '$ .cache' al eliminar el elemento. El número de serie es la única conexión entre los dos, por lo que si el elemento con el número '123' se elimina, pero jQuery no elimina la entrada' 123' en '$ .cache', entonces esa entrada ahora se refiere a los datos que ya no están disponibles. tiene un elemento correspondiente, y nunca será limpiado. La justificación eran posibles pérdidas de memoria que existen principalmente en IE6 y tal vez en IE7. Ahora que esos navegadores casi se han ido, no sé si este enfoque es bueno. –
@ user968903: 2. Creo que los navegadores modernos generalmente limpian los elementos cuando se eliminan, por lo que probablemente ya no sea un problema. Creo que fue principalmente IE6/7 que tenía problemas. Creo que todavía puede haber pérdidas potenciales de memoria con respecto a los cierres, donde un elemento tiene un controlador que tiene en su alcance variable una referencia circular a sí mismo, pero no estoy seguro si ese es un problema hoy o no. Veré lo que puedo encontrar. –