bootstrap affix插件内存泄漏

时间:2014-02-11 21:32:36

标签: javascript twitter-bootstrap memory-leaks bootstrap-affix

bootstrap affix插件中的

These lines似乎会导致内存泄漏,因为窗口会获取对从未发布过的affix实例的引用。

作为一种解决方法,我正在使用此代码在从DOM中删除附加元素时释放引用:

$(window)
    .off('scroll.bs.affix.data-api')
    .off('click.bs.affix.data-api');

看起来有点hacky-有更好的方法吗?在affix plugin docs中没有看到任何内容。

3 个答案:

答案 0 :(得分:1)

默认情况下,引导程序Affix使用scrollclick$(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'),您可以删除在该命名空间中声明的每个事件。做你正在做的事情可能是唯一更好的。