解决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 相关文章推荐
javascript 函数式编程
Aug 16 Javascript
用jquery生成二级菜单的实例代码
Jun 24 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
JS基于Ajax实现的网页Loading效果代码
Oct 27 Javascript
基于JavaScript FileReader上传图片显示本地链接
May 27 Javascript
js date 格式化
Feb 15 Javascript
bootstrap IE8 兼容性处理
Mar 22 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 19 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 Javascript
JavaScript中数组去重的5种方法
Jul 04 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
laravel 数据验证规则详解
2019/10/23 PHP
js判断url是否有效的两种方法
2014/03/04 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
django项目搭建与Session使用详解
2018/10/10 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python偏函数实现原理及应用
2020/11/20 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
数控加工专业毕业生自荐信
2013/09/27 职场文书
高级工程师岗位职责
2013/12/15 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
学校门卫岗位职责
2014/03/16 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
医院见习总结
2015/06/24 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
方法汇总:Python 安装第三方库常用
2022/04/26 Python