解决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 相关文章推荐
学习ExtJS Panel常用方法
Oct 07 Javascript
Jquery练习之表单验证实现代码
Dec 14 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 Javascript
javascript文本框内输入文字倒计数的方法
Feb 24 Javascript
JavaScript 函数节流详解及方法总结
Feb 09 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
将angular.js项目整合到.net mvc中的方法详解
Jun 29 Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 Javascript
js实现简单音乐播放器
Jun 30 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
react基本安装与测试示例
2020/04/27 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python中的装饰器用法详解
2015/01/14 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
质检员的岗位职责
2013/11/15 职场文书
超市中秋节促销方案
2014/03/21 职场文书
学校中秋节活动总结
2015/03/23 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书