解决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 相关文章推荐
改版了网上的一个js操作userdata
Apr 27 Javascript
jQuery 学习入门篇附实例代码
Mar 16 Javascript
ext 列表页面关于多行查询的办法
Mar 25 Javascript
用Javascript评估用户输入密码的强度实现代码
Nov 30 Javascript
js获取height和width的方法说明
Jan 06 Javascript
JavaScript实现瀑布流布局
Jun 28 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
Javascript单例模式的介绍和实例
Oct 08 Javascript
jquery实现多次上传同一张图片
Jan 09 Javascript
JavaScript实现简单的四则运算计算器完整实例
Apr 28 Javascript
vue better-scroll插件使用详解
Jan 25 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 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中使用Oracle数据库(3)
2006/10/09 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
php中的常用魔术方法总结
2013/08/02 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP生成plist数据的方法
2015/06/16 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
为什么是 Python -m
2020/06/19 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
英语教师求职信
2014/06/16 职场文书
保险专业求职信
2014/07/07 职场文书
授权委托书格式范文
2014/08/02 职场文书
工程部岗位职责
2015/02/10 职场文书
读书笔记格式
2015/07/02 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
mysql幻读详解实例以及解决办法
2022/06/16 MySQL