【发布时间】:2011-01-28 06:15:27
【问题描述】:
我需要一种有效的机制来检测对 DOM 的更改。最好是跨浏览器,但如果有任何非跨浏览器的有效方法,我可以使用故障安全的跨浏览器方法来实现这些。
特别是,我需要检测会影响页面文本的更改,因此需要任何新的、已删除或修改的元素,或对内部文本 (innerHTML) 的更改。
我无法控制所做的更改(它们可能是由于包含 3rd 方 javascript 等),因此无法从这个角度进行处理 - 我需要以某种方式“监控”更改。
目前我已经实现了一个“quick'n'dirty”方法,它会每隔一段时间检查body.innerHTML.length。这当然不会检测到导致返回相同长度的更改,但在这种情况下“足够好” - 发生这种情况的可能性非常小,在这个项目中,无法检测到更改不会导致在丢失的数据中。
body.innerHTML.length 的问题在于它很贵。在 fast 浏览器上可能需要 1 到 5 毫秒,这会使事情陷入困境——我还要处理大量的 iframe,这一切都加起来了。我很确定这样做的代价是因为 innerHTML 文本不是由浏览器静态存储的,每次读取时都需要从 DOM 中计算出来。
我正在寻找的答案类型是从“精确”(例如事件)到“足够好”的任何类型 - 可能像 innerHTML.length 方法一样“快速'n'dirty”,但执行更快。
编辑: 我还应该指出,虽然检测已修改的精确元素会“很好”,但这并不是绝对必要的——只要有 any 更改这一事实就足够了.希望这能扩大人们的反应。我将研究 Mutation Events,但我仍然需要 IE 支持的后备,因此非常欢迎任何古怪的、有创意的、不合常规的想法。
【问题讨论】:
-
上次被问到这个问题时运气不佳:stackoverflow.com/questions/648996/…
-
是的,我看到了,你说得对……运气不好。 然而,因为我不需要 100% 的准确率,也因为我不需要确定哪个元素发生了变化,只要 发生了变化,我我希望人们为我想出一些创造性的解决方案......
标签: javascript dom mutation-events mutation-observers