以全局监听的方式处理img的error事件
http://www.ovaldi.org/2015/09/11/%E4%BB%A5%E5%85%A8%E5%B1%80%E7%9B%91%E5%90%AC%E7%9A%84%E6%96%B9%E5%BC%8F%E5%A4%84%E7%90%86img%E7%9A%84error%E4%BA%8B%E4%BB%B6/
在开发一些电商页面时,往往会有大量的商品图片信息,当图片加载失败时,我们希望以一种更加友好的的方式改善用户体验:比如,换成一张友好的提示图片。
img标签在加载失败时,会触发error事件,所以,我们可以这么做
无法监听到动态产生的img标签然而,这种处理方法存在两个问题:
- 给每一个img元素都绑定事件处理函数带来的页面性能损耗
那么,如何解决上面的问题呢?也许你会说利用事件冒泡的机制来监听,可惜error事件并不会冒泡!
(事实上,在W3C的DOM Level 2 Events中规定,error事件是会冒泡的,而在DOM Level 3 Events中规定,error事件是不会冒泡的。)
要解决上述两个问题,我们需要先了解一下DOM事件发生的三个阶段:
- 捕获阶段: 从根节点开始顺序而下,检测每个节点是否注册了事件处理函数。在标准浏览器中,我们可以通过指定addEventListener的第三个参数useCapture为true,以使事件处理函数在该阶段运行。(低版本IE中无法指定事件处理函数在该阶段执行)
- 目标阶段: 触发在目标对象本身注册的事件处理函数,也称正常事件派发阶段。
- 冒泡阶段: 从目标节点到根节点,检测每个节点是否注册了事件处理函数。在标准浏览器中,我们可以通过指定addEventListener的第三个参数useCapture为true,以使事件处理函数在该阶段运行。
通过了解以上三个阶段,我们就可以使用如下代码解决:
需要注意的是,由于低版本IE中attachEvent方法无法指定事件处理函数在捕获阶段执行,所以,该方案在低版本IE中不能适用。
以全局监听的方式处理img的error事件的更多相关文章
- javaweb项目的全局监听配置
在项目中有时候会遇到全局监听的需求,而全局性的监听该如何配置,代码如下: package com.demo.listener; import javax.servlet.ServletContextE ...
- js添加事件监听的方式与this
js添加事件监听与this js添加事件监听的方式与this 在标签中调用自定义函数 DOM0级事件处理程序 DOM2级事件处理程序 this 代表谁? js添加事件监听的方式与this <di ...
- Android 另类方法监听软键盘的弹出收起事件
http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...
- VUE 全局监听sessionStorage变化
在做项目的时候,可能需要在其他模块获取推送的信息或者变量,但是数据量或者说数目少,而且项目中也没有引用VUEX,那么可以下手的方法之一也就是sessionStorage类的浏览器存储了. 首先在全局的 ...
- SparkListener监听使用方式及自定义的事件处理动作
本文针对spark 2.0+版本 概述 spark 提供了一系列整个任务生命周期中各个阶段变化的事件监听机制,通过这一机制可以在任务的各个阶段做一些自定义的各种动作.SparkListener便是这些 ...
- OnTouchListener事件监听实现方式之GestureDetector
当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等. 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouc ...
- 全局监听SCREEN_ON和SCREEN_OFF的替代方法--监听屏幕解锁事件
在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使 ...
- angular 全局 监听路由变化
app.run(['$rootScope', '$location', function($rootScope, $location) { /* 监听路由的状态变化 */ $rootScope.$on ...
- 监听文本框输入oninput和onpropertychange事件
前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onkeydow ...
随机推荐
- iOS开发小技巧--图片的圆角处理
图片圆角处理方案一: 缺点是图片多了感觉卡 设置图层的CornerRadius属性 -- 设置了圆角后,运行程序没有反应,多半是没有设置下面这句:让内容遵循设置的边缘 masksToBounds = ...
- NPOI使用手册[转]
NPOI使用手册 目录 1.认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1创建Workbook和Sheet 2.1.2创建DocumentSummaryInforma ...
- Elasticsearch 1.X 版本Java插件开发
接上一篇<Elasticsearch 2.X 版本Java插件开发简述> 开发1.X版本elasticsearch java插件与2.X版本有一些不同,同时在安装部署上也有些不同,主要区别 ...
- Eclipse-导入maven项目
在Eclipse project explorer中右击,在弹出框中选择import,得到如下图所示: 选择Existing Maven Projects,并点击Next,得到如下图所示对话框: 选择 ...
- Android进程回收机制LMK(Low Memory Killer)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...
- 【codevs1012】最大公约数和最小公倍数
题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整 ...
- 二叉树遍历Java实现
[仅贴代码及测试结果] -------------------BinaryTree.java------------------------------ class Tree<E>{ E ...
- 【BZOJ-1974】auction代码拍卖会 DP + 排列组合
1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 305 Solved: 122[Submit ...
- NuGet多个项目依赖的公共组件如何打包
会有这样一种情况:在同一个解决方案下面,类库A是独立的,类库B是依赖于类库A的:类似这样: 所以在使用类库B时必须引入类库A的东西,这时如果作为nuget包打包发布,有如下的解决思路: 1.在整个解决 ...
- dedecms /include/uploadsafe.inc.php SQL Injection Via Local Variable Overriding Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 . dedecms原生提供一个"本地变量注册"的模拟 ...