获取添加的 DOM 节点的类名 (mutationObserver)
getting the className of added DOM node (mutationObserver)
我正在编写一个简单的用户脚本,如果它包含特定的单词列表,它将自动隐藏 Facebook post。核心功能有效,但我的 MutationObserver
似乎没有正确读取 mutation.addedNodes
的 className
。我遍历 mutation.addedNodes
并检查这些元素中是否有任何元素具有 class userContentWrapper
,但该测试的结果始终为 false - 即使该元素确实具有 class.
var startObserver = function() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var added = mutation.addedNodes;
for (var i = 0; i < added.length; i++) {
if (/\buserContentWrapper\b/.test(added[i].className)) {
processFilter(added[i]);
}
}
});
});
var obj = {childList: true, subtree: true, attributes: true};
observer.observe(document.documentElement, obj);
};
我只能假设观察者正在分析添加的节点,然后才完全形成所有属性。我怎样才能让观察者等待处理节点直到它完全完成?还是我没看懂问题?
提前致谢...
一些添加的节点是容器,所以你应该检查它们的内部:
const observer = new MutationObserver(onMutation);
observer.observe(document, {
childList: true,
subtree: true,
});
function onMutation(mutations) {
const found = [];
for (const { addedNodes } of mutations) {
for (const node of addedNodes) {
if (!node.tagName) continue; // not an element
if (node.classList.contains('userContentWrapper')) {
found.push(node);
} else if (node.firstElementChild) {
found.push(...node.getElementsByClassName('userContentWrapper'));
}
}
}
found.forEach(processFilter);
}
MutationObserver 回调作为一个微任务执行,它会阻塞 DOM 和 JS 引擎,因此请尽量让它变快,尤其是当它运行在一个复杂的网站上时,例如 facebook 会产生大量 DOM 突变.这可以在 devtools(F12 键)profiler/timeline 面板中进行测试。
我正在编写一个简单的用户脚本,如果它包含特定的单词列表,它将自动隐藏 Facebook post。核心功能有效,但我的 MutationObserver
似乎没有正确读取 mutation.addedNodes
的 className
。我遍历 mutation.addedNodes
并检查这些元素中是否有任何元素具有 class userContentWrapper
,但该测试的结果始终为 false - 即使该元素确实具有 class.
var startObserver = function() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var added = mutation.addedNodes;
for (var i = 0; i < added.length; i++) {
if (/\buserContentWrapper\b/.test(added[i].className)) {
processFilter(added[i]);
}
}
});
});
var obj = {childList: true, subtree: true, attributes: true};
observer.observe(document.documentElement, obj);
};
我只能假设观察者正在分析添加的节点,然后才完全形成所有属性。我怎样才能让观察者等待处理节点直到它完全完成?还是我没看懂问题?
提前致谢...
一些添加的节点是容器,所以你应该检查它们的内部:
const observer = new MutationObserver(onMutation);
observer.observe(document, {
childList: true,
subtree: true,
});
function onMutation(mutations) {
const found = [];
for (const { addedNodes } of mutations) {
for (const node of addedNodes) {
if (!node.tagName) continue; // not an element
if (node.classList.contains('userContentWrapper')) {
found.push(node);
} else if (node.firstElementChild) {
found.push(...node.getElementsByClassName('userContentWrapper'));
}
}
}
found.forEach(processFilter);
}
MutationObserver 回调作为一个微任务执行,它会阻塞 DOM 和 JS 引擎,因此请尽量让它变快,尤其是当它运行在一个复杂的网站上时,例如 facebook 会产生大量 DOM 突变.这可以在 devtools(F12 键)profiler/timeline 面板中进行测试。