onreadystatechange和onload区别分析

 

script加载

IE的script 元素只支持onreadystatechange事件,不支持onload事件。

FireFox,Opera, Chorme, IE11+ 和Safari3+的script 元素不支持onreadystatechange事件,只支持onload事件。

如果要在一个<script src="xx.js"> 加载完成执行一个操作,FF使用onload事件就行了,IE下则要结合onreadystatechange事件和this.readyState

以下是IE的一个例子:

1
<script type="text/javascript" src="xx.xx" onreadstatechange="if(this.readyState=='load') alert('loaded');"></script>

this.readyState的值为'loaded'或者'complete'都可以表示这个script已经加载完成.

【Firefox, Opera, Chorme, IE11+ 和Safari3+会在<script>节点接收完成之后发出一个load 事件。你可以监听这一事件,以得到脚本准备好的通知】

【Internet Explorer(IE10及以下版本)支持另一种实现方式,它发出一个readystatechange事件。<script>元素有一个readyState属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值】

微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。Internet Explorer 对这两个readyState值所表示的最终状态并不一致,有时<script>元素会得到“loaded”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。最安全的办法就是在readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除readystatechange事件句柄(保证事件不会被处理两次)

var script = document.createElement("script")
script.type = "text/javascript";
//Internet Explorer
script.onreadystatechange = function(){
    if (script.readyState == "loaded" || script.readyState == "complete"){
        script.onreadystatechange = null;
        alert("Script loaded.");
    }
};
script.src = "file1.js";
document.getElementsByTagName_r("head")[0].appendChild(script);

如何结合IE和FF等的区别?参考一下jquery的源码:

var script = document.createElement('script');
script.src="xx.js";
script.onload = script.onreadystatechange = function(){
    if(    ! this.readyState     //这是FF的判断语句,因为ff下没有readyState这个值,IE的readyState肯定有值
                || this.readyState=='loaded' || this.readyState=='complete'   // 这是IE的判断语句
    ){
         alert('loaded');
    }

};

上面是根据dom加载完去判断,如果根据dom未加载完去判断如下:

var script = document.createElement('script');
script.src="xx.js";
script.onload = script.onreadystatechange = function(){
    if( this.readyState && this.readyState=='loading' ){
         return
    }
  alert('loaded'
};

大多数情况下,你希望调用一个函数就可以实现JavaScript 文件的动态加载。下面的函数封装了标准实现和IE 实现所需的功能:

function loadScript(url, callback){
    var script = document.createElement ("script")
    script.type = "text/javascript";
    if (script.readyState){ //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" || script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else { //Others
        script.onload = function(){
            callback();
        };
    }
    script.src = url;
    document.getElementsByTagName_r("head")[0].appendChild(script);
}

document加载

一个document 的 Document.readyState 属性描述了文档的加载状态。

loading / 正在加载:document 仍在加载。

interactive / 可交互:文档已被解析,"正在加载"状态结束,但是诸如图像,样式表和框架之类的子资源仍在加载。

complete / loaded 完成:文档和所有子资源已完成加载。表示 load 状态的事件即将被触发。

当该属性值发生变化时,会在document 对象上触发readystatechange事件。

(当document文档正在加载时,返回"loading"。当文档结束渲染但在加载内嵌资源时,返回"interactive",并引发DOMContentLoaded事件。当文档加载完成时,返回"complete",并引发load事件。)

语法

var string = document.readyState;

例子

// 模拟DOMContentLoaded
document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}
// 模拟 load事件
document.onreadystatechange = function () {
  if (document.readyState == "complete") {
    initApplication();
  }
}

onreadystatechange和onload区别分析的更多相关文章

  1. addEventListener()及attachEvent()区别分析

    Javascript 的addEventListener()及attachEvent()区别分析 Mozilla中: addEventListener的使用方式: target.addEventLis ...

  2. C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...

  3. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  4. Oracle nvchar2和varchar2区别分析

    Oracle nvchar2和varchar2区别分析: [注意]VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容.VA ...

  5. ready与onload区别一

    <!DOCTYPE html><html> <head> <title>ready与onload区别一</title> <meta c ...

  6. jQuery中的.bind()、.live()和.delegate()之间区别分析

    jQuery中的.bind()..live()和.delegate()之间区别分析,学习jquery的朋友可以参考下.   DOM树   首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的 ...

  7. jQuery中的bind() live() delegate()之间区别分析

    jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click', ...

  8. C# Parse和Convert的区别分析

    原文:C# Parse和Convert的区别分析 大家都知道在进行类型转换的时候有连个方法供我们使用就是Convert.to和*.Parse,但是疑问就是什么时候用C 什么时候用P 通俗的解释大家都知 ...

  9. jquery中attr和prop的区别分析

    这篇文章主要介绍了jquery中attr和prop的区别分析的相关资料,需要的朋友可以参考下 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别 ...

随机推荐

  1. python之 小甲鱼教程 Easygui 篇

    博客转自 https://blog.csdn.net/bestallen/article/details/51933427 终于有点实质性可以看到摸到的界面了,搜了一下虽然easygui用的不多,但是 ...

  2. (CSDN迁移)JAVA多线程实现-继承Thread

    继承Thread方法: extends Thread 重写覆盖run()方法: @Override public void run() 通过start()方法启动线程. threadDemo01.st ...

  3. 理解 Node.js 的 GC 机制

    <深入浅出Node.js>第五章<内存控制>阅读笔记 随着 Node 的发展,JavaScript 的应用场景早已不再局限在浏览器中.本文不讨论网页应用.命令行工具等短时间执行 ...

  4. ChecklistForTest

    相关字段内容较长时,页面显示是否正确(包括各主页面.明细页面.打印预览页面) 数据量较多时,页面显示是否正确(包括各主页面.明细页面.打印预览页面) 各字段为空校验(都为空,部分为空,都不为空)是否正 ...

  5. web记住我功能的实现

    在web网页中经常可以看到记住我这样的功能,其实现原理是登陆时候在response中写入cookie,发送请求时,取出cookie判断,如果有则说明已经登陆 写cookie Cookie cookie ...

  6. BJFU-215-基于链式存储结构的图书信息表的排序

    这里用的是冒泡排序 #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct Book{ doub ...

  7. Vue框架——页面组件中使用小组件

    小组件在components文件夹中,页面组件在views文件夹中 一.先写小组件的vue,比如text.vue(在template设置模板渲染,style设置样式) <template> ...

  8. 西门子S7-300 设置IP、子网掩码

    =============================================== 2019/7/17_第1次修改                       ccb_warlock == ...

  9. 【解决方案】ArcGIS导入要素集后没反应

    内容源自:ArcGIS10.2基础教程(丁华) 书上要求: 1.在“练习”文件夹中新建一个名为“沈阳”的个人地理数据库和名为“shenyang”的要素集,设置地理坐标为“Xi'an 1980”,高程坐 ...

  10. C#泛型集合之——队列与堆栈

    队列与堆栈基础 队列 1.操作: (1)创建及初始化: Queue<类型> 队列名 =new Queue<类型>()://空队列,无元素 Queue<类型> 队列名 ...