JS原生方法实现jQuery的ready()

浏览器加载页面的顺序:

1、 解析HTML结构

2、 加载外部脚本和样式表文件

3、 解析并执行脚本代码

4、 构造HTML DOM模型==ready()

5、 加载图片等组件

6、 页面加载完毕==onload()

ready事件是在DOM模型构造完毕时触发

load事件是在页面加载完毕后触发

function ready(fn) {
    if (document.addEventListener) {
        document.addEventListener(‘DOMContentLoaded‘, function () {
            //注销事件, 避免反复触发
            document.removeEventListener(‘DOMContentLoaded‘, arguments.callee, false);
            fn(); //执行函数
        }, false);
    } else if (document.attachEvent) { //IE
        document.attachEvent(‘onreadystatechange‘, function () {
            if (document.readyState == ‘complete‘) {
                document.detachEvent(‘onreadystatechange‘, arguments.callee);
                fn(); //函数执行
            }
        });
    }
};

ready()加强版

/*
* 传递函数给whenReady()
* 当文档解析完毕且为操作准备就绪时,函数作为document的方法调用
*/
var whenReady = (function () { //这个函数返回whenReady()函数
    var funcs = []; //当获得事件时,要运行的函数
    var ready = false; //当触发事件处理程序时,切换为true
    //当文档就绪时,调用事件处理程序
    function handler(e) {
        if (ready) return; //确保事件处理程序只完整运行一次
        //如果发生onreadystatechange事件,但其状态不是complete的话,那么文档尚未准备好
        if (e.type === ‘onreadystatechange‘ && document.readyState !== ‘complete‘) {
            return;
        }
        //运行所有注册函数
        //注意每次都要计算funcs.length
        //以防这些函数的调用可能会导致注册更多的函数
        for (var i = 0; i < funcs.length; i++) {
            funcs[i].call(document);
        }
        //事件处理函数完整执行,切换ready状态, 并移除所有函数
        ready = true;
        funcs = null;
    }
    //为接收到的任何事件注册处理程序
    if (document.addEventListener) {
        document.addEventListener(‘DOMContentLoaded‘, handler, false);
        document.addEventListener(‘readystatechange‘, handler, false); //IE9+
        window.addEventListener(‘load‘, handler, false);
    } else if (document.attachEvent) {
        document.attachEvent(‘onreadystatechange‘, handler);
        window.attachEvent(‘onload‘, handler);
    }
    //返回whenReady()函数
    return function whenReady(fn) {
        if (ready) { fn.call(document); }
        else { funcs.push(fn); }
    }
})();
//--------------------- test -----
function t1() {
    console.log(‘t1‘);
}
function t2() {
    console.log(‘t2‘);
}
// t2-t1-t2
whenReady(t1);
t2();
whenReady(t2);
时间: 2024-11-07 17:52:01

JS原生方法实现jQuery的ready()的相关文章

js 原生方法获取所有兄弟节点

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible"

认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

(一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQuery的优势 1)可以像CSS一样访问和操作DOM 2)修改CSS控制页面外观 3)简化JS代码操作 4)事件代理更加容易 5)动画效果使用方便 6) Ajax技术更加完美 7)大量的基于Jquery的插件 8)可以自定义扩展功能插件 (三)JQuery的语法 格式:$(selector).actio

js原生方式实现jquery中的append()方法

一.在使用jquery时, append() 方法在被选元素的结尾(仍然在内部)插入指定内容 使用方法:$(selector).append(content),content为必需的.规定要插入的内容(可包含 HTML 标签) 二.在使用原生js时,使用appendChild() 方法可向节点的子节点列表的末尾添加新的子节点, 用法:parent.appendChild(child); child没有引号包住,child参数,是node类型.给一个空文档里面动态创建元素,要使用document.

Js原生Ajax和Jquery的Ajax

一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死 2.Ajax的运行原理 页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面1 功能. 二

js中的js原生对象和jquery对象的相互调用

js中js原生对象是不能使用jquery对象的方法的,比如 jsobj.html()这样是调用不了的,同时$('jqobj').innerHTML 同样是错误的的 实例代码: $(function() { // console.log($('.contentdiscuss')[0].innerHTML.length) var lctobj={}; lctobj.lookmore=(function(){ var ct=$('.contentdiscuss'); for(var i=0;i<ct.

jQuery和JS原生方法对比

input标签讲解 <input/>作为按钮的type属性:button.submit(后面会有二者对比分析) (交互时的效果跟浏览器以及操作系统相关) <input/>的局限性 <input/>是自闭合标签(不能嵌套其他的标签),所以不能定义复杂样式按钮,所谓复杂的样式,一般指图文混杂的按钮,如下图所示: 如果想实现复杂的按钮样式,我们可以选择使用button标签. 搜索框中的form标签<form></form> <form>基本

js原生ajax与jquery的ajax的用法区别

什么是ajax和原理? AJAX 是一种用于创建快速动态网页的技术. 通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据 XMLHttpRequest对象的基本属性: onreadtstatechange 每次状态改变所触发事件的时间处理程序. responseText 从服务器响应返回以字符串为形式的数据 responseXML 从服务器响应返回以XML(DOM兼容文档)数据对象 status 从服务器返回的数字代码 100-199 用于指定客户端应相应的某些动作. 2

JS原生方法实现瀑布流布局

html部分(图片都是本地,自己需要改动图片) p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #d74200 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; col

像jq那样获取对象的js原生方法

使用过jq的童鞋非常喜欢jq获取对象的方法,只要$()就可以获取,在此我封装一个js获取对象的方法 [注意]只对chrome,Firefox,opera,Safari,ie8及ie8以上版本有效 function getEle(ele,index){   var obj = document.querySelectorAll(ele);    if(index){     if(obj.length ==1){      return obj;     }     return obj[inde