Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重写DOM事件处理程序的正确方法是什么?_Javascript_Dom Events - Fatal编程技术网

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%肯定,伙计:)如果我的回答对你有所帮助的话。请投票并接受其他开发者可以从中受益的答案:)谢谢你的帮助,但我仍然不太清楚。旧处理程序不再被引用,因此应该对其进行垃圾收集。不,是的!但我们自己并不控制垃圾收集。这是一个自动过程。事实上,这就是内存泄漏。垃圾收集可能立即发生,也可能不会立即发生。:)当不再需要内存时释放:大多数内存管理问题都发生在这个阶段。此阶段最困难的方面是确定何时不再需要分配的内存。