Javascript 重写DOM事件处理程序的正确方法是什么?
如果我创建了一个按钮并附加了一个单击处理程序:Javascript 重写DOM事件处理程序的正确方法是什么?,javascript,dom-events,Javascript,Dom Events,如果我创建了一个按钮并附加了一个单击处理程序: let btn = document.createElement("button"); btn.innerHTML = "Do Something"; btn.onclick = () => { doSomething(); }; document.body.appendChild(btn); 稍后我想为其他事情重复使用按钮,这是重写事件处理程序的安全方法吗 btn.innerHTML = "
let btn = document.createElement("button");
btn.innerHTML = "Do Something";
btn.onclick = () => { doSomething(); };
document.body.appendChild(btn);
稍后我想为其他事情重复使用按钮,这是重写事件处理程序的安全方法吗
btn.innerHTML = "Do Something Else";
btn.onclick = () => { doSomethingElse(); }
我看到一些示例设置
btn.onclick=null在附加新处理程序之前执行代码>。还有一些示例使用了addEventListener()
/removeEventListener()
。这些方法之间有区别吗?我可以用这些方法中的任何一个引入内存泄漏吗?为了允许为给定对象上的同一事件安装多个处理程序,您可以调用其addEventListener()
方法,该方法管理对象上给定事件的处理程序列表。然后,可以通过调用对象的removeEventListener()
函数从对象中删除处理程序
删除以前的事件处理程序后,可以再次将新的事件处理程序
附加到同一元素。这样就不会有任何内存泄漏
代码演示:
let btn = document.createElement("button");
btn.innerHTML = "Do Something";
element.addEventListener("click", doSomething, true)
document.body.appendChild(btn);
...
btn.removeEventListener("click", doSomething, true);
//第三个参数必须与前面的情况相同。在这种情况下是正确的
btn.addEventListener("click",doSomethingThingElse};
如果您重写侦听器回调,应该没问题,可能他们会将其设置为null,或者删除它以禁用与buttonThank您关联的事件!btn.onclick=…
会导致内存泄漏吗?我个人认为,它会导致内存泄漏。因为我们的处理程序仍然在那里,只是引用被设置为null。但我不是100%肯定,伙计:)如果我的回答对你有所帮助的话。请投票并接受其他开发者可以从中受益的答案:)谢谢你的帮助,但我仍然不太清楚。旧处理程序不再被引用,因此应该对其进行垃圾收集。不,是的!但我们自己并不控制垃圾收集。这是一个自动过程。事实上,这就是内存泄漏。垃圾收集可能立即发生,也可能不会立即发生。:)当不再需要内存时释放:大多数内存管理问题都发生在这个阶段。此阶段最困难的方面是确定何时不再需要分配的内存。