javascript - section - js scroll trigger bootstrap 4
bootstrap affix plugin fuga de memoria (3)
Estas líneas en el complemento del afijo bootstrap parecen causar una pérdida de memoria porque la ventana obtiene una referencia a la instancia del afijo que nunca se lanzó.
Como solución alternativa, estoy utilizando este código para liberar las referencias al eliminar el elemento adjunto del DOM:
$(window)
.off(''scroll.bs.affix.data-api'')
.off(''click.bs.affix.data-api'');
Parece una especie de hacky, ¿hay una mejor manera de hacer esto? No vimos nada en los documentos adjuntos del afijo .
De forma predeterminada, el programa de inicio bootstrap escucha los eventos de scroll
y click
en $(window)
utilizando los .bs
.affix
.bs
, .affix
y .data-api
.
$.off(''.affix'');
eliminará todos los escuchas en el espacio de nombres .affix
. $(window).off(''.affix'');
eliminará todos los escuchas en el espacio de nombres .affix
del elemento de la ventana. Si solo tiene un Afijo y lo está colocando en la ventana, tiene el mismo efecto que $.off(''.affix'');
Agregar los otros espacios de nombres lo hace más específico, pero a menos que esté usando el espacio de nombres .affix
en su propio código, la especificidad agregada no cambia nada. No desea eliminar los otros espacios de nombres independientemente de .affix
si está usando cualquier otro elemento bootstrap.
$(''.affix'').off(''.affix'');
no funcionará porque los oyentes no están en el elemento Adjuntado, pero en el destino al que está adherido, es decir, la ventana.
pstenstrm tiene razón en que no hay manera de detectar que un elemento se elimina del DOM, o se inyecta para esa materia. Por lo tanto, si el código vuelve a inyectar el elemento más adelante y desea comportarse como un Afijo nuevamente, deberá usar la API JS bootstrap para llamar al Afijo nuevamente.
No hay forma de detectar cuándo se elimina un elemento del DOM. El complemento de afijos no puede eliminar automáticamente a los oyentes. La forma en que lo haces es la manera correcta.
Aunque al llamar a $(window).off()
elimina a todos los oyentes, incluso a aquellos que quiera conservar. Sería más seguro llamar solo $.off()
en el elemento que está eliminando.
$(''.affix'').off(''.affix'');
Los .bs
, .affix
y .data-api
después del nombre del evento son espacios de nombres. Al llamar a $.off(''.affix'')
, elimina todos los eventos declarados en ese espacio de nombres. Que es probablemente el único mejor de hacer lo que estás haciendo.
Tomé la recomendación de @Carrie Kendall y abrí un informe de error ... comenté bien en un informe de error relacionado.
https://github.com/twbs/bootstrap/issues/13655
Lo que necesitamos en este caso es un método de "destruir" para el complemento de afijos y algo de documentación en el sitio getbootstrap para que las personas que utilicen el complemento de afijos en aplicaciones de una sola página puedan evitar el problema de la pérdida de memoria cuando eliminen su contenido.