解决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 相关文章推荐
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
Mar 14 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
微信小程序之多文件下载的简单封装示例
Jan 29 Javascript
5分钟快速掌握JS中var、let和const的异同
Sep 19 Javascript
模块化react-router配置方法详解
Jun 03 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 Javascript
Node.js API详解之 console模块用法详解
May 12 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
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
咖啡的种类和口感
2021/03/03 新手入门
将数组写入txt文件 var_export
2009/04/21 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
js function定义函数使用心得
2010/04/15 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
python中metaclass原理与用法详解
2019/06/25 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
python打包生成so文件的实现
2020/10/30 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
党务公开方案
2014/05/06 职场文书
财产分割协议书范本
2014/11/03 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
工程进度款催款函
2015/06/24 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
56句经典英文座右铭
2019/08/09 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers