javascript - 检查突变观察者是否通过某些条件的最佳方法

标签 javascript ecmascript-6 mutation-observers

我已经实现了一个突变观察器,用于监视页面加载的突变。我专门寻找加载/存在特定元素的点。我可以通过它的类名来指定它,例如 foo

当在变异对象列表中找到 foo 时,我希望调用一个函数。

目前,我有以下内容:

  mutations.forEach(mutation => {
    if (!mutation.addedNodes || mutation.addedNodes[0].className === undefined || mutation.addedNodes[0].className !== 'foo') {
      return;
    } else {
      console.log(mutation.addedNodes[0].className + ' loaded!');
    }
  });

这在技术上是有效的:当它通过三个条件时,我确实看到了控制台日志。

但是,如果 mutation.addedNodes[0] 没有任何 className 数据,则会出现错误

Cannot read property 'className' of undefined

我确实理解为什么会发生这种情况;有时 mutations 没有 addedNodes[0] 所以确实是未定义的。我不确定的是,仅当上述测试通过时才触发控制台日志(稍后将是我的函数)的最佳方法。

我仍在学习 ES6,我希望有一些东西可以帮助我,但我只是在努力寻找最好的方法。

最佳答案

  1. 在页面加载期间,每个报告的节点可能是一个包含数十或数百个嵌套节点的容器,因此您需要枚举所有 addedNodes 并检查每个节点的树。
  2. 一些报告的突变记录可能与删除的节点有关(例如,通过页面脚本),因此 addedNodes 将是一个空数组。
  3. 一些添加的节点将是注释或文本节点,因此您需要跳过这些节点。

const matching = [];
for (const {addedNodes} of mutations) {
  for (const node of addedNodes) {
    if (node.nodeType !== Node.ELEMENT_NODE) {
      continue;
    }
    if (node.classList.contains(className)) {
      matching.push(node);
    }
    if (node.children[0]) {
      matching.push(...node.getElementsByClassName(className));
    }
  }
}
if (matching.length) console.log(matching);

关于javascript - 检查突变观察者是否通过某些条件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48319999/

相关文章:

javascript - 使用 Javascript 设置 Cookie 并清理值

javascript - 如何创建结构为 AMD 模块的可重用库?

javascript - 如何使用 jQuery 验证插件忽略输入字段的 "remote"验证

Javascript:替换 a 但不是 ab 中的 a

javascript - MutationObserver 覆盖最新的突变

javascript - 我可以为多个变量分配相同的值,而每个变量/赋值没有一行吗?

javascript - React 元素类型无效 - 传递 Prop 时出现 ES6 解构语法错误

javascript - ES5 实际上相当于 ES6 我的 lambda 搜索?

javascript - Swiper 观察者随机延迟

javascript - 是什么导致我的突变观察者使用脚本出现此错误?