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 SchemeUniform resource identifier

 

三、实验开始                          

  本次实验将创建 img元素 并对其的 src属性 分别赋予以下内容 fsjohnhuang.png 、 :0 、 空字符串 、 空白字符串 、 //:0 、 javascript:void 0 和 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等进行实验,加上实验手段等问题,难免导致统计数据不全面,若有纰漏希望大家指正,谢谢。

时间: 2024-10-24 17:54:25

JS魔法堂:IMG元素加载行为详解的相关文章

IMG元素加载行为详解

我们了解到img元素加载失败可以作为函数异步执行的优化方案,本文打算对img元素的加载行为进行更深入的探讨. 二.资源加载的相关属性和事件   资源加载首先当然是确定资源位置的 src属性 .随之就是资源加载成功与否的 onload事件 和 onerror事件 ,对于IE5~10来说还多了一个 onreadystatechage事件 和与该事件相关联的 readyState属性 和 complete属性 .    onload事件 ,当资源加载完成并成功解析后触发(若加载的不是image/*类型

jquery ajax局部加载方法详解(实现代码)_jquery

在jquery中实现ajax加载的方法有很多种,不像以前的js的ajax只有那一种,下面我们介绍jquery ajax实现局部加载方法总结,有需要了解的朋友可参考. 例 $.ajax({ url: "hotelQuery!queryHotelByCity.action", type: "post", dataType: "html", data: "queryHotel.city="+cityobj.value+"&

Android LayoutInflater加载布局详解及实例代码

Android  LayoutInflater加载布局详解 对于有一定Android开发经验的同学来说,一定使用过LayoutInflater.inflater()来加载布局文件,但并不一定去深究过它的原理,比如 1.LayoutInflater为什么可以加载layout文件? 2.加载layout文件之后,又是怎么变成供我们使用的View的? 3.我们定义View的时候,如果需要在布局中使用,则必须实现带AttributeSet参数的构造方法,这又是为什么呢? 既然在这篇文章提出来,那说明这三

javaScript 页面自动加载事件详解

 本篇文章主要是对javaScript页面自动加载事件进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法1: 代码如下:  Window.onload=function(){    Var name=document.getElementById("name").val();//加载HTML,并且加载外部所有所有的引用文件(图片,css样式,js等) }   方法2:需要引入Jquery的 .js文件  代码如下: $(document).ready(function(){

AngularJS模板加载用法详解_AngularJS

本文实例讲述了AngularJS模板加载用法.分享给大家供大家参考,具体如下: angular模板加载 ----ng-template AngularJS作为mvc(或者说mvvm)框架,同样具备模板这一基本概念. NG加载模板的顺序为 内存加载---AJAX加载. 内存加载 如果之前使用过Bootstrap 插件的ng版,即angular-ui,就会了解到这种方式的具体应用.模板本质上是字符串,把字符串直接写入内存,加载时直接从内存获取,速度会更快,有两种方式显式启用内存加载. 通过使用 $t

Android异步加载图片详解之方式一(1)

MainActivity.java如下: package cn.ideallistview; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.

关于JSP配置文件web.xml加载顺序详解_JSP编程

一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>和<listener>两个结点. 2.紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对,并交给servletContext. 4.容器创建<listener>中的类实例,创建监听器. 二. load-on-startup 元

javaScript 页面自动加载事件详解_javascript技巧

方法1: 复制代码 代码如下:  Window.onload=function(){   Var name=document.getElementById("name").val();//加载HTML,并且加载外部所有所有的引用文件(图片,css样式,js等)} 方法2:需要引入Jquery的 .js文件 复制代码 代码如下: $(document).ready(function(){         alert("JQuery的第一个入门案例");//加载HTML

Android异步加载图片详解之方式二(2)

FileCache.java如下: package com.cn.loadImages; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Conte