解决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判断用户浏览器插件安装情况的代码
Jan 01 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
AngularJS表单提交实例详解
Feb 18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
Oct 10 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
Vue项目安装插件并保存
Jan 28 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
js 实现ajax发送步骤过程详解
Jul 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发送与接收流文件的方法
2015/02/11 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
简单介绍Python中的len()函数的使用
2015/04/07 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
Python进度条的制作代码实例
2019/08/31 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
大学新生欢迎词
2014/01/10 职场文书
检查接待方案
2014/02/27 职场文书
英语故事演讲稿
2014/04/29 职场文书
环保倡议书300字
2014/05/15 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
社区服务理念口号
2015/12/25 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Python借助with语句实现代码段只执行有限次
2022/03/23 Python