数据加载完成执行:
  $(window).load(function(){ ... });
  进入页就执行,不论等数据是否加载完成:
  $(document).ready(function(){ ... })
  这个还可以简写成
  $(function(){ ... });

  以下为解析:$(document).ready、body.Onload()和 $(window).load的区别

  1、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>

  刷新也只执行一次

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

function loadpopup(){
if (get_cookie('popped')==''){
//这里放要执行的代码,这样就现实了只执行一次的
  document.cookie="popped=yes" ;
  }
} < body onload="loadpopup()">

  调试技巧

  为了调试方便,有时候在所有的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中,所以第二段代码无法正确显示。

  非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>

 

JQuery 之 在数据加载完成后才自动执行函数的更多相关文章

  1. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  2. Android下设置ListView数据加载完成后执行layoutanimation

    今天使用android的volley框架写了一个简单的网络天气获取的demo. 承载数据的空间是ListView 因为是网络加载,必然先要设置ListView的默认数据,我设置的就是那个Loading ...

  3. asp.net中UpdatePanel数据加载成功后回调

    //添加UpdatePanel加载成功后执行的js方法 Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(onPageLoade ...

  4. 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库

    动态加载Mui类库: // ==UserScript== // @name // @version 1.4.0 // @author zzdhidden@gmail.com // @namespace ...

  5. jqGrid 加载完jqGrid之后可以执行函数的方法

    , gridComplete: function() { jQuery('#first_gridpager').html("首页 "); jQuery('#prev_gridpag ...

  6. jQuery插件--根据数据加载的进度动画案例

    css: *{ margin:; padding:; } @media screen and (min-width:320px){ html{font-size:12px;}} @media scre ...

  7. vue.js学习之 如何在better-scroll加载完成后,自动滚动到最底部

    首先我们需要使用scrollTo这个方法: scrollTo(x, y, time, easing) 参数: {Number} x 横轴坐标(单位 px) {Number} y 纵轴坐标(单位 px) ...

  8. 需求:在浏览器加载完毕后,自动播放视频:出现play() failed because the user didn't interact with the document first.错误

    解决方法:给video标签加入<video muted></video> 静音即可. Chrome 66为了避免标签产生随机噪音. 参考链接:https://juejin.im ...

  9. window.onload 、body.onload 以及 jQuery 等dom加载完成后执行脚本的区别

    1.关于window.onload 和 body.onload 的区别 当我们将onload 事件写在body元素上时,真正执行的其实是window对象的onload事件.因素HTMl页面中没有win ...

随机推荐

  1. C#编程(二十八)----------泛型类的功能

    泛型类的功能 在创建泛型类时,还需要一些其他的C#关键字.例如,不能把null赋予泛型类型.此时,可以使用default关键字.如果泛型类型不需要object类的功能,但需要调用泛型类上的某些特定方法 ...

  2. 自定义兼容多种Protobuf协议的编解码器

    <从零开始搭建游戏服务器>自定义兼容多种Protobuf协议的编解码器 直接在protobuf序列化数据的前面,加上一个自定义的协议头,协议头里包含序列数据的长度和对应的数据类型,在数据解 ...

  3. Netty入门实例及分析

    什么是netty?以下是官方文档的简单介绍: The Netty project  is an effort to provide an asynchronous event-driven netwo ...

  4. 每天一个linux命令-curl命令

    下载文件 如果我们想要下载文件,而不是查看,那么可以使用如下命令: curl -O http://mif.polimercolor.ru/mifsoft/MDict.zip 以上命令会下载文件并以原名 ...

  5. IOS应用提交所需的ICON

    如果提交的ipa包中,未包含必要的Icon就会收到类似的通知,为什么偏偏是Icon-76呢? 因为我们开发的游戏,默认是支持iphone以及ipad的,根据官方提供的参考 Icon-76.png是必须 ...

  6. fabric 清理环境 运行SDK

    清理环境: rm -rf /tmp/* rm -rf ~/.hfc-key-store/ 启动网络: docker  ps -a create channel: join channel: 清理npm ...

  7. git如何删除远端不存在的本地分支?

    问题:远端分支删除后,如何删除之前拉取的本地分支? 答案: git fetch -p git remote show origin 可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息 ...

  8. eclipse 创建聚合maven项目

    本人不想花太多时间去排版,所以这里排版假设不好看,请多多包涵! 一直都在用maven,可是却基本没有自己创建过maven项目,今天也试着创建一个. 1.打开eclipse.然后new,other,然后 ...

  9. tensorflow 卷积/反卷积-池化/反池化操作详解

    Plese see this answer for a detailed example of how tf.nn.conv2d_backprop_input and tf.nn.conv2d_bac ...

  10. javascript 的面向对象特性参考

    最近在看用javascript+css实现rich client.javascript 也是一个蛮有意思的语言.特别是其面向对象的实现和其他“标准”的OO launguage有很大的不同.但是,都是动 ...