Darth_EF 发表于 2021-1-27 19:24:33

怎么让img元素的404error不在控制台里出现

如题 我做了类似个文件查找的东西,查某个音乐文件的根目录下面有没有cover.jpg或cover.png。
由于不知道图片文件的后缀名究竟是哪个所以总会有个404的错误出现,控制台里一片都是红的。
不想用清屏指令,怕把需要的东西清了。
请问该怎么让图片的404错误不在控制台出现呢?

wp231957 发表于 2021-1-28 07:48:36

控制台的错误信息你还能控制??

kogawananari 发表于 2021-1-28 21:41:41

筛选掉就好了

不二如是 发表于 2025-9-18 08:48:58

关键是别直接把 <img> 指到一个可能不存在的地址。浏览器对 <img> 的 404 会直接在控制台打红字;

但如果你先用 fetch() 探测,404 只是一个“正常的失败”,不会红。

探测到存在后再把 img.src 设过去,就不会有 404 噪音了。

async function pickExisting(urls) {
// 并发探测:谁先返回 OK 就用谁
const ctrls = [];
const probes = urls.map(url => new Promise(async (resolve, reject) => {
    const ctrl = new AbortController();
    ctrls.push(ctrl);
    try {
      // 先 HEAD,部分静态服务器不支持 HEAD 就会 405
      let res = await fetch(url, { method: 'HEAD', cache: 'no-store', signal: ctrl.signal });
      if (!res.ok && (res.status === 405 || res.status === 501)) {
      // 回退到 GET(仍然不会在控制台打红字)
      res = await fetch(url, { method: 'GET', cache: 'no-store', signal: ctrl.signal });
      }
      if (res.ok) {
      // 找到后,取消其他请求
      ctrls.forEach(c => { if (c !== ctrl) c.abort(); });
      resolve(url);
      } else {
      reject(new Error(`${url} -> ${res.status}`));
      }
    } catch (e) {
      reject(e);
    }
}));

// 谁先成功用谁;都失败就抛
return Promise.any(probes);
}

async function setCoverImage(imgEl, baseDir) {
const candidates = [
    `${baseDir}/cover.jpg`,
    `${baseDir}/cover.jpeg`,
    `${baseDir}/cover.png`,
    `${baseDir}/cover.webp`
];
try {
    const okUrl = await pickExisting(candidates);
    imgEl.src = okUrl;                  // 只在确认存在后再赋值,不会触发 404 日志
} catch {
    imgEl.src = '/images/placeholder.svg'; // 可选:兜底图
}
}

// 用法
const img = document.querySelector('#album-cover');
setCoverImage(img, '/music/abc'); // 这里的 baseDir 改成你的根目录
页: [1]
查看完整版本: 怎么让img元素的404error不在控制台里出现