【问题标题】:Mutation Observer only get specific contentMutation Observer 只获取特定内容
【发布时间】:2015-03-05 21:44:45
【问题描述】:

我有以下结构:

<div class="wrapper">
   <div class="col">left</div>
   <div class="col">middle</div>
   <div class="col">right</div>
</div>

现在我只想在 $('.col') 内部包含一个“block”类的 div 时获取节点,例如:

是的:

$('.col')[1].append($('<div class="block">urgent</div>'));

但不适合:

$('.col')[1].append($('<div class="different">dontcare</div>'));

我的观察者看起来像这样:

 var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            for (var i = 0; i < mutation.addedNodes.length; i++) {
                    console.log(mutation.addedNodes[i]);
                }
            });            
        });

    observer.observe(document, {
        childList: true,
        subtree:true,
        characterData:true,
        attributes:true        
    });

我在一个 chrome 扩展中,但这并不重要

【问题讨论】:

  • 你自己试试吧;)

标签: javascript jquery mutation-observers


【解决方案1】:

修改了你的代码:

  • $('.col')[1].append抛出一个TypeError,因为你在DOM Node上使用jQuery函数,使用eq,方法
  • 删除for,添加forEach

我通过在mutation.addedNodes NodeList 中添加了对.block 元素的检查 addedNode.classList.contains('block')

My code:

$(function () {
​
  'use strict';

  var observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
      [].slice.call(mutation.addedNodes).forEach(function (addedNode) {
        if (addedNode.classList.contains('block')) {
          console.log("I'm has a class block, whats next?");
        }
      });
    });            
  });
​
  observer.observe(document, {
    childList: true,
    subtree:true,
    characterData:true,
    attributes:true        
  });
​
​
  //Yes
  $('.col').eq(1).append($('<div class="block">urgent</div>'));
​
  //No
  $('.col').eq(1).append($('<div class="different">dontcare</div>'));
​
});

【讨论】:

  • 您的修改不正确,因为addedNode 属性稍后可能会在同一个mutations 堆栈中更改。在这种情况下,通过调用addedNode.classList.contains(...),您将获得最终的addedNode 类列表,这是一种不应该的行为。
  • 链接到classList 文档会很棒
  • 谢谢!我用它来解决我的问题!
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 2012-12-13
  • 2019-10-16
  • 2011-02-25
  • 2012-10-27
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多