解决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使用手册之 事件处理
Mar 24 Javascript
javascript两段代码,两个小技巧
Feb 04 Javascript
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
Nov 21 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
js遍历子节点子元素附属性及方法
Aug 19 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
Jan 26 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
Mar 01 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 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来处理多个提交任务
2006/10/09 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
lib.utf.js
2007/08/21 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
详解Python中expandtabs()方法的使用
2015/05/18 Python
python处理二进制数据的方法
2015/06/03 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python骚操作之动态定义函数
2019/03/26 Python
python程序变成软件的实操方法
2019/06/24 Python
Django REST framework 视图和路由详解
2019/07/19 Python
python中class的定义及使用教程
2019/09/18 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
日化店促销方案
2014/03/26 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
自荐信格式模板
2015/03/27 职场文书
创业计划书之酒厂
2019/10/14 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
Python数据分析之pandas读取数据
2021/06/02 Python
零基础学java之循环语句的使用
2022/04/10 Java/Android