📷

[js] imgのonLoadをPromiseで検知する方法 (customElements)

2025/01/05に公開

例えばimgタグで404が返ってきた画像を差し替える時やなんかにとりあえず使える。
customElementsを使ってPromiseをプロパティに設定しておくことで、ほぼ確実にonLoadを追加してPromiseを別スコープのJavaScriptから確認できる。

window.customElements.define("async-img", class extends HTMLImageElement {
  constructor() {
    super();
    this.whileLoad = new Promise((resolve, reject) => {
      this.addEventListener("load", (event) => {
        resolve(event);
      });
      this.addEventListener("error", (event) => {
        reject(event);
      });
    });
  }
}, { extends: "img" });

HTMLの書き方。

<img is="async-img" src="">

Promiseの待ち方の一例

await Promise.allSettled(
  [...document.querySelectorAll(`img[is="async-img"]`)].map((element) => {
    return element.whileLoad;
  })
)

Discussion