$(document).ready、body.Onload()和 $(window).load的区别

本文详细阐述了JavaScript中页面加载事件的区别与应用,包括window.load、body.onload与$(document).ready()方法的原理与区别,重点讨论了如何利用$(document).ready()避免页面加载延迟带来的用户体验问题,并提供了刷新后只执行一次函数的实现方法,以及调试技巧。

JavaScript文档加载完成事件

window.load(function(){...})和body.onload()都存在同样一个问题,那都是在页面所有元素(包括html标签以及引用到得所有图片,Flash等媒体)加载完毕后执行的,这是它们的共同点.$(document).ready()是文档结构已经加载完成(不包含图片等非文字媒体文件),不必等到所有的加载完毕。

原理是:

$(document).ready(function (){ alert('use in page script tag') });
在jquery脚本加载的时候,会设置一个isReady的标记,监听DOMContentLoaded事件(这个不是什么浏览器都有的,不同浏览器,jquery运作方式不一样).当然遇到调用ready函数的时候,如果isReady未被设置,那就是说页面未加载完,就会把要执行的函数用一个数组缓存起来,当页面加载完后,再把缓存的函数一一执行.
另外补充:
jquery ready可以写好几个,每个都执行
onload只能写一个,你写好几个,也只执行一个,好像是执行最后一个,而$(window).load()可以加载多个函数

 

用$(window).load(function(){...})而不用body.onload()的几个理由

不用body.Onload()理由1:

如果我们想同时加载多个函数,我们必须这样写

<body onload="fn1(),fn2()"></body>看起来极其丑陋,如果用$(window).load()我们可以这样加载多个函数

 $(window).load(function() {
            alert("hello,我是jQuery!");
  });
 $(window).load(function() {
        alert("hello,我也是jQuery");
 });

这样写它会从上往下执行这两个函数,并且看起来漂亮多了.

不用body.Onload()理由2:

用body.Onload()不能够做到js和html完全分离,这是一个很严重的问题.

另外用$(window).load(function(){...})和body.onload()都存在同样一个问题,因为开始也说到了,它们都需要等到页面的所有内容

加载完毕才执行,但是如果当网速比较慢的时候,加载一个页面往往需要较长的时间(几秒到十几秒不等,甚至更长...),所以我们经常

会遇到页面还没有完全加载完毕而用户已经在操作页面了这种情况,这样页面表现出来的效果就跟我们预期的效果不一样了,

所以在这里我推荐使用$(document).ready(function(){}),或简写为$(function(){}),因为他会在页面的dom元素加载完毕后就执行,

而无需等到图片或其他媒体下载完毕.

但是有时候确实我们有需要等到页面的所有东西都加载完后再执行我们想执行的函数,所以是该使用$(window).load(function(){...})还是

该使用$(function(){})往往需要结合具体需要而作不同的选择.

最后附上一段在所有DOM元素加载之前执行的jQuery代码

<script type="text/javascript">

(function() {
            alert("DOM还没加载哦!");
        })(jQuery)

</script>

补充1:刷新也只执行一次

刷新后只让$(window).load(function(){...})和body.onload()都执行一次的方法,cookie中实现(以body.onload()举例,$(window).load也可以照样该)

function loadpopup(){
if (get_cookie('popped')==''){
//这里放要执行的代码,这样就现实了只执行一次的

document.cookie="popped=yes" ;
}
}
</script>
</head>
<body onload="loadpopup()">

补充2:调试技巧

为了调试方便,有时候在所有的DOM加载之前调用JS代码,这个方法是我在调试的时候最喜欢的,有时候开发的时候也用这种方法
<body>
    <script type="text/javascript">
        (function() {
            alert("hi");
        })(jQuery)
    </script>
</body>
对,就是利用js闭包的形式将js代码嵌入body,这段代码会自动执行,当然也可以直接嵌入js代码,这种方式要注意顺序问题,如下:
<body>
<div id="test">this is the content</div>
    <script type="text/javascript">

        alert($("#test").html());//I Can display the content
            </script>
</body>
<body>
   <script type="text/javascript">

        alert($("#test").html());//I Can't display the content
            </script>
    <div id="test">this is the content</div>
</body>
上面两段代码,第二段代码当中因为只能解释到当前代码之前的DOM,而test并不存在于已经解析的DOM中.所以第二段代码无法正确显示

补充3:非jquery中无$(document).ready方法

在 W3C 中有个叫 DOMContentLoaded 的事件, 故名思意, 它会在 DOM (文档对象模型) 被加载完成的时候触发. 那么我们就可以通过下面的方法调用初始化脚本的方法了.

但很遗憾, 现在很多浏览器并不玩 W3C 这一套, 支持 DOMContentLoaded 事件的只有 Firefox, Opera 9 等一些 "现代" 浏览器, 而被集成到两大商业桌面系统的 IE 和 Safari 都不支持. 尽管如此, 我们可以用别的一些方法进行处理.

方案一:

if (document.addEventListener){   //非ie浏览器
       document.addEventListener("DOMContentLoaded", init, false);
} else if (document.attachEvent){   //ie浏览器
       document.onreadystatechange=function(){         if (this.readyState == 'complete') {           init();          }      }}

方案二:

// 如果支持 W3C DOM2, 则使用 W3C 方法
if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", init, false);
 
// 如果是 IE 浏览器
} else if (/MSIE/i.test(navigator.userAgent)) {
	// 创建一个 script 标签, 该标签有 defer 属性, 当 document 加载完毕时才会被载入
	document.write('<script id="__ie_onload" defer src="javascript:void(0)"></script>');
	var script = document.getElementById("__ie_onload");
	// 如果文档确实装载完毕, 调用初始化方法
	script.onreadystatechange = function() {
		if (this.readyState == 'complete') {
			init();
		}
	}
 
// 如果是 Safari 浏览器
} else if (/WebKit/i.test(navigator.userAgent)) {
	// 创建定时器, 每 0.01 秒检验一次, 如果文档装载完毕则调用初始化方法
	var _timer = setInterval( function() {
		if (/loaded|complete/.test(document.readyState)) {
			clearInterval(_timer);
			init();
		}
	}, 10);
 
// 如果以上皆不是, 使用最坏的方法 (本例中, Opera 7 将会跑到这里来)
} else {
	window.onload = function(e) {
		init();
	}
}


补充4:有window.onload,但是没有document.onload

<script type="text/javascript">
<!--  
function $(id)  
{  
    return document.getElementById(id);  
}  
function show()  
{  
    alert($("btn").value);  
    if(document.attachEvent)  
    alert("load");  
} 
document.attachEvent("onload",show); 
//window.attachEvent("onload",show);
//window.onload=show;  
//document.onload=show();  
 -->
 </script>  
<body >  
<input type="button" value="button" id="btn">  
<hr>  
</body>
<think>好的,我现在需要帮用户解决关于jQuery$(window).load(function(){})的用法或相关的问题。首先,我得回忆一下这个方法的用途。记得在jQuery中,$(document).ready()$(window).load()是两个不同的事件处理函数。ready()在DOM结构加载完成后就执行,而load()则是要等整个页面包括图片、样式表等外部资源都加载完毕才会触发。可能用户遇到了load事件不触发的问题,或者想知道它的具体应用场景。 接下来,我需要确认用户提到的引用内容是否相关。引用[1]讨论的是纯JavaScript实现jQuery$.ready()方法,这可能涉及到DOM准备就绪的事件处理。而引用[2]中的代码片段看起来像是jQuery内部处理ready事件的逻辑,可能涉及到等待状态计数器。不过用户现在的问题是关于$(window).load(),所以可能需要区分这两个事件的不同之处。 然后,我需要组织回答的结构,确保符合用户的要求。首先解释$(window).load()的基本用法,给出示例代码。然后对比它$(document).ready()区别,说明各自的适用场景。接着,针对常见问题,比如事件未触发、重复绑定、与ready的冲突等,给出解决方案。此外,还要提到jQuery 3.0之后的弃用情况,建议使用标准的window.onload或者转向更现代的API如$(document).ready()。 还要考虑用户可能遇到的问题,比如为什么他们的load事件没有执行。可能的原因包括代码位置不对,放在DOM元素之前,或者资源加载失败。此外,如果用户升级了jQuery版本到3.0以上,原来的load方法可能已经不可用,导致问题出现。 另外,生成的相关问题需要围绕load事件的使用场景、替代方法、常见错误处理等展开,帮助用户进一步理解。比如,如何检测资源加载失败,或者如何结合使用readyload事件。 最后,确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式。但需要检查是否有遗漏,比如是否有变量或代码需要正确格式化。同时,引用标识要自然地添加在引用的段落末尾,不过当前提供的引用可能更多关于ready事件,需要适当调整引用位置,或者说明引用的来源可能与当前问题不直接相关,但作为参考。 总结步骤:1. 解释load方法的作用用法;2. 对比readyload区别;3. 常见问题解决方案;4. 兼容性替代方案;5. 生成相关问题。</think>### jQuery $(window).load() 用法与常见问题 #### 一、基本用法 `$(window).load(function(){})` 用于在**页面所有资源加载完成后**执行代码,包括图片、样式表等外部资源。其语法为: ```javascript $(window).on('load', function() { // 页面完全加载后的操作 }); ``` **典型场景**:需依赖图片尺寸进行布局调整时,例如: ```javascript $(window).load(function() { console.log('所有图片加载完成,当前图片宽度:', $('#banner-img').width()); }); ``` #### 二、与 $(document).ready()区别 | 事件类型 | 触发时机 | 资源依赖 | |----------------------|-----------------------------------|--------------------| | `$(document).ready()` | DOM树构建完成(无需等待外部资源) | 不依赖图片/样式表 | | `$(window).load()` | 全部资源(含图片)加载完成 | 需精确计算资源尺寸 | **数学示例**:若需在资源加载后计算图像宽高比: $$ \text{宽高比} = \frac{\text{图像宽度}}{\text{图像高度}} $$ #### 三、常见问题与解决 1. **事件未触发** - 原因:脚本位置在DOM元素前导致绑定失败 - 解决:将脚本放在`<body>`末尾或使用`$(document).ready()`包裹: ```javascript $(document).ready(function() { $(window).on('load', initFunction); }); ``` 2. **重复绑定问题** 多次调用`$(window).load()`会导致回调函数重复执行。建议使用`.off()`解绑旧事件: ```javascript $(window).off('load').on('load', function() { /* ... */ }); ``` 3. **jQuery 3.0+ 的兼容性** jQuery 3.0 移除了`load()`简写方法[^1],必须使用标准事件绑定: ```javascript // 错误写法(jQuery 3.0+ 失效) $(window).load(function() {}); // 正确写法 $(window).on('load', function() {}); ``` 4. **替代方案** 现代浏览器推荐使用原生`window.onload`: ```javascript window.addEventListener('load', function() { console.log('原生load事件'); }); ``` #### 四、性能优化建议 - 优先使用`$(document).ready()`处理非资源依赖逻辑 - 避免在`load`事件中执行耗时操作(可能延迟页面交互)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值