一、前言                            

在《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 SchemeUniform 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元素加载行为详解的更多相关文章

  1. C编译器、链接器、加载器详解

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  2. jquery插件图片延时加载实例详解

    效果预览:http://keleyi.com/keleyi/phtml/image/index.htm 使用方法:1.导入JS插件 <script src="http://keleyi ...

  3. web.xml加载顺序详解

    一. 1.启动tomcat启动web项目,首先读取web.xml文件中<context-param>和<listener> 2.容器创建一个ServletContext(ser ...

  4. openlayers 加载瓦片详解 一

    在这先说点题外话,本人在研究webgl 三维球过程中惊人发现,openlayers 的开发人员也在研究webgl并经证实他们也正在研发基于 webgl的三维gis开源平台,这可能是首个开源的三维平台, ...

  5. Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解

    前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式(Res ...

  6. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  7. Javascript在浏览器中的加载顺序详解!

    现在前端用javascript用的比较多,当然真心的说这个语言是一个非常业余的语言,但是用的人很多,所以也比较火.今天想完成一个javascript外部文件自动加载的设计(类似于java或者php的i ...

  8. servlet与filter的加载顺序详解

     项目:3个filter,3个servlet,匹配的url路径/hello. 情况1:servlet没加<load-on-startup></load-on-startup>情 ...

  9. mybatis加载配置文件详解

    spring整合Mybatis后,SqlSessionFactory的创建由spring进行了代理,以下是SqlSessionFactory创建的流程 SqlSessionFactoryBean: p ...

随机推荐

  1. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5932cde42f1f03de29b1 本文来源: 微信客户端开发团队 ...

  2. objective-c(继承)

    objective-c的继承给出基础例子及注意点: 定义并实现基类ClassA #import <Foundation/Foundation.h> @interface ClassA : ...

  3. Asp.Net MVC中使用ACE模板之Jqgrid

    第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为后台开发节省了大量时间. 发现虽然不是完美,整体效果还是不 ...

  4. Unity3D使用经验总结 缺点篇

    不论是从官方手册,还是各种第三方教程,几乎涉及到的,都是讲如何使用U3D,以及U3D的优点. 虽然我是用的一个让步语气,但请不要否认U3D的这些优点,它们的确存在. 但对于一个引擎的特性来说,优点与缺 ...

  5. 用DirectX实现魔方(三)视角变换及缩放(附源码)

    在本系列第一篇介绍过鼠标按键的功能,如下. 左键拖拽 - 旋转魔方 右键拖拽 - 变换视角 滚轮 - 缩放魔方 今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现M ...

  6. 翻译:AKKA笔记 - 介绍Actors

    任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...

  7. 230行实现一个简单的MVVM

    作者:mirone链接:https://zhuanlan.zhihu.com/p/24451202来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. MVVM这两年在前端届 ...

  8. java-面向对象练习2

    1.按要求编写Java应用程序: (1)编写西游记人物类(XiYouJiRenWu) 其中属性有:身高(height),名字(name),武器(weapon) 方法有:显示名字(printName), ...

  9. NodeJS系列~第二个小例子,解决中文乱码的问题

    返回目录 为了使页面支持的字符更多,所以编码使用UTF-8,注意,你的原js文件的编码也要是utf-8的,可以通过记事本进行编码的修改

  10. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...