Javascript document.open删除所有窗口侦听器
我正在写一个Chrome扩展。它用于记录用户在浏览网页时的行为。它通过使用ChromeJavascript 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
内容脚本将事件监听器添加到客户的网页来实现这一点
内容脚本中的代码如下所示:
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
?请重新阅读问题?这个网页不是我写的。这是客户页面。这让人困惑。这个问题其实不是很清楚。我的评论带有误解。