【发布时间】:2015-03-07 05:14:48
【问题描述】:
简而言之,我需要知道页面上的某些元素是否在页面上,因为某个脚本通过父元素上的 InnerHtml 属性插入了它们,或者它们是否是下载的原始 HTML 文档的一部分。这两种可能性在这个(荒谬的)应用程序中意味着非常不同的东西。
实际用例:
第 3 方脚本通过设置元素的 InnerHtml 属性来更新页面上的随机节点元素。我可以完全控制浏览器(WPF / GeckoFx / XulRunner),并且能够随意注入和修改(新)JS,但没有洞察力或修改严重混淆的第 3 方脚本的能力。
获取我需要的数据的唯一方法是在页面加载后确定屏幕上的某些元素(如果存在)是否由第三方脚本(innerHtml)加载,或者它们是否是原始元素的一部分3rd 方脚本运行前的 html 文档。
简单地将页面的原始 html 内容源与其最终状态进行比较是很困难的,因为原始页面上有很多内联脚本。
有人有什么想法吗?
【问题讨论】:
-
我相信变异观察者应该做的伎俩
-
@Xotic750 我无法让它工作。我在任何其他脚本触发之前注入了我的脚本,并跟踪了所有突变事件(nodeAdded 类型)。当浏览器解析 html 文档时,它会向 dom 添加新节点。我想不出一种方法来区分由此产生的节点与通过 innerHtml 调用添加的节点。我在这方面的最佳想法是禁用所有 js,加载页面,听取观察者的意见,然后在启用 js 的情况下重新加载,但这看起来像是一个目标之路的雷区。
-
我认为你的脚本需要在加载页面的
head标签中,否则我担心你可能会倒霉。 -
如果您可以在 DOM 准备好之后并且在任何其他之前运行您的脚本,您可以克隆文档正文并比较之前和之后感兴趣的节点。虽然很脏。另一个想法是用您自己的构造函数覆盖 Element 构造函数,用您选择的派发事件的 getter/setter 替换 innerHTML 属性,然后使用原始 内部HTML。只有当您“完全控制浏览器”时才可行,它不能作为通用解决方案。只是想法……
-
这是对我父母的反思! :-)(来自Shelly Berman skit 的一行)很高兴它让你走上了正确的道路。发布您提出的内容作为对您的 OP 的回答。这种方法已经存在了一段时间(例如早期的 Prototype.js),尽管它不能被推荐为通用解决方案。
标签: javascript html firefox javascript-framework mutation-observers