检测 DOM 中的变化
我想在 html 中添加一些 div 或输入时执行一个函数。 这可能吗?
例如,添加一个文本输入,然后应该调用该函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想在 html 中添加一些 div 或输入时执行一个函数。 这可能吗?
例如,添加一个文本输入,然后应该调用该函数。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(12)
为此扩展一个 jquery 怎么样?
Jquery 1.9+ 已经建立了对此的支持(我听说没有测试过)。
How about extending a jquery for this?
Jquery 1.9+ has built support for this(I have heard not tested).
发现这个问题,因此在 2022 年更新了解决方案。
我们看到了不同的解决方案,其中主要涉及
MutationObserver
。如果有人想记录 DOM 更改并将其存储在一段时间后重播,可以使用 rrweb
编辑:
添加示例,以下是提示:
rrweb 您可以通过 CDN 或 npm
让我们以 CDN 用于记录 DOM 更改事件:
步骤 1:只需在
中包含以下脚本标记;
标签步骤 2:并添加在您的代码中添加以下代码以捕获 rrweb 生成的事件。
此示例主要用于记录任何 Web 应用程序的事件。
要详细了解和理解(如何录制/重放),请阅读 rrweb 文档。
重播示例:
这是为了调试,但在此处添加以便任何人也可以检查重播端:
重播器示例
Found the question so updating with a solution in 2022.
We have seen different solutions which mostly involve
MutationObserver
.If anyone wants to record the DOM changes and store them to replay after some time, they can use rrweb
Edit:
Adding example, here are the hints:
rrweb you can use via CDN or npm
Let's take the example of CDN for recording the DOM changes events:
Step 1: just include following script tag in the
<HTML><head>
tag<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/rrweb-all.js" crossorigin="anonymous"></script>
Step 2: and add the below code in your code to capture the events generated by rrweb.
This example is mostly for recording events for any web application.
To know and understand in the detail (how to record/replay), please read from rrweb documentation.
Replayer Example:
This was for debugging, however adding here so that anyone can check replayed side as well:
Replayer Example
2024 MutationObserver 使用 MDN 最佳实践更新:
我找到了示例在 https://developer.mozilla.org/en-US/docs /Web/API/MutationObserver 比任何现有答案更有帮助和简洁。
2024 MutationObserver Update with MDN Best Practices:
I found the example at https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver was more helpful to be more helpful and concise than any of the existing answers.
使用 TrackChanges 检测 html 更改。
链接: https://www.npmjs.com/package/track-changes-js< /a>
示例
Use TrackChanges for detect html changes.
Link: https://www.npmjs.com/package/track-changes-js
Example
迄今为止的终极方法,代码最少:
(IE11+、FF、Webkit)
Ultimate approach so far, with smallest code:
(IE11+, FF, Webkit)
2015 更新,新的
MutationObserver
是现代浏览器支持:Chrome 18+、Firefox 14+、IE 11+、Safari 6+
如果您需要支持较旧的浏览器,您可以尝试回退到其他方法,例如本文中提到的方法下面是 5 (!) 岁的答案。那里有龙。享受吧:)
其他人正在更改文档吗?因为如果您可以完全控制更改,则只需使用函数或自定义事件创建自己的
domChanged
API - 并在修改内容的任何地方触发/调用它。DOM Level-2 有 突变事件类型,但老版本的IE不支持。请注意,突变事件在 DOM3 事件规范中已弃用 并有性能损失。
您可以尝试在 IE 中使用
onpropertychange
来模拟突变事件(如果没有可用的方法,则退回到暴力方法)。对于完整 domChange 来说,间隔可能有点过分了。想象一下,您需要存储整个文档的当前状态,并检查每个元素的每个属性是否相同。
也许如果您只对元素及其顺序感兴趣(正如您在问题中提到的),则
getElementsByTagName("*")
可以工作。如果您添加元素、删除元素、替换元素或更改文档结构,这将自动触发。我写了一个概念证明:
用法:
这适用于 IE 5.5+、FF 2+、Chrome、Safari 3+ 和 Opera 9.6+
2015 update, new
MutationObserver
is supported by modern browsers:Chrome 18+, Firefox 14+, IE 11+, Safari 6+
If you need to support older ones, you may try to fall back to other approaches like the ones mentioned in this 5 (!) year old answer below. There be dragons. Enjoy :)
Someone else is changing the document? Because if you have full control over the changes you just need to create your own
domChanged
API - with a function or custom event - and trigger/call it everywhere you modify things.The DOM Level-2 has Mutation event types, but older version of IE don't support it. Note that the mutation events are deprecated in the DOM3 Events spec and have a performance penalty.
You can try to emulate mutation event with
onpropertychange
in IE (and fall back to the brute-force approach if non of them is available).For a full domChange an interval could be an over-kill. Imagine that you need to store the current state of the whole document, and examine every element's every property to be the same.
Maybe if you're only interested in the elements and their order (as you mentioned in your question), a
getElementsByTagName("*")
can work. This will fire automatically if you add an element, remove an element, replace elements or change the structure of the document.I wrote a proof of concept:
Usage:
This works on IE 5.5+, FF 2+, Chrome, Safari 3+ and Opera 9.6+
以下示例改编自 Mozilla Hacks 的 博客文章并且正在使用MutationObserver。
浏览器支持:Chrome 18+、Firefox 14+、IE 11+、Safari 6+
The following example was adapted from Mozilla Hacks' blog post and is using MutationObserver.
Browser support: Chrome 18+, Firefox 14+, IE 11+, Safari 6+
完整说明:https://stackoverflow.com/a/11546242/6569224
Complete explanations: https://stackoverflow.com/a/11546242/6569224
我最近编写了一个插件,它正是这样做的 - jquery.initialize。
(NPM 链接 -不同的 NPM/GitHub 用户名,同一作者)
您使用它的方式与
.each
函数相同。与
.each
的区别是 - 它需要您的选择器,在本例中 < code>.some-element 并等待将来使用此选择器添加新元素,如果添加了此类元素,它也会被初始化。在我们的例子中,初始化函数只需将元素颜色更改为蓝色。因此,如果我们添加新元素(无论是使用 ajax 还是 F12 检查器或任何其他元素),例如:
插件将立即初始化它。插件还确保一个元素仅初始化一次。因此,如果您添加元素,然后
.detach()
将其从 body 中删除,然后再次添加它,它将不会再次初始化。插件基于
MutationObserver
- 它将在 IE9 和 10 上运行,其依赖项详见I have recently written a plugin that does exactly that - jquery.initialize.
(NPM link - different NPM/GitHub user name, same author)
You use it the same way as
.each
functionThe difference from
.each
is - it takes your selector, in this case.some-element
and wait for new elements with this selector in the future, if such element will be added, it will be initialized too.In our case initialize function just change element color to blue. So if we'll add new element (no matter if with ajax or even F12 inspector or anything) like:
Plugin will init it instantly. Also plugin makes sure one element is initialized only once. So if you add element, then
.detach()
it from body and then add it again, it will not be initialized again.Plugin is based on
MutationObserver
- it will work on IE9 and 10 with dependencies as detailed on the readme page.或者您可以简单地创建自己的活动,该活动随处可见
完整示例
http://jsfiddle.net/hbmaam/Mq7NX/
or you can simply Create your own event, that run everywhere
Full example
http://jsfiddle.net/hbmaam/Mq7NX/
使用 MutationObserver 界面,如 Gabriele Romanato 的 博客
Chrome 18+、Firefox 14+、IE 11+、Safari 6 +
Use the MutationObserver interface as shown in Gabriele Romanato's blog
Chrome 18+, Firefox 14+, IE 11+, Safari 6+
8 年后,这是我使用
MutationObserver
和RxJS
的解决方案。与其他方法的主要区别是在 DOM 更改时触发
CustomEvent
,并且通过以下功能监听去抖事件以有效地执行用户逻辑;stackblitz 上的演示。
8 years later, here is my solution using
MutationObserver
andRxJS
The main difference from the other approaches is to fire a
CustomEvent
when DOM changes, and listen to the event debounced to execute user logic efficiently with the following features;Demo at stackblitz.