• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

jQuery的ready方法实现原理分析

php 搞代码 4年前 (2022-01-04) 13次浏览 已收录 0个评论

jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,首先,我们来看jQuery的代码

DOMContentLoaded = function() {  //取消事件监听,执行ready方法 if ( document.addEventListener ) {    document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );  jQuery.ready(); }  else if ( document.readyState === "complete" ) {  document.detachEvent( "onreadystatechange", DOMContentLoaded );  jQuery.ready(); }};

jQuery.ready.promise = function( obj ) { if ( !readyList ) {   readyList = jQuery.Deferred();   //表示页面已经加载完成,直接调用 ready方法  if ( document.readyState === "complete" ) {   //将 jQuery.ready压入异步消息队列,设置延迟时间1毫秒(注意,有些浏览器延迟不能小于4毫秒)   setTimeout( jQuery.ready);  }  else if ( document.addEventListener ) //  {    //监听DOM加载完成   document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );    //这里是为了确保所有ready执行结束,如果DOMContentLoaded方法执行了,将有一个状态值 isReady被设置为true,因此,    //ready方法一旦执行,那么将只执行一次,window.addEventListener中的ready 将被 return 中断   window.addEventListener( "load", jQuery.ready, false );    } else {   //低版本的IE浏览器   document.attachEvent( "onreadystatechange", DOMContentLoaded );   window.attachEvent( "onload", jQuery.ready );    var to<b style="color:transparent">来源gao@!dai!ma.com搞$$代^@码网</b>p = false;    try {    top = window.frameElement == null && document.documentElement;   } catch(e) {}    if ( top && top.doScroll ) //剔除iframe的成分   {    (function doScrollCheck() {     if ( !jQuery.isReady ) {       try {       //根据bug来兼容低版本的IE http://javascript.nwbox.com/IEContentLoaded/       top.doScroll("left");      } catch(e) {       //由于低版本的IE 浏览器,onreadystatechange事件不可靠,因此需要根据各个bug来判断页面是否已加载完成       return setTimeout( doScrollCheck, 50 );      }       jQuery.ready();     }    })();   }  } } return readyList.promise( obj );};

ready: function( wait ) {  if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {  //判断页面是否已完成加载并且是否已经执行ready方法  return; }   if ( !document.body ) {  return setTimeout( jQuery.ready ); }     jQuery.isReady = true; //指示ready方法已被执行     if ( wait !== true && --jQuery.readyWait > 0 ) {  return; }     readyList.resolveWith( document, [ jQuery ] );     if ( jQuery.fn.trigger ) {  jQuery( document ).trigger("ready").off("ready"); }},

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:jQuery的ready方法实现原理分析
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址