解决js图片加载时出现404的问题


Posted in Javascript onNovember 30, 2020

运营网站久了之后,无法避免会出现图片404的情况,原因可能是图片文件本来就不存在或目前不存在。常见的解决方案是将404图片隐藏或者是替换为默认的图片。 

img标签事件属性

img标签可使用的时间属性有:

onabort, onbeforeunload, onblur, onchange, onclick, oncontextmenu, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, onerror, onfocus, onkeydown, onkeypress, onkeyup, onload, onmessage, onmousedown, onmousemove, onmouseover, onmouseout, onmouseup, onmousewheel, onresize, onscroll, onselect, onsubmit, onunload

img标签常用的事件如下:

onerror:图像加载过程中发生错误时被触发。
onabort:图片加载的时候,用户通过点击停止加载时触发,通常在这里触发一个提示:“图片正在加载”。
onload:当图片加载完成之后触发。

1. 对图片监听onerror事件

<img src="someimage.png" onerror="imgError(this);" /> 
 
// 原生JS: 
function imgError(image){ 
 // 隐藏图片 
 image.style.display = 'none'; 
 // 替换为默认图片 
 // document.getElementById("img").setAttribute("src", "images/demo.png"); 
} 
 
// 使用jQuery处理: 
function imgError(image){ 
 $(image).hide(); 
 // $(this).attr("src", "images/demo.png"); 
}

注意:需要将处理函数定义在head,防止图片加载出错时没有读取到处理函数

2. 使用jQuery监听error

// 通常不会再HTML里面内联js,可以使用.error对图片进行监听处理 
$('#test img').error(function() { 
 $(this).hide(); 
 // $(this).attr("src", "images/demo.png"); 
});

注意:jQuery加载需要在img前,处理函数需在img后

3. 使用函数处理

// 原生JS解决方案 
function $id(id) { 
 return !id || id.nodeType === 1 ? id : document.getElementById(id); 
} 
function isType(o, t) { 
 return (typeof o).indexOf(t.charAt(0).toLowerCase()) === 0; 
} 
 
// 主要逻辑 
function image(src, cfg) { 
 var img, prop, target; 
 cfg = cfg || (isType(src, 'o') ? src : {}); 
 
 img = $id(src); 
 if (img) { 
 src = cfg.src || img.src; 
 } else { 
 img = document.createElement('img'); 
 src = src || cfg.src; 
 } 
 
 if (!src) { 
 return null; 
 } 
 
 prop = isType(img.naturalWidth,'u') ? 'width' : 'naturalWidth'; 
 img.alt = cfg.alt || img.alt; 
 
 // Add the image and insert if requested (must be on DOM to load or 
 // pull from cache) 
 img.src = src; 
 
 target = $id(cfg.target); 
 if (target) { 
 target.insertBefore(img, $id(cfg.insertBefore) || null); 
 } 
 
 // Loaded? 
 if (img.complete) { 
 if (img[prop]) { 
 if (isType(cfg.success,'f')) { 
 cfg.success.call(img); 
 } 
 } else { 
 if (isType(cfg.failure,'f')) { 
 cfg.failure.call(img); 
 } 
 } 
 } else { 
 if (isType(cfg.success,'f')) { 
 img.onload = cfg.success; 
 } 
 if (isType(cfg.failure,'f')) { 
 img.onerror = cfg.failure; 
 } 
 } 
 
 return img; 
}

以上函数有许多用处:

1. 获取图片信息:图片是否可下载,图片宽高

image('img',{ 
 success : function () { alert(this.width + "-" + this.height); }, 
 failure : function () { alert('image 404!'); }, 
}); 
 
// 验证资源是否下载 
image('images/banner/banner_2.jpg', { 
 success : function () {console.log('sucess')}, 
 failure : function () {console.log('failure')}, 
 target : 'myContainerId', 
 insertBefore : 'someChildOfmyContainerId' 
});

2. 下载并插入图片

var report = $id('report'), 
 callback = { 
 success : function () { 
 report.innerHTML += '<p>Success - ' + this.src + ' ('+this.offsetWidth+'x'+this.offsetHeight+')</p>'; 
 }, 
 failure : function () { 
 report.innerHTML += '<p>Failure - ' + this.src + ' ('+this.offsetWidth+'x'+this.offsetHeight+')</p>'; 
 }, 
 target : 'target' 
 }; 
 
image('img', callback); 
image('images/banner/banner_2.jpg', callback);

以上就是js针对图片加载时出现404问题的解决办法,希望大家有所收获。

Javascript 相关文章推荐
js获取当前页面路径示例讲解
Jan 08 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
js清空表单数据的两种方式(遍历+reset)
Jul 18 Javascript
escape函数解决js中ajax传递中文出现乱码问题
Oct 30 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
微信小程序 实例开发总结
Apr 26 Javascript
详解ES6之async+await 同步/异步方案
Sep 19 Javascript
JS实现的JSON数组去重算法示例
Apr 11 Javascript
js实现多个倒计时并行 js拼团倒计时
Feb 25 Javascript
微信小程序 导入图标实现过程详解
Oct 11 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 Javascript
jquery实现的点击翻书效果代码
Nov 04 #Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 #Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 #Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 #Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 #Javascript
JavaScript前端开发之实现二进制读写操作
Nov 04 #Javascript
js实现二级菜单渐隐显示
Nov 03 #Javascript
You might like
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
浅谈PHP封装CURL
2019/03/06 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
lib.utf.js
2007/08/21 Javascript
Prototype Template对象 学习
2009/07/19 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
食品安全工作实施方案
2014/03/26 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
科技活动周标语
2014/10/08 职场文书
学校中秋节活动总结
2015/03/23 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python