zoukankan      html  css  js  c++  java
  • jquery ready方法实现原理

            先看这两句代码:
            window.addEventListener('load',loaded,false);
            document.addEventListener('DOMContentLoaded',loaded,false);
    
            总结:
            load事件是在页面所有元素都加载完后触发;
            DOMContentLoaded,它是指dom tree加载完就触发;防止了页面加载被堵塞。
        
            DOMContentLoaded事件(IE9+以及其他浏览器)
            onreadystatechange事件(IE9以下浏览器)
    

    今天闲来无事研究研究jquery.ready()的内部实现,看JQ的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多。

    先普及一下jquery.ready()和window.onload,window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致window.onload事件迟迟无法触发.所以出现了DOM Ready事件. 此事件在DOM文档结构准备完毕后触发, 即在资源加载前触发.

    var $ = ready = window.ready = function(fn){  
        if(document.addEventListener){//兼容非IE  
            document.addEventListener("DOMContentLoaded",function(){  
                //注销事件,避免反复触发  
                document.removeEventListener("DOMContentLoaded",arguments.callee,false);  
                fn();//调用参数函数  
            },false);  
        }else if(document.attachEvent){//兼容IE  
           IEContentLoaded (window, fn);
        }  
    
        function IEContentLoaded (w, fn) {
            var d = w.document, done = false,
            // only fire once
            init = function () {
                if (!done) {
                    done = true;
                    fn();
                }
            };
            // polling for no errors
            (function () {
                try {
                    // throws errors until after ondocumentready
                    d.documentElement.doScroll('left');
                } catch (e) {
                    setTimeout(arguments.callee, 50);
                    return;
                }
                // no errors, fire
    
                init();
            })();
            // trying to always fire before onload
            d.onreadystatechange = function() {
                if (d.readyState == 'complete') {
                    d.onreadystatechange = null;
                    init();
                }
            };
        }
    }
    ready(function(){alert(1)})
    
  • 相关阅读:
    SSM中shiro的基本使用
    TortoiseGit小乌龟 git管理工具
    vux用法
    vue webpack打包
    vue2.0 watch
    vue2.0 $emit $on组件通信
    简单工具 & 杂技
    html基础问题总结
    Node应用进程管理器pm2的使用
    node express 登录拦截器 request接口请求
  • 原文地址:https://www.cnblogs.com/sntetwt/p/3957946.html
Copyright © 2011-2022 走看看