解决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 DOM编程实例(智播客学习)
Nov 23 Javascript
提高javascript效率 一次判断,而不要次次判断
Mar 30 Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
May 17 Javascript
jQuery中$.fn的用法示例介绍
Nov 05 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
Jun 18 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
Apr 29 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
基于javascript实现移动端轮播图效果
Dec 21 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学习之 循环结构实现代码
2011/06/09 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
angular 服务随记小结
2019/05/06 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
浅析Python中的join()方法的使用
2015/05/19 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
远程调用的原理
2014/07/05 面试题
党委书记岗位职责
2013/11/24 职场文书
学校岗位设置方案
2014/01/16 职场文书
运动会广播稿500字
2014/01/28 职场文书
房地产项目策划书
2014/02/05 职场文书
工程师岗位职责规定
2014/02/26 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书