- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Greasemonkey 为 Facebook 的时间线日志页面制作一个脚本。
我需要捕获两种事件:
1) URL 更改(由于更改是通过 Facebook 上的 AJAX 进行的,因此页面未完全重新加载,脚本也未完全重新加载)。
2)部分元素的外观。
我尝试制作两个 MutationObserver,一个用于捕获 URL 更改,另一个用于捕获元素的外观。但它似乎只触发一个(url_mutation_observer
)。
这是我的一些代码:
function handling_url_change(mutations){
mutations.forEach(function (mutation){
if (check_timeline()){
if (!buttons_added){
var element = $(document).find(button_location);
if (element && element.length > 0){
add_buttons();
}
}
}else if (set){
reset();
}
});
}
function handle_deletion(mutations){
mutations.forEach(function (mutation){
if (mutation.addedNodes){
for (var i = 0; i < mutation.addedNodes.length; i++){
if (isheader(mutation.addedNodes[i])){
mutation.addedNodes[i].remove()
}else if (isactivity(mutation.addedNodes[i])){
delete_activity(mutation.addedNodes[i]);
}
return true;
}
}
});
return true;
}
/*
** Mutation observers :
*/
var url_mutation_observer = new MutationObserver(handling_url_change);
var delete_mutation_observer = new MutationObserver(handle_deletion);
我有一些问题:
1) 不是每个 MutationObserver 都捕获每个突变吗?
2)添加按钮(就像我的脚本那样)是否算作突变?
3)如果我添加一个元素,并带有由添加该元素触发的回调函数。不会有递归和死循环的风险吗?
4) 是否可以使用 MutationObserver 仅捕获 URL 更改,并使用另一种元素仅捕获某些类型元素的出现?(为了确保每个人只捕获他需要捕获的内容,我不知道该怎么做,我用检查页面的函数检查了 url,而不是用检查突变是否是“UrlChangeMutation”或类似的东西)。
5)我能做什么?
注意:如果您也需要,这里是完整的脚本,其中包含用于调试的 console.log()
调用。 http://dpaste.com/3NWV08J
NB2:如果您还希望此脚本没有 console.log()
调用: http://dpaste.com/3AH8YF5
最佳答案
首先,请注意您的 for
循环已损坏,因为它包含无条件返回 true
。
1) Isn't each MutationObserver catching every mutation?
是的,因为您正在观察文档
。
2) Is the addition of a button (like my script does) counted as a mutation?
当然。
3) If I add an element with a callback function triggered by the addition of such element. Isn't there a risk of recursion and infinite loop?
绝对是。
(但这将是一个非阻塞循环,这意味着页面可能不会卡住。)
4) Is that possible to catch only the URL change with a MutationObserver [...]?
不,这不是 MutationObservers 所做的。来自 MDN :
MutationObserver
provides developers a way to react to changes in a DOM.
请注意,“UrlChangeMutation 或类似内容”不存在。
4) [...] and to catch the appearance of only some kinds of elements with the other one?
您无法指定过滤器,但您可以在回调函数中检查受影响的元素是否符合您的条件。
天哪,你可以访问每个节点的所有方法和属性,你还需要什么?
5) What could I do?
我的建议?谷歌更多。
例如,“javascript on url change”的第一个结果是:
我建议您阅读 DOM ,因为你似乎根本不知道那里存在很多东西。
关于javascript - 是否可以同时运行两个 MutationObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543401/
我不是很熟悉 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
我是一名优秀的程序员,十分优秀!