$(document).ready 和 window.onload() 区别
web开发时,经常用到 jQuery中 $(document).ready() 和 JavaScript 中 window.onload 方法
两者都是要在页面加载完成以后加载的方法,但是这两者还是有很大区别的。
jQuery ready() 与 Javascrpit load()
window.onload() | $(document).ready() | |
加载时机 |
必须等待网页全部加载完毕(包括图片等),然后再执行JS代码 |
只需要等待网页中的DOM结构加载完毕,就能执行JS代码 |
执行次数 |
只能执行一次,如果第二次,那么第一次的执行会被覆盖 |
可以执行多次,第N次都不会被上一次覆盖 |
举例 |
以下代码无法正确执行: window.onload = function() { alert(“text1”);}; window.onload = function() { alert(“text2”);}; 结果只输出第二个 |
以下代码正确执行: $(document).ready(function(){alert(“Hello”)}); $(document).ready(function(){alert(“Hello”)}); 结果两次都输出 |
简写方案 | 无 | $(function () {}) |
一般情况下window的load()都是用来设置body标签的onload事件,但onload事件是要在页面的元素全部加载完了才触发的,这也包括页面上的css、js、图片,以及大的表格数据。如果页面上图片较多或图片太大,加载需要较多时间,就会导致页面无响应,或者用户做了其它操作了。
而jQuery中的 $(document).ready() 则是在页面的dom(节点)加载完后就可以做相应的操作,而不用等待全部元素加载完成,比如只知道页面某处有一张图片,而不一定要等它显示出来就可以为它绑定点击方法。
一般不建议使用JavaScript 中 window.onload 方法,这里主要讲一下 jQuery ( $(selector).ready())。
jQuery ( $(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()的内容。
JavaScript 中 window.onload 事件
window.onload() 事件通常用于检测文档内容或者图片是否加载完毕。
浏览器支持:
(1)IE浏览器支持此事件。
(2)edge浏览器支持此事件。
(3)火狐浏览器支持此事件。
(4)Opera浏览器支持此事件。
(5)chrome浏览器支持此事件。
(6)safari浏览器支持此事件。
网页中的某些JavaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免类似情况的发生,可以使用以下两种方式:
(1)将脚本代码放在网页的底端,运行脚本代码的时候,可以确保要操作的对象已经加载完成。
(2)通过window.onload来执行脚本代码。
第一种方式感觉比较凌乱(其实推荐使用),我们通常需要将脚本代码放在一个更为合适的地方,window.onload方式将是一个良好的选择。
window.onload是一个事件,当文档内容完全加载完成会触发该事件。可以为此事件注册事件处理函数,并将要执行的脚本代码放在事件处理函数中,于是就可以避免获取不到对象的情况。
window.onload 示例
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="https://blog.mimvp.com/" /> <title>米扑博客</title> <style type="text/css"> #bg{ width:100px; height:100px; border:2px solid red; } </style> <script type="text/javascript"> document.getElementById("bg").style.backgroundColor="#F90"; </script> </head> <body> <div id="bg"></div> </body> </html>
代码的初衷是将div的背景颜色设置为#F90,但是并没有实现此效果
因为代码是顺序执行的,当执行到document.getElementById("#bg").style.backgroundColor="#F90"的时候,还没有加载到此div对象,所以设置也就不能够成功。
代码修改如下:
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="https://blog.mimvp.com/" /> <title>米扑博客</title> <style type="text/css"> #bg{ width:100px; height:100px; border:2px solid red; } </style> <script type="text/javascript"> window.onload=function(){ document.getElementById("bg").style.backgroundColor="#F90"; } </script> </head> <body> <div id="bg"></div> </body> </html>
代码完成将div背景颜色设置为#F90,将设置背景颜色的代码放置在window.onload的事件处理函数中,当文档加载完成后,才会执行事件处理函数,保证文档已经加载完成。
window.onload 事件处理函数绑定
1)window.onload=function(){}
前面的代码就是使用此种方式为window.onload事件绑定事件处理函数,绑定的是一个匿名函数,当然也可以绑定具名函数,代码实例如下:
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="https://blog.mimvp.com/" /> <title>米扑博客</title> <script type="text/javascript"> window.onload=function myalert(){ alert("绑定成功!"); } </script> </head> <body> hello mimvp.com </body> </html>
不能以以下方式为此事件绑定多个事件处理函数:
window.onload=function a(){} window.onload=function b(){}
上代码不能为window.onload事件绑定多个事件处理函数,最后一个会覆盖前面的所有函数。
代码可以变通一下:
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="https://blog.mimvp.com/" /> <title>米扑博客</title> <style type="text/css"> #bg{ width:100px; height:100px; border:2px solid red; } </style> <script type="text/javascript"> window.onload=function(){ function a(){ document.getElementById("bg").style.backgroundColor="#F90"; } function b(){ document.getElementById("bg").style.width="200px"; } a(); b(); } </script> </head> <body> <div id="bg"></div> </body> </html>
2)addEventListener() 和 attachEvent()
下面再看一个为Image图片对象注册load事件处理函数的代码。
var img=new Image(); img.onload=function(){ var iheight=img.height; var iwidth=img.width; alert(iwidth); }; img.src="delete.gif";
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-05-07 05:40:06
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!