【问题标题】:MutationObserver - how to detect dom changes within iframeMutationObserver - 如何检测 iframe 中的 dom 变化
【发布时间】:2018-05-13 15:11:19
【问题描述】:

我先解释一下问题: 我的脚本有一个突变观察器,它检测添加的节点,并对内容进行一些处理——比如比较和突出显示一些值。 当前实现检测整个文档正文的变化,目标看起来像这样

var target = document.querySelector('body');

一切正常,除非有 iframe。 有些客户页面有一个或多个 iframe,有些则没有。

我的脚本被添加到父文档的脚本标签中。

问题: a) 是否有可能获得相同的 MutationObserver 来检测 body 和 iframe 的变化?即 dom 中的所有内容,包括 iframe b) 如果单个观察者不可能,那么替代方法是什么?

请注意:我的脚本只能转到主/父文档

【问题讨论】:

  • 如果您不拥有 iframe 的域,或者 iframe 不允许您访问它的 dom (document.domain = '...'),那么您不能
  • 如果 iframe 域与客户端的域来自同一个域怎么办?
  • 它应该可以工作,只要你正确抓取 iframe...document.getElementByTagName('iframe').document.body
  • 你能再具体一点吗?你的意思是我应该有第二个突变观察者,目标是 document.getElementByTagName('iframe').document.body ?

标签: javascript


【解决方案1】:

您需要为每个要观看的 iframe 设置不同的突变观察器。因此,如果您想在当前文档中添加一个观察者,您还需要一个不同的观察者。

如果您可以访问 iframe,则可以像这样观看它:

// Get the iframe body
let iframe = document.getElementById('my-iframe').document.body
// Setup the config
let config = { attributes: true, childList: true }
// Create a callback
let callback = function(mutationsList) { /* callback actions */ }

// Watch the iframe for changes
let observer = new MutationObserver(callback)
observer.observe(iframe, config)

如果 iframe 位于父级的子域中,您可以在 iframe 中使用它:

// where parent.com is the parent domain of the iframe
document.domain = 'parent.com'

如果您不拥有 iframe 的域,那么您就不走运了。

【讨论】:

  • 我正在尝试这个。但是,iframe 文档对象为空。 iframe 的“baseURI”属性显示与父域相同的域。可能出了什么问题?
  • 确保 document.domain 在 iframe 和父级中相同。那是需要验证相同的属性
  • 在我将 iframe 更改为 document.getElementById('my-iframe').contentWindow.document.body 并将 subtree:true 添加到 config 变量之前,这对我不起作用/不可靠。
  • 另请注意,如果您增加主体尺寸,则此方法有效,但在减小主体尺寸时无效(至少在 chrome 中) - 它保持在最大高度。一个好的解决方案是在内容周围使用包装器,然后getBoundingClientRect().height 来获取包装器的高度
猜你喜欢
  • 2020-10-03
  • 2014-11-03
  • 2021-06-18
  • 2021-05-18
  • 2021-06-07
相关资源
最近更新 更多