zoukankan      html  css  js  c++  java
  • 一个通用onReady函数的实现

    define([], function(){
     
        function onReady(fn) {
            var DOC = document,
                html = DOC.documentElement,
                W3C = document.dispatchEvent;
            //FF曾经是没有readyState属性的
            //推断body是否存在来决定DOM文档是否载入完成
            if (!DOC.readyState) {
            var readyState = DOC.readyState = DOC.body ? "complete" : "loading";
            }
            //假设页面已经全然载入完成直接运行回调函数
            if (DOC.readyState === "complete") {
                setTimeout(fn);
            //现代游览器和IE>=IE9
            } else if (W3C) {
                DOC.addEventListener('DOMContentLoaded', function(){
                    if (readyState) {
                        DOC.readyState = 'complete';
                    }
                    fn();
                }, false);
            } else {
                ieReady(fn);
            }
        }
    
        function ieReady(fn) {
           try {
               //处理iframe中的页面在IE下无法通过doScroll推断DOM知否载入完成
               if (self !== top && self.document.readyState !== 'complete') {
                   setTimeout(function(){
                         ieReady.call(window, fn)
                     })
               } else if (self !== top && self.document.readyState === 'complete') {
                   arguments[0]();
               } else {
                   document.documentElement.doScroll('left');
                     arguments[0]();
               }
             } catch (e) {
                 setTimeout(function(){
                     ieReady.call(window, fn)
                 })
           }
       };
    
       AS.extend({
           'onReady': onReady
       });
       return onReady;
    })


    修正一个重大bug,ready函数是不能在AMD中定义从而异步载入的,由于DOMContentLoaded监听的触发时机是在DOM和JS.CSS载入运行完成后,但有一个例外就是JS假设是动态载入进来的,DOMContentLoaded不会等待这个异步载入的js,所以假设将绑定DOMContentLoaded事件的函数写在动态载入的js中,有一个可能就是Dom已经载入完成但动态载入的js中的为DOMContentLoaded绑定监听的代码还没有运行,所以非常有可能你为DOMContentLoaded绑定的监听不会运行.


  • 相关阅读:
    hadoop的权限控制
    linux ssh连接超时断连设置
    PuTTY + Xming 远程使用 Linux GUI
    linux系统用户下的crontab任务不执行问题处理
    shell编程注意点
    启动VMware出现报错:The VMware Authorization Service is not running
    mul8_unsigned multipliter
    mul16
    C#基础精华06(Linq To XML,读取xml文件,写入xml)
    C#基础精华05(正则表达式,)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4298504.html
Copyright © 2011-2022 走看看