JavaScript 全局处理所有 img 加载错误

文章介绍了如何使用JavaScript在全局范围内处理img标签的加载错误,通过添加自定义的错误样式并在加载3次失败后显示base64格式的占位图片。

JavaScript 全局处理所有 img 加载错误,显示占位 base64 图片

(function () {
  // 图片加载失败显示的base64图片
  const base64 = "data:image/png;base64,xxxxxx";
  // 图片加载错误处理样式名称
  const errorClassName = "img-load-error";

  // img 加载失败,添加错误处理样式 errorClassName
  document.addEventListener(
    "error",
    (e) => {
      let target = e.target;
      const tagName = target.tagName || "";
      const curTimes = Number(target.dataset.retryTimes) || 0;
      if (tagName.toLowerCase() === "img") {
      	// 加载失败3次后,添加错误处理样式
        if (curTimes >= 3) {
          target.classList.remove(errorClassName);
          target.classList.add(errorClassName);
        } else {
          target.dataset.retryTimes = curTimes + 1;
          target.src = target.src;
        }
      }
      target = null;
    },
    true
  );

  // 图片加载错误处理style
  function errorStyle() {
    const style = document.createElement("style");
    document.head.appendChild(style);
    style.innerHTML = `
        img.${errorClassName} {
            display: inline-block;
            transform: scale(1);
            content: "";
            color: transparent;
        }
        img.${errorClassName}::before {
            content: "";
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background: #f5f5f5 url(${base64}) no-repeat center / 50% 50%;
        }
    `;
  }

  // 注入图片错误处理样式
  window.addEventListener("load", errorStyle, { once: true });
})();

### 使用 JavaScript 实现页面预加载全局函数技术方案 要实现一个基于 JavaScript 的页面预加载全局函数,可以通过多种方式完成。以下是详细的解决方案: #### 1. 利用 `fetch` API 进行资源预加载 通过 `fetch` API 可以动态请求并缓存所需的资源文件。这种方式适合于现代浏览器支持场景。 ```javascript function preloadResources(urls) { urls.forEach(url => { fetch(url, { method: 'GET', cache: 'no-store' }) .then(response => { if (!response.ok) { console.error(`Failed to load resource at ${url}`); } else { console.log(`${url} has been preloaded successfully`); } }) .catch(error => console.error('Error during preloading:', error)); }); } ``` 此方法会遍历传入的 URL 数组,并尝试逐一加载它们[^2]。 --- #### 2. 使用 `<link rel="preload">` 动态创建标签 如果目标是兼容更多浏览器,则可以利用 HTML 中的 `<link>` 标签特性,在运行时动态插入 DOM 节点来触发预加载行为。 ```javascript function preloadWithLinkTag(resources) { resources.forEach(resource => { const link = document.createElement('link'); link.rel = 'preload'; link.href = resource.url; link.as = resource.type || 'script'; // 类型如 script、image 等 document.head.appendChild(link); }); } // 示例调用 const resourcesToPreload = [ { url: '/path/to/script.js', type: 'script' }, { url: '/images/example.jpg', type: 'image' } ]; preloadWithLinkTag(resourcesToPreload); ``` 这种方法能够更精确地控制不同类型资源的行为。 --- #### 3. 结合遮罩层和进度条展示预加载状态 对于需要向用户提供视觉反馈的情况,可以在预加载过程中加入遮罩层和进度指示器。 ```javascript function startPreloader() { const overlay = document.getElementById('preloader-overlay'); // 预定义遮罩层 overlay.style.display = 'block'; let loadedCount = 0; function updateProgress(totalItems) { return () => { loadedCount++; const progressPercent = (loadedCount / totalItems * 100).toFixed(2); document.querySelector('#progress-bar').style.width = `${progressPercent}%`; if (loadedCount === totalItems) { setTimeout(() => { overlay.style.display = 'none'; }, 500); // 延迟隐藏遮罩效果 } }; } const itemsToLoad = ['/js/main.js', '/css/styles.css', '/img/logo.png']; const onCompleteCallback = updateProgress(itemsToLoad.length); itemsToLoad.forEach(item => { fetch(item) .then(onCompleteCallback) .catch(err => console.warn(`Resource failed to load: ${item}`, err)); }); } ``` 上述代码片段展示了如何结合实际逻辑与 UI 提供流畅体验[^3]。 --- #### 4. Vue 组件中的懒加载实践 如果是针对 Vue 单页应用程序(SPA),则推荐采用异步组件配合路由懒加载机制进一步增强性能表现。 ```javascript const AsyncComponent = defineAsyncComponent({ loader: () => import('./components/HeavyComponent.vue'), delay: 200, timeout: 3000, loadingComponent: LoadingSpinner, errorComponent: ErrorPlaceholder }); ``` 这种模式特别适用于大型 SPA 应用程序中按需加载模块的需求[^5]。 --- ### 注意事项 - **跨域问题**:当涉及外部域名上的静态资产时,请确认 CORS 设置允许访问。 - **优先级管理**:并非所有资源都需要立即被处理;应区分重要程度安排顺序。 - **错误恢复策略**:考虑到网络波动等因素影响下载成功率,建议设计合理的重试或降级措施。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值