javascript - 内部 html 在 DOM 树中完全渲染后会触发哪个事件?

标签 javascript jquery html angularjs angular

我想知道当任何 divinnerHtml 属性发生更改并且该 div 的 DOM 树为完全加载到内存中。

我想在该事件触发后调用以下函数。我想删除以下函数中的 setTimeout() hack,因为它有时可能会失败。

private registerEventListenersForLink() {
  let _self = this;
  setTimeout(function () {
    var AElemList = document.querySelectorAll('.appmedia-content-wrapper 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);
        }
      });
    }
  }, 80);
}

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

Event to determine when innerHTML has loaded

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

最佳答案

我解决了我的问题。我已经实现了如下指令,它的效果非常好。感谢 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);
  }

}

关于javascript - 内部 html 在 DOM 树中完全渲染后会触发哪个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838921/

相关文章:

javascript - 文件名中带有撇号的 Windows.open

javascript - Gatsby "Creating Pages from Data Programatically"不起作用

jquery - 获取 div 容器高度以动态调整大小以适应页脚

javascript - .click() 不适用于移动设备

javascript - 将鼠标悬停在另一个上时转换比例 div

html - 无法定位具有特定样式的列表中的链接

javascript - 访问 .val()、.text() 等中元素的值,无需双重选择或缓存

javascript - 使用 CSS 动画和 jQuery 删除 div 消息

HTML 邮寄表单 : prefill subject and body

javascript - 在具有各种监听器的 for 循环中使用 addEventListener()