These lines似乎会导致内存泄漏,因为窗口会获取对从未发布过的affix实例的引用。
作为一种解决方法,我正在使用此代码在从DOM中删除附加元素时释放引用:
$(window)
.off('scroll.bs.affix.data-api')
.off('click.bs.affix.data-api');
看起来有点hacky-有更好的方法吗?在affix plugin docs中没有看到任何内容。
答案 0 :(得分:1)
默认情况下,引导程序Affix使用scroll
,click
和$(window)
命名空间侦听.bs
上的.affix
和.data-api
个事件。
$.off('.affix');
将删除.affix
命名空间中的所有侦听器。
$(window).off('.affix');
将从window元素中删除.affix
命名空间中的所有侦听器。如果您只有一个词缀,并且正在将其粘贴到窗口,则它与$.off('.affix');
具有完全相同的效果
添加其他命名空间使其更具体,但除非您在自己的代码中使用.affix
命名空间,否则添加的特异性不会改变任何内容。如果您使用任何其他引导程序元素,则不希望独立于.affix
删除其他名称空间。
$('.affix').off('.affix');
将不工作,因为侦听器不在Affixed元素上,而是在目标上,该元素是到,即窗口。< / p>
pstenstrm 是正确的,无法检测到从DOM中删除了元素,或者为此注入了元素。因此,如果代码稍后重新注入元素,并且您希望再次表现为Affix,则需要使用引导程序JS api再次调用Affix。
答案 1 :(得分:1)
我接受了@Carrie Kendall的推荐,并开了一个错误报告......很好地评论了相关的错误报告。
https://github.com/twbs/bootstrap/issues/13655
在这种情况下我们需要的是一个关于affix插件的“destroy”方法和getbootstrap网站上的一些文档,以便在单页应用程序中使用affix插件的人可以在删除附加内容时避免内存泄漏陷阱。 / p>
答案 2 :(得分:0)
无法检测何时从DOM中删除元素。 affix插件无法自动删除侦听器。你这样做是正确的方式。
虽然通过调用$(window).off()
可以删除所有听众,即使是那些你想要保留的人。只在您要删除的元素上调用$.off()
会更安全。
$('.affix').off('.affix');
事件名称后面的.bs
,.affix
和.data-api
是名称空间。通过调用$.off('.affix')
,您可以删除在该命名空间中声明的每个事件。做你正在做的事情可能是唯一更好的。