Javascript document.open删除所有窗口侦听器

Javascript document.open删除所有窗口侦听器,javascript,dom,google-chrome-extension,dom-events,Javascript,Dom,Google Chrome Extension,Dom Events,我正在写一个Chrome扩展。它用于记录用户在浏览网页时的行为。它通过使用Chrome内容脚本将事件监听器添加到客户的网页来实现这一点 内容脚本中的代码如下所示: var recordingEvents = ['click', 'input', 'change']; recordingEvents.forEach(function (e) { window.addEventListener(e, handler, true); }); 自定义页面示例: <script> f

我正在写一个Chrome扩展。它用于记录用户在浏览网页时的行为。它通过使用Chrome
内容脚本将事件监听器添加到客户的网页来实现这一点

内容脚本中的代码如下所示:

var recordingEvents = ['click', 'input', 'change'];
recordingEvents.forEach(function (e) {
    window.addEventListener(e, handler, true);
});
自定义页面示例:

<script>
function reload() {
    var ifrw = document.getElementById("iframeResult").contentWindow;
    ifrw.document.open();
    ifrw.document.write("<div>abc</div>");  
    ifrw.document.close();
}
</script>
<body>
<input type="submit" onclick="reload();" value="Reload" />
<iframe id="iframeResult"></iframe>
</body>

函数重载(){
var ifrw=document.getElementById(“iframeResult”).contentWindow;
ifrw.document.open();
ifrw.文件编写(“abc”);
ifrw.document.close();
}
它使用
document.open
document.write
重写iframe的内容

问题是。我的事件侦听器附加到
窗口
对象。和
document.open
删除其所有事件侦听器。如下图所示


是否有办法避免
文档。打开
删除事件侦听器?或者观察
文档。打开
,这样我就可以在它之后手动重新添加侦听器了?

我发现这个问题试图解决完全相同的问题

下面是一个说明,说明在
文档上。打开
当前文档将被销毁并替换为新文档。我有一个希望,一些事件的像“负载”仍然保留,没有运气。
这是我的检测代码:

const testEventName = 'TestEvent';
let tm;

function onTestEvent() {
    clearTimeout(tm);
}

function listenToTestEvent() {
    document.addEventListener(testEventName, onTestEvent);
}

listenToTestEvent();

function onLostEvents() {
    console.log('events are lost');
    listenToTestEvent();
    // DO THING HERE
}


function checkIfEventsAreLost() {
    document.dispatchEvent(new CustomEvent(testEventName));
    tm = setTimeout(onLostEvents);
}

new MutationObserver(checkIfEventsAreLost).observe(document, { childList: true });
当重新创建文档时,它的
childList
被更改(新建
documentElement
节点),这是我想到的检测文档替换的最佳触发器


请注意,即使是侦听器在设置超时(…,0)之前也会触发

这是对其工作原理的详细解释。我正在做一个新的回答,因为它不适合评论

TestEvent
事件是一个特殊事件,用于监视文档中以前设置的事件何时被删除

特别是,这说明了
document.open
的情况,它不仅从文档中,而且从窗口中删除所有侦听器

一般的想法是为名为
TestEvent
的自定义事件设置侦听器,该事件清除超时。只有当文档发生变异并由变异观察者触发时,才会设置此超时


由于超时计划操作至少在事件循环的下一个滴答声期间发生,因此可以在此之前清除此类超时,从而避免同时执行其回调。而且,由于
TestEvent
事件处理程序清除了该超时,因此清除该超时意味着侦听器仍然连接。另一方面,如果在下一次勾选之前没有清除超时,则表示事件已被删除,需要新的“设置”。

不要调用
文档。打开
。我正在编写一个Chrome扩展,以便将事件侦听器添加到自定义网页。因此,我无法确定自定义是否使用document.write()。为什么不简单地在加载时重写iframe的内容,或者使用
window.setTimeout
document.write
?请重新阅读问题?这个网页不是我写的。这是客户页面。这让人困惑。这个问题其实不是很清楚。我的评论带有误解。