【问题标题】:MutationObserver get removedNodes onlyMutationObserver 仅移除节点
【发布时间】:2018-02-02 17:57:10
【问题描述】:

我正在尝试从可以有 0 - n 个副本并且可以动态添加的页面中获取特定的已删除元素属性。我开始使用 DOMNodeRemoved 事件,然后得知这是不推荐使用的,然后转向 MutationObserver。这是下面的代码示例 -

var deletionObserver = new MutationObserver(function (mutations) {
  mutations.forEach(function (mutation) {
    if (mutation.removedNodes.length > 0) {
      var $target = jQuery(mutation.removedNodes);
      lodash.forEach($target.find("Node"), function (value) {
..............

//Call
deletionObserver.observe(jQuery('body').get(0), {childList: true, subtree: true})

问题 - 我通过 removedNodes 对象获取了太多节点,例如,当我向页面添加 <p> 元素时,mutationObserver 在 removedNodes 对象中返回一个 <p> 节点。同样,当我删除一个<p> 时,我在removedNodes 对象中得到了一个额外的元素。有没有其他方法可以完全删除节点。我尝试在添加 <p> 元素时将 removedNode 与 jQuery("body") 进行比较。有点像 -

if(jQuery("body").find($target).length > 0)

这不起作用,我总是得到零。任何建议都会对您有所帮助。

【问题讨论】:

  • 你能多贴一点你的代码吗?

标签: javascript jquery mutation-observers


【解决方案1】:

试试这个:

var deletionObserver = new MutationObserver(
  function (mutations) {
    mutations.forEach(
      function (mutation) {
        mutation.addedNodes.forEach(
          function(node) {
            console.log('The added node', node);
          }
        );
        mutation.removedNodes.forEach(
          function(node) {
            console.log('The removed node', node);
          }
        );
      }
    );
  }
);

var container = document.querySelector('.container');
console.clear();

deletionObserver.observe(container, {
  childList: true,
  subtree: true
});

setTimeout(function() {
  var temp = document.createElement('p');
  temp.textContent = "I am a `p` tag";
  container.appendChild(temp);
  setTimeout(function() {
    temp.remove();
  }, 1000);
}, 1000);
<div class="container"></div>

我正在观察添加节点和删除节点的时间。

Mutation Observer 被称为一个节点被添加和一个节点如果被删除。

但它为您提供了添加和删除的节点。因此,无需查找它们。

我将内置的forEach 用于突变数组以及添加或删除节点的数组。无需使用 lodash。而且运行速度更快。

document.body 也是 jQuery('body').get(0) 的香草 JS 方式,它运行得更快。

【讨论】:

  • 我看的父元素是一个文本区域(confluence页面编辑模式)。因此,如果我按 Enter 键,则会添加一个新行,但是会触发 mutationObserver 并且它会在 removedNode 对象中提供一个元素而不是 addedNodes。我将使用 forEach,我只是以 jQuery('body').get(0) 为例。
  • 如果您谈论的是<textarea> 元素,它们没有任何子元素。相反,它的所有文本都可以通过element.value 获得。所以突变观察者不会跟踪任何变化。相反,您可以使用input 事件来了解何时进行了更改。如果您正在谈论将contentEditable 设置为true 的DOM 元素,那么突变观察器应该可以工作。您能否发布更多代码,以便我可以更深入地研究。 - 更多信息:developer.mozilla.org/en-US/docs/Web/Guide/HTML/…
  • 我说的不是字面意义上的,它是一个象征性的文本区域。请观看视频以了解我所说的 Confluence 页面编辑模式的含义 - youtube.com/watch?v=yx2r1mzIuUU。你需要整个方法吗?或与上述不同的东西。
猜你喜欢
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2017-10-10
  • 2016-05-05
  • 2019-03-14
相关资源
最近更新 更多