- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 MutationObserver
绑定(bind)到 #foo
html 元素。
var target = document.querySelector("#foo");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
// ...
});
});
当用户点击 #button
元素时,#foo
会被移除并在一秒钟后再次出现。
<div id="button">Click me to remove the Foo!</div>
<div id="foo">Hello, I'm Foo!</div>
正如我所注意到的,在删除并重新创建 #foo
后,观察器停止工作。
第三个问题:
最佳答案
and appears again after a second
行为将完全取决于您的意思。
如果你的意思是创建一个具有相同 id
的 new 元素,那么是的,这是预期的行为:当你调用 observer.observe
在元素上,您是在那个特定元素 上调用它,而不是在任何与其 ID 匹配的元素上调用它。如果您从 DOM 中删除该元素并将其替换为另一个看起来相同的不同元素,则观察者不会神奇地连接到该新的不同元素:
var target = document.querySelector("#foo");
var observer = new MutationObserver(function(mutations) {
console.log("#foo was modified");
});
observer.observe(target, {subTree: true, childList: true});
var counter = 0;
tick();
setTimeout(function() {
console.log("Replacing foo with a new one");
target.parentNode.removeChild(target);
target = document.createElement("div");
target.id = "foo";
target.innerHTML = "This is the new foo";
document.body.insertBefore(target, document.body.firstChild);
}, 1000);
function tick() {
target.appendChild(document.createTextNode("."));
if (++counter < 20) {
setTimeout(tick, 200);
}
}
<div id="foo">This is the original foo</div>
如果您的意思是将相同的元素放回到 DOM 中,那么不,这不是预期的行为,也不是本例中发生的情况:
var target = document.querySelector("#foo");
var observer = new MutationObserver(function(mutations) {
console.log("#foo was modified");
});
observer.observe(target, {subTree: true, childList: true});
var counter = 0;
tick();
setTimeout(function() {
console.log("Removing foo for a moment");
target.parentNode.removeChild(target);
setTimeout(function() {
console.log("Putting the same foo back in");
document.body.insertBefore(target, document.body.firstChild);
}, 100);
}, 1000);
function tick() {
target.appendChild(document.createTextNode("."));
if (++counter < 20) {
setTimeout(tick, 200);
}
}
<div id="foo">This is the original foo</div>
此处的关键信息是观察者正在观察您传递给 observe
的一个特定元素。
这些问题仅在您删除旧元素并将其替换为全新元素时适用:
So, I need to launch the observer again?
如果您要删除原始元素并放置一个新元素,您应该告诉观察者停止观察:
observer.disconnect();
一旦有了新元素,就可以将观察者连接到它:
observer.observe(theNewElement, /*...options go here...*/);
Is the first observer is totally removed? Or, instead of that, it is still running, with just "doing nothing"?
理论上,因为the spec清楚地表明它是引用其观察者的元素,然后如果您释放对该元素的唯一引用,理论上观察者会断开连接,因为该元素及其观察者列表已被清理。但是,尚不清楚观察者的 disconnect
方法如何在观察者没有返回元素的引用的情况下实现,因此它们可能具有相互引用。如果您保留对观察者的引用,那将在内存中保留相互引用。可以肯定的是,我会故意断开它。
I'm asking about it, because I don't want the multiple observers run, if only one of them doing the real work.
观察者不“跑”,他们 react 。观察者将继续观察原始元素,直到/除非您断开连接。如果您没有对原始元素做任何事情,那么观察者除了占用内存之外什么也没有做。但同样,如果您要删除该元素,您应该断开观察者的连接。
关于javascript - 删除元素后的 MutationObserver 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35253565/
我不是很熟悉 JavaScript 和垃圾回收的内部结构。我想避免在使用 MutationObserver 时可能产生内存问题的循环引用,并且我知道如果 GC 假设错误,我可以使 MutationOb
fiddle :https://jsfiddle.net/7gj26hqu/ 我想要一个MutationObserver可以检测自身内部的所有新节点。在示例中,我设置了 {childList: tru
我正在尝试检测元素中的 CSS 属性更改。我在网上搜索发现MutationObserver javascript API。但在我的测试脚本中,它没有按预期工作(它没有提醒属性名称和属性值)。 var
所以我正在尝试更改一些 JavaScript 从此 content.forumobserver = content.build.forumobserver = function() { var
我正在尝试在我的插件中使用 MutationObserver。因此,我注入(inject)一个内容脚本,然后设置观察者。这似乎有效,而且检测到的突变似乎无法序列化为 JSON。但实际上我想使用this
在下面的代码中,通过重复单击 2 个按钮,观察者 仅在每个观察到的目标上的第一个更改时触发? (输出显示更改。) 如何让它在每次更改时都生效? var cc = 1; document.querySe
我正在使用 MutationObserver检测何时将特定类添加到元素。 const observer = new MutationObserver((mutations) => { muta
我试图从页面中获取特定的已删除元素属性,该属性可以有 0 - n 个副本并且可以动态添加。我开始使用 DOMNodeRemoved 事件,最初了解到该事件已被弃用,然后转向 MutationObser
我正在尝试使用 Greasemonkey 为 Facebook 的时间线日志页面制作一个脚本。 我需要捕获两种事件: 1) URL 更改(由于更改是通过 Facebook 上的 AJAX 进行的,因此
以下代码允许我在单个节点上监听类更改: var target = $(".right-border")[0] var observer = new MutationObserver(function(
我想同步一些DOM节点属性。如果更改某个属性,则会更改其他元素属性。 我可以更改它,但我无法为其编写测试。该测试更改观察到的元素的属性,然后检查更改是否应用于其他元素。更改同步最终会发生,但不会在观察
对我来说,这个 API 中最令人困惑的是为什么使用它。我了解 ReactJS 和 RxJS,并且我已经习惯了 View 对数据更改使用react的概念。因此,观察 DOM 的变化(这肯定是在数据发生一
是否可以通过mutationObserver观察节点的innerHTML?我正在尝试使用 characterData: true,但它不会对内容更改进行任何回调。 完整选项列表: childList:
我试图等到 Mutation 事件开始覆盖它刚收到的值。在我尝试正常应用它之前,它一直被我无法控制的第 3 方提供的其他值覆盖。 /** Intercept changes in select2-dr
我打算使用 MutationObserver 来观察元素值的外观和变化,但老实说我不确定应该如何实现。 MO 的目标是 div.player-bar 而我想要完成的是检测 el-badge__cont
我在 chrome 扩展中有以下代码: var observer = new MutationObserver(function (mutations) { mutations.forEach(fun
我正在尝试使用 MutationObserver 来观察 body 元素中样式属性的变化,并将 body 样式属性的溢出属性更改为滚动。当我缩小浏览器窗口时,样式属性会发生变化。Firefox 最终崩
我有一个第 3 方脚本,可以在我的页面上加载一个图片库,其中包含来自场外的图像。 我的页面开始时是空的: 然后第 3 方脚本会添加其他内容(例如照片库的框架):
我正在使用 MutationObserver 来保存可拖动对象中的位置变化。 看起来像这样: let observer = new MutationObserver( (mutations) =>
以下脚本有效,但 chrome 显示有错误.. 我应该怎么做才能解决这个错误? function Do(){alert("test");} new MutationObserver(Do).obser
我是一名优秀的程序员,十分优秀!