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 οnlοad="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 οnlοad="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 都不支持. 尽管如此, 我们可以用别的一些方法进行处理.

方案一:

[html] view plaincopy
  1. if (document.addEventListener){   //非ie浏览器
  2. document.addEventListener("DOMContentLoaded", init, false);
  3. } else if (document.attachEvent){   //ie浏览器
  4. document.onreadystatechange=function(){         if (this.readyState == 'complete') {           init();          }      }}

方案二:

[html] view plaincopy
  1. // 如果支持 W3C DOM2, 则使用 W3C 方法
  2. if (document.addEventListener) {
  3. document.addEventListener("DOMContentLoaded", init, false);
  4. // 如果是 IE 浏览器
  5. } else if (/MSIE/i.test(navigator.userAgent)) {
  6. // 创建一个 script 标签, 该标签有 defer 属性, 当 document 加载完毕时才会被载入
  7. document.write('<script id="__ie_onload" defer src="javascript:void(0)"></script>');
  8. var script = document.getElementById("__ie_onload");
  9. // 如果文档确实装载完毕, 调用初始化方法
  10. script.onreadystatechange = function() {
  11. if (this.readyState == 'complete') {
  12. init();
  13. }
  14. }
  15. // 如果是 Safari 浏览器
  16. } else if (/WebKit/i.test(navigator.userAgent)) {
  17. // 创建定时器, 每 0.01 秒检验一次, 如果文档装载完毕则调用初始化方法
  18. var _timer = setInterval( function() {
  19. if (/loaded|complete/.test(document.readyState)) {
  20. clearInterval(_timer);
  21. init();
  22. }
  23. }, 10);
  24. // 如果以上皆不是, 使用最坏的方法 (本例中, Opera 7 将会跑到这里来)
  25. } else {
  26. window.onload = function(e) {
  27. init();
  28. }
  29. }

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

[javascript] view plaincopy
  1. <script type="text/javascript">
  2. <!--
  3. function $(id)
  4. {
  5. return document.getElementById(id);
  6. }
  7. function show()
  8. {
  9. alert($("btn").value);
  10. if(document.attachEvent)
  11. alert("load");
  12. }
  13. document.attachEvent("onload",show);
  14. //window.attachEvent("onload",show);
  15. //window.οnlοad=show;
  16. //document.οnlοad=show();
  17. -->
  18. </script>
  19. <body >
  20. <input type="button" value="button" id="btn">
  21. <hr>
  22. </body>

最新文章

  1. 用 PHPMailer 发送邮件
  2. MySQL 存储过程初研究
  3. android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排
  4. 【转】VC窗口刷新InvalidateRect和UpdateWindow RedrawWindow
  5. 2020 操作系统第二次习题
  6. android 解析雅虎天气
  7. Dom4j操作XML
  8. 图像无损、有损压缩方法调研
  9. Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)
  10. 移植u-boot.2012.04.01
  11. C#WinForm的TextBox 按TAB键让光标按照指定顺序走
  12. matlab神经网络训练方法,matlab神经网络模型导出
  13. 惩罚函数法例题matlab,外点惩罚函数法例题
  14. AppStore下载数据查看
  15. 企业为什么会遭到DDoS攻击?被DDoS攻击该怎么办?
  16. 【雕爷学编程】Arduino动手做(108)---GY-521三轴模块
  17. 首字母大写--C++实现
  18. UIPinchGestureRecognizer 放大、缩小手势
  19. Android 局部刷新
  20. Android Webview完美支持播放各种视频。(解决无法播放优酷视频的问题以及周末无法播放优酷视频的问题)

热门文章

  1. X265整体流程-Create
  2. struts 依赖包
  3. Happy Holidays and Season's Greetings Everyone!
  4. Oracle中start with...connect by prior子句用法
  5. 【Java面试题】34 List 、Map、Set 区别?
  6. JS模式--状态模式(状态机)
  7. PXE+kickstart自动安装ubuntu14.04
  8. java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware
  9. 寻找丢失的数字(二)
  10. Apache+Tomcat中支持“UTF-8”编码的中文地址