JS魔法堂:IMG元素加载行为详解
一、前言
在《JS魔法堂:jsDeferred源码剖析》中我们了解到img元素加载失败可以作为函数异步执行的优化方案,本文打算对img元素的加载行为进行更深入的探讨。
二、资源加载的相关属性和事件
资源加载首先当然是确定资源位置的 src属性 、随之就是资源加载成功与否的 onload事件 和 onerror事件 ,对于IE5~10来说还多了一个 onreadystatechage事件 和与该事件相关联的 readyState属性 和 complete属性 。
onload事件 ,当资源加载完成并成功解析后触发(若加载的不是image/*类型的资源,则解析失败)。
onerror事件 ,当找不到资源或解析失败后触发。
onreadystatechange事件 ,在onload事件后触发。
readyState属性 ,用于表示IMG元素当前的资源装载状态,默认值为"uninitialized",onload事件触发后变为"complete"(onload事件处理函数运行时,readyState依然为"uninitialized")。
complete属性 ,用于表示IMG元素的资源是否成功解析。默认为false,,onload事件触发后变为true(onload事件处理函数运行时,readyState依然为false)。
src属性 ,用于指定资源位置URI。常见的URI格式为 http://..... 、 https://... 、 javascript:... 和 data:image/*,... 。而不同的浏览器对不同的URI支持程度和行为均有所差异。关于URI的资讯可以参考:URI Scheme、Uniform resource identifier。
三、实验开始
本次实验将创建 img元素 并对其的 src属性 分别赋予以下内容 fsjohnhuang.png 、 : 、 空字符串 、 空白字符串 、 和 data:image/png,foo ,并订阅img元素的onload和onerror事件,IE5~10下还订阅了onreadystatechange事件,统计整理其在IE5~11、Chrome和FF下的行为特点和事件响应延时。具体实验统计如下:
测试环境:
1.测试页面地址为http://localhost:9000/test.html
2. 图片fsjohnhuang.png的大小为12KB
符号说明:
N/A 表示该列事件不触发。
| src属性值 | 备注 | Chrome | FireFox | IE5~11 | |||||||
| onload事件 | onerror事件 | 备注 | onload事件 | onerror事件 | 备注 | onload事件 | onerror事件 |
IE5~10 on ready state change |
备注 | ||
| fsjohnhuang.png |
有效URI, URI自动补全为 http://localhost :9000/fsjohnhu ang.png |
首次请求延时为2~5ms | N/A |
1.发起资源请求; 2.由于对资源进行缓存,后续对同一资源的请求,延时为0~1ms |
首次请求延时为4~10ms | N/A |
1.发起资源请求; 2.由于对资源进行缓存,后续对同一资源的请求,延时为0~1ms |
首次请求延时为3~9ms | N/A | 发生在onload事件之后 |
1.发起资源请求; 2.由于对资源进行缓存,后续对同一资源的请求,延时为0~1ms |
| :0 |
无效URI, URI自动补全为http://localhost :9000/:0 若IMG元素 在渲染树中, 则会显示加载 失败的示意图。 |
N/A | 延时为5~300+ms | 1.发起资源请求 | N/A | 延时为16~60ms | 1.发起资源请求 | N/A | 首次请求延时为16ms左右 | N/A |
1.发起资源请求; 2.由于对资源进行缓存,后续对同一资源的请求,延时为0~1ms |
| 空字符串,"" | 无效URI | N/A | 延时为0~1ms |
1.不发起资源请求; 2. 若IMG元素在渲染树中,不显示加载失败的示意图。 |
N/A | N/A |
1.不发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 延时为0~1ms | N/A |
1.不发起资源请求; 2. 若IMG元素在渲染树中,不显示加载失败的示意图。 |
| 空白字符串," " | 无效URI | N/A | 延时为0~1ms |
1.不发起资源请求; 2. 若IMG元素在渲染树中,不显示加载失败的示意图。 |
N/A | 延时为16~60ms |
1.发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 首次延时为14ms左右 | N/A |
1.发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图; 3. 由于对资源进行缓存,后续对同一资源的请求,延时为0~1ms |
| //:0 | 无效URI,会自动补全为http://:0/ | N/A | 延时为0~1ms |
1.不发起资源请求; 2. 若IMG元素在渲染树中,不显示加载失败的示意图。 |
N/A | 延时为0~1ms |
1.不发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 延时为0~1ms | N/A |
1.发起资源请求,但会被浏览器取消掉(No Server Hits); 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
| javascript:void 0 | 无效的JavaScript URI Scheme | N/A | 延时为1~2ms |
1.发起资源请求,但会被浏览器取消掉(No Server Hits); 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 延时为1~2ms |
1.发起资源请求,但会被浏览器取消掉(No Server Hits); 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | N/A | N/A |
1.通过JS执行img.src= "javascript:void 0"会报"拒绝访问"的异常。假如通过$.html()或静态html方式设置src为javascript:void 0,则不会报该异常。 |
| data:image/png,f |
无效的Data URI Scheme |
N/A | 延时0~1ms |
1.不会发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 延时为1~2ms |
1.不会发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
N/A | 延时0~1ms | N/A |
1.不会发起资源请求; 2. 若IMG元素在渲染树中,显示加载失败的示意图。 |
由上述统计数据可知,在Chrome、FF和IE中行为比较同一的是加载无效DataURI Scheme。延时也比较短且稳定。因此jsDeffered采用此方式来为异步执行提速!
四、总结
这里仅仅对IMG元素加载http、javascript和data的URI Scheme等进行实验,加上实验手段等问题,难免导致统计数据不全面,若有纰漏希望大家指正,谢谢。
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4148933.html ^_^肥子John
五、参考
http://www.w3help.org/zh-cn/causes/BX9021
http://stackoverflow.com/questions/5775469/whats-the-valid-way-to-include-an-image-with-no-src
JS魔法堂:IMG元素加载行为详解的更多相关文章
- C编译器、链接器、加载器详解
摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...
- jquery插件图片延时加载实例详解
效果预览:http://keleyi.com/keleyi/phtml/image/index.htm 使用方法:1.导入JS插件 <script src="http://keleyi ...
- web.xml加载顺序详解
一. 1.启动tomcat启动web项目,首先读取web.xml文件中<context-param>和<listener> 2.容器创建一个ServletContext(ser ...
- openlayers 加载瓦片详解 一
在这先说点题外话,本人在研究webgl 三维球过程中惊人发现,openlayers 的开发人员也在研究webgl并经证实他们也正在研发基于 webgl的三维gis开源平台,这可能是首个开源的三维平台, ...
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式(Res ...
- Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Javascript在浏览器中的加载顺序详解!
现在前端用javascript用的比较多,当然真心的说这个语言是一个非常业余的语言,但是用的人很多,所以也比较火.今天想完成一个javascript外部文件自动加载的设计(类似于java或者php的i ...
- servlet与filter的加载顺序详解
项目:3个filter,3个servlet,匹配的url路径/hello. 情况1:servlet没加<load-on-startup></load-on-startup>情 ...
- mybatis加载配置文件详解
spring整合Mybatis后,SqlSessionFactory的创建由spring进行了代理,以下是SqlSessionFactory创建的流程 SqlSessionFactoryBean: p ...
随机推荐
- ENode 1.0 - 消息队列的设计思路
开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...
- AndroidPn源码分析(一)
好了,开始研究源码了.目前对androidpn,只限于使用过它,跑了一下demo.现在开始研究一下源码. (一)入口 当服务器端启动的时候,控制台会打印一些log,除了spring和hibernate ...
- .net开发笔记(十六) 对前部分文章的一些补充和总结
补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...
- DOM+CSS3实现小游戏SwingCopters
前些日子看到了一则新闻,flappybird原作者将携新游戏SwingCopters来袭,准备再靠这款姊妹篇游戏引爆大众眼球.就是下面这个小游戏: 前者的传奇故事大家都有耳闻,至于这第二个游戏能否更加 ...
- [硬件项目] 1、汽车倒车雷达设计——基于API8108A芯片简易智能语音模块的设计与实现
前言 汽车倒车防碰撞系统是一种辅助汽车泊车装置.低配的由超声波收发电路.回波放大电路.语音提示电路.数码显示.报警及温度补偿电路组成,高配的有时会带有后视视频系统.[1] 一.工作原理 如下 ...
- Lucene系列-分析器
分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...
- Java mac 上编写Java代码
看视频学JAVA,不想下载 notepad++之类的,虽然知道mac有内嵌的JAVA sdk ,但是还是不知道怎么编写,今天终于编写了我的第一个JAVA程序,还是以 Hello World 开始吧 1 ...
- lua的io操作文档
2014-09-16~15:26:35 I/O库提供两种不同的方式进行文件处理1.io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述 io表同样提供三种预 ...
- Atitit 理解Monad attilax总结
Atitit 理解Monad attilax总结 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1 那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出 ...
- Java六大问题你都懂了吗?
这些问题对于认真学习java的人都要必知的,当然如果你只是初学者就没必要那么严格了,那如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列. 一.到底要怎么样初始化! 本问题讨论 ...