解决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入门教程(6) Window窗口对象
Jan 31 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 Javascript
jquery easyui DataGrid简单示例
Jan 23 Javascript
详解vue与后端数据交互(ajax):vue-resource
Mar 16 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 Javascript
js图片无缝滚动插件使用详解
May 26 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
出国英文推荐信
2014/05/10 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
独生子女证明范本
2015/06/19 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
python用tkinter开发的扫雷游戏
2021/06/01 Python
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS