img标签的onerror事件(应用以及注意事项)
情景:img标签中的src图片加载失败,原来的图片位置会出现一个碎片图标,用户体验会下降。使用img的onerror事件,当图片不存在时,将触发 onerror,而 onerror 中又为 img 指定一个logoError.png 图片。也就是说图片存在则显示logo.png,图片不存在将显示 logoError.png。解决方法一、图片路径错误使用默认图片站位:使用1:html开发中&...
建议只用懒加载 :https://www.npmjs.com/package/vue-lazyload
npm install vue-lazyload --save-dev
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
loading: require('img/loading.png'),//加载中图片,一定要有,不然会一直重复加载占位图
error: require('img/error.png') //加载失败图片});
img:
<img v-lazy="'/static/img/' + item.productImage" :key="'/static/img/' + item.productImage"> //将 :src 属性直接改为v-lazy, :key是为了防止刷新页面或图片更改时图片不更新
背景图:
<div style="width:100px;height:100px;" v-lazy:background-image="{src: item.imgpath}"></div>
v-html,如从后台获取的富文本字符串中图片:(用replace将src替换为data-src)
<div v-lazy-container="{ selector: 'img', error: 'xxx.jpg', loading: 'xxx.jpg' }">
<img data-src="//domain.com/img1.jpg">
<img data-src="//domain.com/img2.jpg">
<img data-src="//domain.com/img3.jpg">
</div>
情景:img标签中的src图片加载失败,原来的图片位置会出现一个碎片图标,用户体验会下降。
使用img的onerror事件,当图片不存在时,将触发 onerror,而 onerror 中又为 img 指定一个logoError.png 图片。也就是说图片存在则显示logo.png,图片不存在将显示 logoError.png。
解决方法一、图片路径错误使用默认图片站位:
使用1:html开发中
<img src="images/logo.png" οnerrοr="javascript:this.src='images/logoError.png';">
//控制它不循环,代码如下:
<img src="images/logo.png" οnerrοr="nofind();" />
function nofind(){
var img=event.srcElement;
img.src="images/logoError.png";
img.οnerrοr=null; 控制不要一直跳动
}
如果logoError.png 也不存在,则继续触发 onerror,导致循环,故会出现打开网页时提示 Stack overflow at line: 0错误。特别说明:如果图片存在,但网络很不通畅,也可能触发 onerror。
使用2:vue开发中,this不在是元素本身了
//当默认图也不存在时,图片加载死循环。
<img class=avator' :src="data.picture" :onerror="defaultImg">
data(){
return {
defaultImg: 'this.src="' + require('../../assets/images/moren.png') + '"'
}
}
//不建议
<image :src="item.specMainPicture | filterImgUrl" @error="imageError(index)"></image>
imageError: function(index) {
this.gList[index].Picture = this.ImgUrl+"/static/category/ blockimg.png";
},
//建议
< img src=“123” @error=“defImg()” />
defaultImg: require("./img/defPic.png")
import defaultImg from './img/defPic.png'
defImg(){
let img = event.srcElement; //当前元素
img.src = this.defaultImg;
img.onerror = null; //防止闪图
}
使用3:可以给img标签加背景图片,代码如下:
.headLogo img{
display: block;
width: 270px;
height: 60px;
background: url(../images/logo.png) no-repeat 0 0;
margin: 25px 0;
}
左上角任然有碎片图标,还需借用img标签的onerror事件和javascript(参考上文), 在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。可以使用一张提示错误的图片代替显示不了的图片
使用4:大招 通过vue自定义指令
//全局注册自定义指令,用于判断当前图片是否能够加载成功,可以加载成功则赋值为img的src属性,否则使用默认图片
Vue.directive('real-img', async function (el, binding) {//指令名称为:real-img
let imgURL = binding.value;//获取图片地址
if (imgURL) {
let exist = await imageIsExist(imgURL);
if (exist) {
el.setAttribute('src', imgURL);
}
}
})
/**
* 检测图片是否存在
* @param url
*/
let imageIsExist = function(url) {
return new Promise((resolve) => {
var img = new Image();
img.onload = function () {
if (this.complete == true){
resolve(true);
img = null;
}
}
img.onerror = function () {
resolve(false);
img = null;
}
img.src = url;
})
}
<!--v-real-img 就是刚刚定义的指令,绑定的为真实要显示的图片地址。src为默认图片地址-->
<img src="images/logoError.png" v-real-img="images/logo.png">
解决方法二、图片展示不出来,删除图片不展示它:
< img src=“123” :οnerrοr=“defaultImg” />
默认图地址
defaultImg: ‘this.remove()’
因为错误图片在各个浏览器失败的样式都一样,所以地址错误时,直接删除img标签
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)