问题的引出是这样的,在一个项目中有大量的页面主体是table做数据展示,所以就封装了一个table的组件,提供动态渲染的方案。有个问题是数据类型中有图片,对于图片的加载失败我们需要做容错。一般我们的思路都是对img绑定error事件,替换该图片为一个默认的图片。但是error事件是不会冒泡的,我们渲染是动态的,我们不能delegate事件到body上。如果将处理写在js里,那么每次渲染的时候都要去给图片绑定error事件,写在模板里拼接(内联事件)又会很麻烦(我采取的方案是用户编写基本th,td模板,所以需要使用者拼接,思考过走配置的方法初始化table这个问题可以忽略。。。)

博主也是个纠结的人,有没有更好的解决方案呢?下面介绍一个css黑魔法,用伪元素对图片加载失败做处理。

什么是伪元素?科普链接:http://www.w3school.com.cn/css/css_pseudo_elements.asp

css知识扎实的人肯定会有个疑问,img是可替换元素(科普:http://www.cnblogs.com/wkylin/archive/2011/05/12/2044328.html),是不能应用伪元素的啊?!

对,没错,是不能用,至于黑魔法嘛~img不能用,但是加载失败了能不能用呢?

哈哈哈,我们在chrome下测试看下:

有的!!!那我们后面可做的事情就思路了啊,哈哈哈

后面引入我写的一个demo 点击查看

正常的图片:

容错后的:

至于为什么图片加载失败后,会可以使用伪元素,我最开始的理解大概是这样的。当加载成功的时候img是没有任何子节点的,befor和after是在元素的内容前后插入内容。但当图片加载失败之后,是不是把替代文本作为字内容了呢?我用:first-child伪类做测试效果并不是我想的那个样子。但是,伪元素不是dom上的,是在css解析中存在的,img加载失败后,会有替换的展现内容比如alt文字展示,这样我们可以通过img{}来指定替换内容的样式,这也是css解析,那可能理解就是在css中会认为替换内容(如alt的信息)是img的内容,这样after可插入进来就可以理解了。

如果大家有了解原理,可联系我,谢谢

兼容性:

在ios的Safari和uc上不能实现,so 这个方案还是要考虑下的

╮(╯▽╰)╭,博主也是纠结啊,如果有更好的方案可以和我联系

额,不对,跑题了,我们今天是介绍这个伪元素的黑魔法的,哈哈哈~

伪元素黑魔法:一个替代onerror解决图片加载失败的方案的更多相关文章

  1. 微信小程序 图片加载失败处理方案

    小程序端展示网络资源图片可能会失败,下面介绍一种自己的处理方法 1. js文件中判断图片 url 是否存在,存在则正常显示,不存在则替换url为本地默认图片 2. 当图片 url 存在,但是加载失败时 ...

  2. SDWebImage使用——一个可管理远程图片加载的类库

    SDWebImage使用——一个可管理远程图片加载的类库     SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage托管在github上.https://github.co ...

  3. 当h5页面图片加载失败后,给定一个默认图

    本文主要讨论页面中图片加载失败后替换默认图片的几种方式 重点来了:一定要记住error事件不冒泡. 相关的知识点:jquery的ready方法.$("img").error().i ...

  4. 当图片加载失败时更换图片, Firefox onerror 报错

    当图片加载失败时更换图片. <!DOCTYPE html> <meta charset="UTF-8"> <img src="http:// ...

  5. js 图片加载失败处理方法

    在项目中不可避免会用到图片,尤其是列表,有时候图片会加载失败:这样就会显示一个很难看的坏图片缩略图:下面介绍两种方法,解决这个问题: 1.如果在你的项目中有引入jQuery插件,你可以使用error( ...

  6. AngularJS中如果ng-src 图片加载失败怎么办

    我们知道AngularJS加载图片的方法是用技术分享加ng-src标签,例如: <img ng-src="{{currentUrl}}"/> 其中currentUrl为 ...

  7. WebForm、MVC图片加载失败处理

    还是那个该死的WebFrom项目,部分功能替换为MVC后感觉好多了,但是WebForm.MVC都有图片加载失败时显示提示图片的需求,并且统一在js中处理.问题来了,js中图片路径怎么处理呢?现场有可能 ...

  8. JavaScript-onerror事件:图片加载失败后不显示

    HTML: <img src="http://www.mazey.net/images/upload/image/20170518/1495122198180663.gif" ...

  9. js img图片加载失败,重新加载+断网检查

    我们常常会遇到img加载图片的时候因为网络问题或者图片过大导致图片加载失败的问题,页面就因为这张蹦掉的图变得不美观.所以我们需要图片加载失败的时候重新加载图片,前端图片加载优化 //js方法定义 fu ...

随机推荐

  1. 英文构词法 —— ant、ent 后缀

    1. -ant:--人 accountant:会计, account(ac+count):计数,账户: assistant:助手: assist:帮助 descendant:后裔: descend:下 ...

  2. 【33.00%】【vijos P1002】过河

    描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...

  3. Project Euler:Problem 39 Integer right triangles

    If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact ...

  4. winform - FixedDialog

    可以设置form的属性: 窗口样式: MaximizeBox  :  false       去掉 方法 按钮 MinimizeBox  :  false       去掉 缩小到任务栏 的按钮 禁止 ...

  5. Matlab使用鼠标标注图像位置并返回坐标(标注图像ROI)

    代码 function ROI=LabelBox(filename) Mat=imread(filename); imshow(Mat); mouse=imrect; pos=getPosition( ...

  6. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  7. Java并发编程:synchronized和Lock

    转自  :   http://www.tuicool.com/articles/qYFzUjf

  8. 使用CMD实现批量重命名[转]

    关键字:cmd DOS 批处理 批量 重命名 作者:lifesinger地址:http://www.cnblogs.com/txw1958/archive/2012/12/24/cmd-batch-r ...

  9. Openstack+Kubernetes+Docker微服务

    Openstack+Kubernetes+Docker微服务 渐入佳境,我们开始比较具体的工作,由于Docker是一个基础组件,所以本文的主题是Docker和Registry2. 底层系统基于Cent ...

  10. arcserver开发小结(三)

    一.关于网络数据集的制作 由于要做实现网络分析的功能,而手中却没有网络数据集,关于网络数据集的制作,网上也有不少的资料.我参考的是ESRI为我们提供的帮助文档(Network_Analyst_Tuto ...