- 如果您右键单击文档,它会告诉您它正在侦听。
- 如果您单击m1,它将替换文档元素,但右键单击文档仍会通知您它正在侦听。 您必须在顶部附近右键单击,因为文档没有内容。
- 如果您单击m2,它将覆盖文档内容,并在顶部附近右键单击不再起作用。 在开发工具中检查文档可以验证事件处理程序已经消失。
- 按下一个按钮后,必须再次运行代码片段以尝试下一个,因为此演示是破坏性的。
有没有一种不使用document.write()
函数的方法,在销毁文档并用新文档替换时,以使事件处理程序被销毁?
document.write()
易出错,其使用方式"强烈不建议",但我仍希望能够销毁文档及其事件监听器。
document.addEventListener('contextmenu', function (e) {
alert('still listening');
e.preventDefault();
})
function m1() {
var doc = document.implementation.createHTMLDocument();
document.replaceChild(
document.importNode(doc.documentElement, true),
document.documentElement
);
}
function m2() {
document.close();
document.write('<html></html>');
}
<button onclick="m1()">m1</button>
<button onclick="m2()">m2</button>
document.write
和document.close
。补充说明:
这个问题严格来说是为了更好地理解语言和实现它们的引擎的限制。请不要试图读出其他意思或解决其他目标。这只是一个关于是否可能的问题。
我不需要知道如何删除事件侦听器或管理事件侦听器,也不需要知道如何删除文档的所有子元素。我想知道是否可能销毁文档元素本身,不留下任何
<html>
标记,并且不会留下任何事件侦听器。使用document.write()
可以实现这一点,但我只是想知道是否有其他方式可以实现这个确切的目标,而不是其他假定的目标。
window.reload()
会销毁文档。 - Taplardocument.write
通常不建议使用,因为对于新手来说很容易陷入困惑的陷阱。但是,只要你有足够的知识和小心谨慎,它也有其适用情况 - 这可能就是其中之一。 - CertainPerformancewindow
。 - CertainPerformancedocument.addEventListener
的调用,否则您无法删除事件侦听器。document.open()
立即跟随document.close()
将会移除所有文档事件侦听器,但是不会取消挂起的 promises,setInterval
或setTimeout
;但是,您可以使用从0
到setInterval(undefined)
的clearInterval
取消间隔。如果需要,我可以制作演示文稿。 - concision