获取添加的 DOM 节点的 className (mutationObserver)

2023-11-23

我正在编写一个简单的用户脚本,如果 Facebook 帖子包含特定的单词列表,它将自动隐藏该帖子。核心功能有效,但我的MutationObserver似乎没有读过className of mutation.addedNodes适当地。我循环遍历mutation.addedNodes并检查这些元素是否具有该类userContentWrapper,但该测试的结果始终为 false — 即使该元素确实具有该类。

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 callback is executed as a microtask that blocks DOM and JS engine so try to make it fast, especially if it runs on a complex site such as facebook that generates lots of DOM mutations. This can be tested in devtools (F12 key) profiler/timeline panels.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取添加的 DOM 节点的 className (mutationObserver) 的相关文章

随机推荐

  • 使用plot.ly Dash 等待结果时显示加载符号

    In my Dash基于应用程序 按钮触发长时间运行的计算 在结果尚未出现时显示加载动画并使按钮处于非活动状态以便在计算完成之前不会再次单击该按钮不是很好吗 我在用Bulma用于 UI 设计并想使用button is loading为此目的
  • 为什么 typescript-eslint 对 enumMember 强制采用驼峰命名法?

    TypeScript 文档中的所有枚举示例写入枚举成员作为帕斯卡命名法 例如 enum Direction Up 1 Down Left Right But typescript eslint 命名约定强制使用驼峰命名法 并拒绝帕斯卡命名法
  • 我可以使用谷歌地图 API v3 来获取位置的时区吗?

    是否可以使用谷歌地图API来获取时区 我已经在使用它的 api 进行地理编码和地图显示 我还想添加时区 但我在文档中找不到任何内容 有任何想法吗 链接 您可以使用时区API 例如 使用 jQuery ajax url https maps
  • NodeJS:如何将base64编码的字符串解码回二进制? [复制]

    这个问题在这里已经有答案了 我正在使用 salt 实现密码哈希 因此我将 salt 生成为二进制 对密码进行哈希处理 对密码和 salt 进行 Base64 编码 然后将它们存储到数据库中 现在 当我检查密码时 我应该将盐解码回二进制数据
  • Android 从布局视图创建并打印 pdf

    我正在尝试从 xml 布局视图创建 PDF 文件 我在该布局中有一个列表视图 添加项目并根据子项设置高度 PDF 正在创建但未填充整个页面 我尝试过的是 PdfDocument PageInfo pageInfo new PdfDocume
  • Android中如何获取唯一的设备硬件ID? [复制]

    这个问题在这里已经有答案了 如何获取 Android 中唯一的设备 ID 该 ID 在执行手机重置或操作系统更新时无法更改 更新 19 11 2019 下面的答案与今天不再相关 因此 对于任何寻找答案的人 您应该查看下面链接的文档 http
  • 使用 java 中的 toUpperCase() 将 ß.cfg 转换为大写

    我正在尝试以下代码 String s1 cfg System out println s toUpperCase 我得到的输出是SS CFG因为 Unicode 没有定义 的大写版本 而我希望输出为 CFG 我有什么办法可以实现这一目标吗
  • 从基于 Flask 的 Python 服务器下载文件

    我正在尝试使用我在以下 URL 找到的代码 http code runnable com UiIdhKohv5JQAAB6 how to download a file generated on the fly in flask for p
  • 如何使用 SWRevealViewController 显示调整大小的侧边栏?

    我在 IOS 应用程序 通用 中使用 SWRevealViewController 我在 iPhone 和 iPad 中都获得了侧边栏 但我想显示覆盖 90 屏幕的侧边栏 我该怎么办 打开SWRevealViewController m文件
  • 通过 pandas 中列名称的子字符串融化列(python)

    我有数据框 subject A target word gd A target word fd B target word gd B target word fd subject type 1 1 2 3 4 mild 2 11 12 13
  • Swing:如何制作具有软边框的非矩形窗口?

    如何在 Java 中制作具有软边框的非矩形窗口 软边框 也称为软剪裁 是没有锯齿伪影的边框 我在网上搜索了很多 发现了几篇关于半透明和 或 非矩形窗户 软边界 这个话题很令人困惑 看来我找到的信息有优惠 将软边框应用于组件inside另一个
  • 有时 Facebook 共享对话框无法在 iOS 上加载

    有时 当我启动 Facebook 共享对话框时 操作系统会切换到 Facebook 应用程序 但共享对话框不会加载 然后如果你再试一次 通常会成功 为什么第一次不起作用 NSURL url NSURL URLWithString some
  • 如何在 Perl 中有效地解析 CSV 文件?

    我正在开展一个项目 涉及在 Perl 中解析大型 csv 格式的文件 并且希望提高工作效率 我的方法是split 首先按行读取文件 然后split 每行再次用逗号来获取字段 但这并不是最理想的 因为至少需要两次传递数据 一次按行分割 然后再
  • 相同数据的多个查找结构:内存重复?

    假设我有一群人的数据 并且我希望能够以不同的方式查找他们 也许有某种数据结构 如二叉树 可以方便按名称查找 也许还有另一个 如列表 是按创建顺序排列的 也许还有更多 在许多语言中 每个人都会在堆上分配一次 每个数据结构都包含指向该内存的指针
  • Rails 应用程序有批量电子邮件插件吗?

    有谁知道有一个插件或可以用来为 Rails 应用程序发送批量电子邮件的东西吗 具体来说 我希望能够将 HTML 电子邮件文件传递给 rake 任务或其他任务 并将其通过电子邮件发送给所有注册到我的网站并选中 请向我发送有关 XXX 的信息
  • 确定是否通过 FCM 通知单击打开了活动

    我正在使用 fcm 控制台向所有安装了我的应用程序的设备发送消息 通知没有任何额外的有效负载 只有通知消息 我想知道是否有一种简单的方法可以知道是否通过 FCM 通知单击打开了活动 有一个解决方案 通过扩展FirebaseMessaging
  • 模拟索引属性

    我正在使用 Moq 编写单元测试 我创建了一个模拟对象 现在 当我尝试模拟其属性时 我收到错误 表达式树可能不包含索引属性 这是我的代码 public Node GetNode IMyInterface interface string i
  • Pycharm:设置运行manage.py任务的环境变量

    我已经移动了我的SECRET KEY我的设置文件中的值 当我加载 virtualenv 时它会被设置 我可以确认该值存在于python manage py shell 当我运行 Django 控制台时 SECRET KEY失踪了 这是应该的
  • 如何在 Perl 中增加带有前导零的值?

    这是同样的问题this one 但是使用 Perl 我想迭代一个只有一个前导零的值 shell 中的等价物是 for i in seq w 01 99 do echo i done 由于前导零很重要 因此您可能希望将它们用作字符串 而不是数
  • 获取添加的 DOM 节点的 className (mutationObserver)

    我正在编写一个简单的用户脚本 如果 Facebook 帖子包含特定的单词列表 它将自动隐藏该帖子 核心功能有效 但我的MutationObserver似乎没有读过className of mutation addedNodes适当地 我循环