ready是先执行的,load后执行,DOM文档的加载步骤

在jq中在文档载入完毕后有这几种方式去执行指定函数:

$(document).ready(function() { // ...代码... }); //document ready 简写 $(function() { // ...代码... }); $(window).load(function() { // ...代码... });

$(function(){}) 的方式其实是 $(document).ready() 的简写,具体可以看看jq构造器那块。

ready与load谁先执行

这个问题在面试的时候也会经常被提到,ready是先执行的,load后执行,DOM文档的加载步骤:

(1) 解析HTML结构。 (2) 加载外部脚本和样式表文件。 (3) 解析并执行脚本代码。 (4) 构造HTML DOM模型。//ready (5) 加载图片等外部文件。 (6) 页面加载完毕。//load 分析原因

.ready() 都是作用于 window.onload 事件的。

jQuery.fn.ready = function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; };

当调用ready事件时,jq就会把函数添加到一个回调列表中。

而 .load() 作用的是为每个匹配元素的load事件绑定处理函数。

$(window).load( function(){ alert("文档加载完毕!"); } ); $("img").load( function(){ alert( "图片[" + this.alt + "]加载完毕!" ); } );

load的写法也发生了一些改变,1.8版本之后,load就抛弃了,只剩下ajax的load了,它的函数原型:

jQuery.fn.load = function( url, params, callback ) { //code... return this; }

因此在高版本中它的使用应该是:

$(‘#result‘).load(‘ajax/test.html‘, function() { alert(‘Load was performed.‘); }); ready源码 // readyList.promise() === jQuery.ready.promise() var readyList; jQuery.fn.ready = function( fn ) { // promise后添加回调 jQuery.ready.promise().done( fn ); // 链式 return this; }; jQuery.extend({ // 此判断防止重复触发 isReady: false, // 需要几次jQuery.ready()调用,才会触发promise和自定义ready事件 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { // true,延迟次数 +1 jQuery.readyWait++; } else { // 无参数,消减次数 -1 jQuery.ready( true ); } }, // 触发promise和自定义ready事件 ready: function( wait ) { // ready(true)时,消减次数的地方。也能代替干ready()的事 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // ready()调用时,标记dom已加载完成 jQuery.isReady = true; // ready(2881064151)能够设置isReady,只能消减默认的那1次 if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // 触发promise,jQuery.fn.ready(fn)绑定函数都被触发 readyList.resolveWith( document, [ jQuery ] ); // 触发自定义ready事件,并删除事件绑定 if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } }); // 解绑函数 function completed() { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); jQuery.ready(); } jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // 判断执行到这时,是否已经加载完成 if ( document.readyState === "complete" ) { // 不再需要绑定任何监听函数,直接触发jQuery.ready。延迟一会,等代码执行完 setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // 个别浏览器情况,错过了事件仍可触发 window.addEventListener( "load", completed, false ); } } return readyList.promise( obj ); }; // 执行。生成deferred对象,绑定好监听逻辑 jQuery.ready.promise();

readyList = jQuery.Deferred(); 回调列表是 $.Deferred 对象,事件监听通过:

document.addEventListener( "DOMContentLoaded", completed, false ); window.addEventListener( "load", completed, false );

为了达到兼容不同浏览器,一个添加到 window 一个添加到 document ,通过 $.isReady 避免多次调用。

function completed() { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); jQuery.ready(); }

对事件进行解绑,调用 $.ready() :

readyList.resolveWith( document, [ jQuery ] );

执行异步对象里的函数队列。

load

load的实现就比较简单, jQuery.fn.load = function( url, params, callback ){} 它几乎与 $.get(url, data, success) 等价,因为它就是通过 $.ajax() 实现的,不同的是它的url可以包含一个空格或多个空格,紧接第一个空格的字符串则是决定所加载内容的 jQuery 选择器:

$("#result").load("ajax/test.html #container");

如果执行该方法,则会取回 ajax/test.html 的内容,不过然后, jQuery 会解析被返回的文档,来查找带有容器 ID 的元素。该元素,连同其内容,会被插入带有结果 ID 的元素中,所取回文档的其余部分会被丢弃。

off = url.indexOf(" "); if ( off >= 0 ) { selector = jQuery.trim( url.slice( off ) ); url = url.slice( 0, off ); }

最后来看看它ajax部分:

jQuery.ajax({ url: url, // if "type" variable is undefined, then "GET" method will be used type: type, dataType: "html", data: params }).done(function( responseText ) { // Save response for use in complete callback response = arguments; self.html( selector ? // If a selector was specified, locate the right elements in a dummy div // Exclude scripts to avoid IE ‘Permission Denied‘ errors jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) : // Otherwise use the full result responseText ); }).complete( callback && function( jqXHR, status ) { self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); });

self.html() 是使用浏览器的 .innerHTML 属性来解析被取回的文档,并把它插入当前文档。

时间: 2024-12-17 18:43:48

ready是先执行的,load后执行,DOM文档的加载步骤的相关文章

react执行yarn eject后配置antd的按需加载

第一步: 用create-react-app创建完成项目后,执行yarn eject .在config文件夹会显示配置文档 第二步: 添加插件yarn add babel-plugin-import --save-dev  yarn add antd --save-dev 第三步:在congif文件夹下webpack.config.dev.js第147行添加代码 options: { + plugins: [ + ['import', [{ libraryName: "antd", s

IIS6(Win2003) 使用.net 4.0 后,默认文档失效解决方案。

IIS6(Win2003) 使用.net framework 4.0 后,默认文档失效解决方案. 用.net framework 4.0 开发的WEB项目,但放到iis6 中无法使用默认文档,状况如下:地址栏输入:http://xxx.xxx.xxx.xxx/    提示找不到文件输入全称:http://xxx.xxx.xxx.xxx/default.aspx 正常显示. 本人解决方案如下. 1. 先新建一个文本文件,然后把以下文本COPY到这个文件中,保存为 1.reg ,然后直接导入.Win

installshield:更新完成后,显示文档readme.txt

installShield在进行更新后,显示 操作的日志,或者新特性 function OnUpdateUIAfter() number nResult; string szTitle, szMsg; begin //Rocky System ( SYS_BOOTMACHINE ); DialogShowSdFinish(); end; // Rocky function DialogShowSdFinish() NUMBER nResult, nDefOptions; STRING szTit

命令行中编译执行报错提示“找不到或无法加载主类”

1.没有配置JAVA_HOME和CLASSPATH,只配了Path(D:\Program\Java\jdk1.8.0_161\bin),验证可以编译执行: 2.java源文件路径:F:\workspace0408\HelloWorld\src: 3.源文件如下: 1 package test; 2 3 public class HelloWorld { 4 public static void main(String[] args) { 5 System.out.println("Hello W

IIS6(Win2003) 使用.net framework 4.0 后,默认文档失效解决方案。

用.net framework 4.0 开发的WEB项目,但放到iis6 中无法使用默认文档,状况如下: 地址栏输入:http://xxx.xxx.xxx.xxx/    提示找不到文件 输入全称:http://xxx.xxx.xxx.xxx/default.aspx 正常显示. 在百度查了一下,没有收获,不得以用非常手段,到Google 搜索 iis6 .net 4.0 document]这个关键字,立即有收获. 是HTTP解释.axd 时出错,导致默认文档没法生效. 解决方法: 先新建一个文

Hibernate中load()和get()的区别,lazy加载和Eager加载的区别

Hibernate中load()和get()的区别: get():是直接操作数据库,通过id获取数据封装对象,如果没有数据则返回null: load():先在session缓存中查询,如果缓存中不存在,则延迟从数据库中查询,没发现符合条件的记录,则会抛出一个ObjectNotFoundException.在延迟查询中如果session关闭则会抛出no session异常 Hibernate中lazy加载和Eager加载的区别: Eager加载:将当前表和关联的其它表一并查询出来,select的语

关于解决 从相册中选择照片后无法剪切图片以及无法加载图片的问题

程序分析: 主要分两个部分 (1)先拍照,然后剪切,最后显示出来.    (2)从相册中选择一张照片进行剪切然后显示出来 代码参照<第一行代码>,书中的代码运行时(2)出现了问题,无法剪切图片且无法加载图片 MainActivity.java代码如下: 1 package com.example.lynn.choosepictest; 2 3 import android.content.Intent; 4 import android.graphics.Bitmap; 5 import an

安装QT5后运行提示libHelp.so无法加载

执行这条命令即可: sudo apt-get install libgstreamer-plugins-base0.10-0

当在dw没修改保存后就框架乱需要从新加载编码

最近在用dw网页软件改代码的时候,改了放到空间,框架就乱了,后来研究了一下 不修改在dw编辑器中打开一下保存 上传到空间 框架也乱了 后来找了找原因 当遇到这种情况的时候,需要重新加载一下编码就好了 dw中点修改菜单---页面属性里面