zoukankan      html  css  js  c++  java
  • jquery 的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事件是要在页面的元素全部加载完了才触发的,这也包括页面上的图片,以及大的表格数据。如果页面上图片较多或图片太大,加载需要较多时间,就会导致页面无响应,或者用户做了其它操作了。

    而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()的内容。

    参考文章:1、http://www.cnblogs.com/kingwell/archive/2012/09/09/2677252.html

                  2、http://blog.csdn.net/xiebaochun/article/details/36375481

    -------------------------------------------------------------------------------关 于 我-----------------------------------------------------------------
    本人菜鸟一枚,平凡而普通,成为一名程序猿,为生活而努力,为理想而积累。
    爱好编程,喜欢钻研。
    目前供职TDX,专职前端开发。
    可以点此找到我
  • 相关阅读:
    比特币节点同步问题
    Vue用axios跨域访问数据
    vue之vue-cookies安装和使用说明
    vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版
    使用以太坊智能合约实现面向需要做凭证的企业服务帮助企业信息凭证区块链化
    将任意文件写入以太坊区块的方法,把重要事件,历史事件,人生轨迹加密记录到区块链永久封存
    Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确
    php小数加减精度问题,比特币计算精度问题
    Fabric架构:抽象的逻辑架构与实际的运行时架构
    国外互联网大企业(flag)的涨薪方式
  • 原文地址:https://www.cnblogs.com/wsun/p/3916487.html
Copyright © 2011-2022 走看看