• onreadystatechange和onload区别分析以及如何判断script是否加载状态


    script加载

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

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

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

    以下是IE的一个例子:

    <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);

    }

    以下 HTML 标签支持 onload :

    <body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">, <link>(仅IE), <script>, <style>

     

     

  • 相关阅读:
    django调试思路
    在python中使用Mongodb
    python中Redis的简要介绍以及Redis的安装,配置
    python3.7中SQLAlchemy安装失败,报错Command errored out with exit status 1
    使用jinjia2时报错 (admin.E403) A ‘django.template.backends.django.DjangoTemplates’ instance must be configured in TEMPLATES in order to use the admin application.
    使用豆瓣API时报错invalid keyid
    Http常用状态码
    python开发工具ipython
    解析GenericOptionsParser
    Sql注入
  • 原文地址:https://www.cnblogs.com/kunmomo/p/11912742.html
Copyright © 2020-2023  润新知