解决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 fit布局使用说明
Oct 08 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
jquery隔行换色效果实现方法
Jan 15 Javascript
js实现类似菜单风格的TAB选项卡效果代码
Aug 28 Javascript
基于jQuery实现滚动切换效果
Dec 02 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
vue2 全局变量的设置方法
Mar 09 Javascript
Vue源码探究之虚拟节点的实现
Apr 17 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 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 addslashes和mysql_real_escape_string
2010/01/24 PHP
PHP校验ISBN码的函数代码
2011/01/17 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
python中执行shell的两种方法总结
2017/01/10 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
用python爬取租房网站信息的代码
2018/12/14 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
二年级体育教学反思
2014/01/15 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
公证委托书标准格式
2014/09/11 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python