内部html在DOM树中完全呈现后会触发哪个事件?

时间:2017-03-16 15:53:03

标签: javascript jquery html angularjs angular

我想知道当任何innerHtml的{​​{1}}属性发生更改时将触发什么事件,而DOM div的树被完全加载到内存中。

我想在触发该事件后调用以下函数。我想在以下函数中删除div hack,因为它可能会在某个时候失败。

setTimeout()

我找到了以下与上述问题相关的链接,但我没有得到任何想法:

Event to determine when innerHTML has loaded

https://www.w3.org/html/wg/spec/apis-in-html-documents.html#dom-innerhtml

1 个答案:

答案 0 :(得分:1)

我解决了我的问题。我已经实现了如下指令,它就像一个魅力。谢谢Rory McCrossan将我指向MutationObserver api。

import { Directive, ElementRef } from '@angular/core';
import { UtilService } from '../../providers/util-service';

@Directive({
  selector: '[external-links]' // Attribute selector
})
export class ExternalLinks {
  private observer;
  constructor(private elRef: ElementRef, public utilService: UtilService) {
  }

  ngAfterViewInit() {
    var _self = this;
    this.observer = new MutationObserver(mutations => {
      mutations.forEach(function (mutation) {
        if (mutation.type == 'childList') {
          var AElemList = _self.elRef.nativeElement.querySelectorAll('a');
          for (let i = 0; i < AElemList.length; i++) {
            AElemList[i].addEventListener("click", function (event) {
              event.preventDefault();
              event.stopPropagation();
              var url = event.target["href"];
              if (url && url.trim() != '') {
                _self.utilService.openUrlExternaly(url);
              }
            });
          }
        }
      });
    });
    var config = { childList: true };

    this.observer.observe(this.elRef.nativeElement, config);
  }

}