避免内存泄漏winjs事件侦听器(Avoiding memory leaks winjs Event

2019-08-03 03:25发布

我想知道,如果我添加事件侦听器的按钮,我不得不删除它unload ? 会按“返回”按钮自动删除中,我不需要担心内存泄漏电流的一切网页元素?

(function () {
"use strict";
ui.Pages.define("/pages/registraton/registraton.html",{
    ready: function (element, options) {
        document.getElementById("submitRegister").addEventListener(
            "click", postRegistration , false);

    },
    unload: function () {
        document.getElementById("submitRegister").removeEventListener(
       "click", postRegistration, false);
    }
});...

提前致谢。

Answer 1:

你需要担心的是,WinJS.Navigation命名空间促进了单页面导航模型内存泄漏。

您所设置的模式 - 在你所实现的卸载 - 绝对是正确的做法。 如何复杂和深刻的,你想依赖于应用程序的复杂性。 特别是,如果你有多个控件,具有多种手动事件处理程序,你可能希望创建一组助手,使您能够清理这些处理器一举。 这可能是由于压部件,事件名称,以及处理程序实例到一个数组中离开该页面时,当和销毁/从DOM移除它一样简单,你可以通过阵列消除了需要清理的物品燃烧。

请注意,您只需要需要明确清理在处理程序和DOM对象有不同的生活时间的情况。 如果他们走在一起-例如,附着在页面的DOM元素的控制,那么你就不必明确地清理一切。 垃圾收集器将最终清理。 如果你是一个特别的记忆重应用程序,您可以通过更积极地去除听众在这里得到一些胜利。

还有一些其他的事情要记住:

  • 这也适用于执行的addEventListener合同即列表视图纯JavaScript对象
  • 不要使用的attachEvent - 这将导致牢不可破的周期,由于它的旧的实现在幕后。 它实际上是一个过时的API,所以不应该使用反正
  • 警惕当你提供事件处理程序,你已经绑定的这个指针,当你试图拆散他们。 例如

例:

var element = getInterestingElement();
element.addEventListener("click", this.handleClick.bind(this));

如果您尝试分离的情况下,你就输了 - 返回valud从.bind()在风中丢失了,你就永远无法脱钩吧:

var element = getInterestingElement();
element.removeEventListener("click", this.handleClick); // Won't remove the listener
element.removeEventListener("click", this.handleClick.bind(this)); // Won't remove, since it's a different function object

这里最好的解决方案是猴补丁handleClick附接收到:this.handleClick = this.handleClick.bind(本);

或将其存放起来以备将来使用:

this.handlerClickToCleanup = this.handleClick.bind(this);
element.addEventListener("click", this.handleClickToCleanup);


文章来源: Avoiding memory leaks winjs EventListeners