Jquery的ready()与Javascrpit的load()区别

本文对比分析了Jquery中$(document).ready()与JavaScript中的window.onload方法的区别,前者在DOM加载完成后即可执行,后者需等待所有资源加载完毕。深入探讨了两者的应用场景及原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做web开发时常用Jquery中$(document).ready()和JavaScript中的window.onload方法,两者都是要在页面加载完成以后加载的方法,但是这两者还是有很大区别的。最近遇到了这样的问题,查询了多篇文章,做一下总结。

简单来说,要以用以下张表来表示 :
window.onload() $(document).ready()
在这里插入图片描述
一般情况下window的load()都是用来设置body标签的onload事件.但onload事件是要在页面的元素全部加载完了才触发的,这也包括页面上的图片,以及大的表格数据。如果页面上图片较多或图片太大,加载需要较多时间,就会导致页面无响应,或者用户做了其它操作了。

而Jeuery中的ready()则是在页面的dom(节点)加载完后就可以做相应的操作,而不用等待全部元素加载完成.比如只知道页面某处有一张图片,而不一定要等它显示出来就可以为它绑定点击方法。

load()一般不建议使用,这里主要讲一下( $(selector).ready())。

原理:
在jquery脚本加载的时候,会设置一个isReady的标记,监听DOMContentLoaded事件(这个不是什么浏览器都有的,不同浏览器,jquery运作方式不一样).当然遇到调用ready函数的时候,如果isReady未被设置,那就是说页面未加载完,就会把要执行的函数用一个数组缓存起来,当页面加载完后,再把缓存的函数一一执行.
Jquery中的详细代码分析:

	ready: function(fn) {
	// 绑定监听器
	bindReady();
	// 如果 DOM 加载完成
	if ( jQuery.isReady )
	// 马上运行此函数
	fn.call( document, jQuery );
	// 否则保存起来
	else
	// 把函数加入缓存数组中
	jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
	return this;
	}

当然,jquery对不同的浏览器dom加载完成的通知 bindReady()函数也是不同的

	var readyBound = false;
	function bindReady(){
	if ( readyBound ) return;
	readyBound = true;
	
	// Mozilla,opera,webkitnightlies支持DOMContentLoaded事件
	if ( document.addEventListener && !jQuery.browser.opera)
	// 直接使用事件回调即可
	document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
	
	// 如果是ie并且不是嵌在frame中
	// 就需要不断地检查文档是否加载完
	if ( jQuery.browser.msie && window == top ) (function(){
	if (jQuery.isReady) return;
	try {
	
	document.documentElement.doScroll("left");
	} catch( error ) {
	
	setTimeout( arguments.callee, 0 );
	return;
	}
	// and execute any waiting functions
	jQuery.ready();
	})();
	
	if ( jQuery.browser.opera )
	document.addEventListener( "DOMContentLoaded", function () {
	if (jQuery.isReady) return;
	for (var i = 0; i < document.styleSheets.length; i++) 
	if (document.styleSheets[i].disabled) {
	setTimeout( arguments.callee, 0 );
	return;
	}
	// and execute any waiting functions
	jQuery.ready();
	}, false);
	
	if ( jQuery.browser.safari ) {
	var numStyles;
	(function(){
	if (jQuery.isReady) return;
	if ( document.readyState != "loaded" && document.readyState != "complete" ) { 
	setTimeout( arguments.callee, 0 );
	return;
	}
	if ( numStyles === undefined )
	numStyles = jQuery("style, link[rel=stylesheet]").length;
	if ( document.styleSheets.length != numStyles ) { 
	setTimeout( arguments.callee, 0 );
	return;
	}
	// and execute any waiting functions
	jQuery.ready();
	})();
	}
	
	// A fallback to window.onload, that will always work
	jQuery.event.add( window, "load", jQuery.ready ); 
	}
	}

这里最要注意的是,IE只有在页面不是嵌入frame中的情况下才和其它浏览器等一样,在DOM加载完成以后就执行$(document).ready()的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值