【问题标题】:mutation observer production infinite loop变异观察者生产无限循环
【发布时间】:2018-06-18 19:58:47
【问题描述】:

我正在编写一个函数,使用带有 jQ​​uery 的突变观察器来注册对 DOM 的更改,特别是当添加新节点时,我可以更改其内容:

$("SELeCTOR GOOD" ).click(function(){
  var targetNode = $(this).find('.content').get(0);
  var config = { attributes: true, childList: true, subtree: true, attributeOldValue: true };

  // Callback function to execute when mutations are observed
  var callback = function(mutationsList) {
      for(var mutation of mutationsList) {
          if (mutation.type == 'childList') {
              var courses = $(targetNode).find('.courses').get(0);
              $(courses).find('.coursebox.clearfix').each(function( index,item ) {
                var attacherURL = $(item).find('.coursename a').attr('href');
                var moreInfoURL = '<a class="btn btn-outline-primary pull-right" href="'+attacherURL+'">More info</a>';

                var oldHTML = $(item).find('div.moreinfo').html();
                var newHTML = moreInfoURL + oldHTML;
                //this following line is supposed to replace the html, but it creates an infinite loop
                $(item).find('div.moreinfo').html(newHTML);
                //end
              });
          }
          else if (mutation.type == 'attributes') {
              console.log('The ' + mutation.attributeName + ' attribute was modified.');
          }
      }
  };

我也尝试过追加/前置,但一切都会创建相同的无限循环。像往常一样,非常感谢任何帮助。

问候

【问题讨论】:

    标签: javascript jquery moodle


    【解决方案1】:

    好吧,您的修改会导致另一个突变,这会导致您再次修改它,从而导致无限循环。一个简单的解决方案是向您的元素添加一个类以将其标记为已处理,并忽略已处理的节点(具有该类的节点)。另一个是检查 dev.morinfo 是否已经在其中包含 moreInfoURL,如果已经存在则忽略

    【讨论】:

    • 谢谢,我使用的是数据属性,但这样做效果更好!
    • 在寻找解决方案一整天后,这让我很开心。有时事情可以多么简单。刚刚添加了一个类,然后检查该类是否存在 record.target.classList.contains('chatStatusUpdated')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多