我想知道,如果我添加事件侦听器的按钮,我不得不删除它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);
}
});...
提前致谢。
你需要担心的是,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);