【问题标题】:How can I detect all images loaded inside an HTML binding?如何检测 HTML 绑定中加载的所有图像?
【发布时间】:2019-10-04 23:37:35
【问题描述】:

在我的组件模板中,我有一个这样的容器

<div [innerHTML]="somehtml | safeHtml"></div>

HTML 包含带有标准图像标签的图像 喜欢

&lt;img src="http://google.com/someimage.png"/&gt;

我想知道我的 HTML 中的图像何时完全加载。我该如何检查?

P.S.:safehtml 只是一个消毒管道

编辑:我正在寻找基于事件的解决方案,而不是检查时间间隔!我还需要一个专门针对这个容器的解决方案

【问题讨论】:

  • 你可以这样做:jQuery(window).load(function () { alert('page is loaded'); setTimeout(function () { alert('page is loaded and 1 minute has passed'); }, 60000); });
  • @DigitalJedi 不,这只会在页面上的所有内容都加载时触发

标签: javascript angular angular7


【解决方案1】:

下次请先阅读其他一些问题,并尝试自己解决问题,然后再编写自己的问题 但这是解决方案:

jQuery(window).load(function () {
        alert('page is loaded');

        setTimeout(function () {
            alert('page is loaded and 1 minute has passed');   
        }, 60000);

    });

【讨论】:

  • 是的,但这只是基于间隔的检查。我想收听一个事件或订阅一些东西
  • 对不起,你是对的。无论如何,这确实意味着页面上的其他所有内容也都已加载,而不仅仅是我在 div 中的图像。对吗?
  • 那么这不是您的解决方案和您可能提到的其他解决方案所提供的。我的用例是:我有几个带有绑定 HTML 的容器,这些容器由用户通过 CMS 提供,我想为每个容器制作一个加载动画,直到它完全初始化。但是,当特定容器的内容准备好时,动画应该会消失。
【解决方案2】:

你可以试试这样的。我不喜欢它,因为它不是有角度的方式,但由于你的模板是一个字符串,我几乎不相信有更好的东西:

HTML:

<div [innerHTML]="somehtml | safeHtml" id="div-to-check"></div>

TS:

this.somehtml = `your html`;
window.setTimeout(() => { // Let's make it async to execute it in the next tick
  const promises = Array.from(
    document.querySelectorAll('#div-to-check img')
  ) // get all images
  .map((img: HTMLImageElement) => {
    if (img.complete) {
      return Promise.resolve(); // Check if the image already loaded. Maybe it's been too fast
    }
    return new Promise((resolve, reject) => {
      img.onload = resolve; // it resolves when it loads
      img.onerror = reject; // avoids infinite waiting
    });
  });

  Promise.all(promises)
  .then(() => {
    console.log('all images loaded!');
  })
  .catch(() => {
    console.error('an image didn\'t load');
  });
});

【讨论】:

  • 是的,这是我正在寻找的方向,因为它不依赖于时间间隔并且适用于特定容器。正如你所说,不是角度方式。
  • 还将模板作为字符串传递,这不是角度方式:P 角度方式是有一个img 对象数组,并检查每个对象的onload 回调之前 插入 dom。但在这种情况下,您的元素只有在您执行 [innerHTML] 时才开始存在,所以这是唯一的解决方案
  • 嗯,这是一个类似于 CMS 的用例,我有一些用户提供的 HTML。如果我想像你说的那样做,我必须先解析用户 HTML。
  • 而且,我补充说,Angular 不会知道这些元素的存在。您应该为每个img 创建一个dynamic component,然后使用ViewChild 查询它们。这听起来有点矫枉过正
  • 事实是,除非您不将 HTML 附加到某些 DOM,否则您无法解析 HTML。您可以创建一个假文档,然后附加 HTML,插入 onload 回调,然后从假文档中删除元素并附加到真实 DOM,但与此实现相比并没有太大变化。也许它会避免异步步骤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多