`
zha_zi
  • 浏览: 593530 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

DOMContentLoaded与 onload的区别

 
阅读更多

1.DOMContentLoaded

DOMContentLoaded是FF,Opera 9的特有的Event, 当所有DOM解析完以后会触发这个事件。

 jquery的ready(示例:$("selector).ready(function(){})),MT的onDomReady

 IE下是scrollleft事件可以时就表示DomcontentLoaded: var temp= document.createElement('div');temp.doScroll('left');

 Fired on a Window object when a document's DOMcontent is finished loading, but unlike "load", does not wait untilall images are loaded. Used for example by GreaseMonkey to sneak in to alterpages before they are displayed.

This event, as many others on this page, is dispatched to"trusted" targets only; for example, it is not dispatched to thecontent of the main browser object in Firefox, even if it comes from a chrome:/URI.

一下是jQuery ,yui ,extjs 三个框架对domcontentloaded 的实现方式,请大家参考

  1. function bindReady(){     
  2.     if ( readyBound ) return;     
  3.     readyBound = true;     
  4.     
  5.     // Mozilla, Opera and webkit nightlies currently support this event     
  6.     if ( document.addEventListener ) {     
  7.         // Use the handy event callback     
  8.         document.addEventListener( "DOMContentLoaded"function(){     
  9.             document.removeEventListener( "DOMContentLoaded", arguments.callee, false );     
  10.             jQuery.ready();     
  11.         }, false );     
  12.     
  13.     // If IE event model is used     
  14.     } else if ( document.attachEvent ) {     
  15.         // ensure firing before onload,     
  16.         // maybe late but safe also for iframes     
  17.         document.attachEvent("onreadystatechange"function(){     
  18.             if ( document.readyState === "complete" ) {     
  19.                 document.detachEvent( "onreadystatechange", arguments.callee );     
  20.                 jQuery.ready();     
  21.             }     
  22.         });     
  23.     
  24.         // If IE and not an iframe     
  25.         // continually check to see if the document is ready     
  26.         if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) 
  27. (function(){     
  28.             if ( jQuery.isReady ) return;     
  29.     
  30.             try {     
  31.                 // If IE is used, use the trick by Diego Perini     
  32.                 // http://javascript.nwbox.com/IEContentLoaded/     
  33.                 document.documentElement.doScroll("left");     
  34.             } catch( error ) {     
  35.                 setTimeout( arguments.callee, 0 );     
  36.                 return;     
  37.             }     
  38.     
  39.             // and execute any waiting functions     
  40.             jQuery.ready();     
  41.         })();     
  42.     }     
  43.     
  44.     // A fallback to window.onload, that will always work     
  45.     jQuery.event.add( window, "load", jQuery.ready );     
  46. }   

 

        YUI:

  1. /*! DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */    
  2.     
  3.         // Internet Explorer: use the readyState of a defered script.     
  4.         // This isolates what appears to be a safe moment to manipulate     
  5.         // the DOM prior to when the document's readyState suggests     
  6.         // it is safe to do so.     
  7.         if (EU.isIE) {     
  8.     
  9.             // Process onAvailable/onContentReady items when the     
  10.             // DOM is ready.     
  11.             YAHOO.util.Event.onDOMReady(     
  12.                     YAHOO.util.Event._tryPreloadAttach,     
  13.                     YAHOO.util.Event, true);     
  14.     
  15.             var n = document.createElement('p');      
  16.    
  17.             EU._dri = setInterval(function() {    
  18.                 try {    
  19.                     // throws an error if doc is not ready    
  20.                     n.doScroll('left');    
  21.                     clearInterval(EU._dri);    
  22.                     EU._dri = null;    
  23.                     EU._ready();    
  24.                     n = null;    
  25.                 } catch (ex) {    
  26.                 }    
  27.             }, EU.POLL_INTERVAL);     
  28.    
  29.         // The document's readyState in Safari currently will     
  30.         // change to loaded/complete before images are loaded.     
  31.         } else if (EU.webkit && EU.webkit < 525) {     
  32.     
  33.             EU._dri = setInterval(function() {     
  34.                 var rs=document.readyState;     
  35.                 if ("loaded" == rs || "complete" == rs) {     
  36.                     clearInterval(EU._dri);     
  37.                     EU._dri = null;     
  38.                     EU._ready();     
  39.                 }     
  40.             }, EU.POLL_INTERVAL);      
  41.     
  42.         // FireFox and Opera: These browsers provide a event for this     
  43.         // moment.  The latest WebKit releases now support this event.     
  44.         } else {     
  45.     
  46.             EU._simpleAdd(document, "DOMContentLoaded", EU._ready);     
  47.     
  48.         }     
  49.         /////////////////////////////////////////////////////////////     
  50.     
  51.         EU._simpleAdd(window, "load", EU._load);     
  52.         EU._simpleAdd(window, "unload", EU._unload);     
  53.         EU._tryPreloadAttach();     
  54.     })();  

 

        EXTJS:

  1. function initDocReady(){     
  2.     var COMPLETE = "complete";     
  3.     
  4.     docReadyEvent = new Ext.util.Event();     
  5.     if (Ext.isGecko || Ext.isOpera) {     
  6.         DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false);     
  7.     } else if (Ext.isIE){     
  8.         DOC.write("<S"+'CRIPT id=" + IEDEFERED + " src="/'+'/:" defer="defer"></S'+"CRIPT>");     
  9.         DOC.getElementById(IEDEFERED).onreadystatechange = function(){     
  10.         if(this.readyState == COMPLETE){     
  11.             fireDocReady();     
  12.         }     
  13.         };     
  14.     } else if (Ext.isWebKit){     
  15.         docReadyProcId = setInterval(function(){     
  16.         if(DOC.readyState == COMPLETE) {     
  17.             fireDocReady();     
  18.          }     
  19.         }, 10);     
  20.     }     
  21.     // no matter what, make sure it fires on load     
  22.     E.on(WINDOW, "load", fireDocReady);     
  23. };    

 

 

总结各大主流框架的做法,写了以下这个版本。主要是尽量的做到优化并考虑到FF2下的Bug,提供一个是否使用DOMContentLoaded的开关配置。

 

  1. /*    
  2.  * 注册浏览器的DOMContentLoaded事件    
  3.  * @param { Function } onready [必填]在DOMContentLoaded事件触发时需要执行的函数    
  4.  * @param { Object } config [可选]配置项    
  5.  */    
  6. function onDOMContentLoaded(onready,config){     
  7.     //浏览器检测相关对象,在此为节省代码未实现,实际使用时需要实现。     
  8.     //var Browser = {};     
  9.     //设置是否在FF下使用DOMContentLoaded(在FF2下的特定场景有Bug)     
  10.     this.conf = {enableMozDOMReady:true};     
  11.     if( config )     
  12.     forvar p in config)     
  13.         this.conf[p] = config[p];     
  14.     
  15.     var isReady = false;     
  16.     function doReady(){     
  17.         if( isReady ) return;     
  18.         //确保onready只执行一次     
  19.         isReady = true;     
  20.         onready();     
  21.     }     
  22.     /*IE*/    
  23.     if( Browser.ie ){     
  24.         (function(){     
  25.             if ( isReady ) return;     
  26.             try {     
  27.                 document.documentElement.doScroll("left");     
  28.             } catch( error ) {     
  29.                 setTimeout( arguments.callee, 0 );     
  30.                 return;     
  31.             }     
  32.             doReady();     
  33.         })();     
  34.         window.attachEvent('onload',doReady);     
  35.     }     
  36.     /*Webkit*/    
  37.     else if (Browser.webkit && Browser.version < 525){     
  38.         (function(){     
  39.             if( isReady ) return;     
  40.             if (/loaded|complete/.test(document.readyState))     
  41.                 doReady();     
  42.             else    
  43.                 setTimeout( arguments.callee, 0 );     
  44.         })();     
  45.         window.addEventListener('load',doReady,false);     
  46.     }     
  47.     /*FF Opera 高版webkit 其他*/    
  48.     else{     
  49.         if( !Browser.ff || Browser.version != 2 || this.conf.enableMozDOMReady)     
  50.             document.addEventListener( "DOMContentLoaded"function(){     
  51.                 document.removeEventListener( "DOMContentLoaded", arguments.callee, false );     
  52.                 doReady();     
  53.             }, false );     
  54.         window.addEventListener('load',doReady,false);     
  55.     }     
  56.     
  57. }   

2.Onload

 onload要等到所有页面元素加载完成才会触发, 包括页面上image、flash、iframe等内容都加载完毕才会执行。

 

另外 onload 是window 的事件 可以直接只用window.onload=function(){}使用

        DomContentLoaded是document 上的事件续注册后使用 document.addEventListener('DomContentLoaded',function(){});

      

分享到:
评论

相关推荐

    js之onload事件的一点使用心得

    这意味着,页面上所有的内容都已经被完全加载并渲染后,才会执行与onload事件绑定的函数。 这里需要特别注意的是,我们在使用window.onload时的两种不同写法。在示例中,第一种写法为: ```javascript window....

    页面中body onload 和 [removed] 冲突的问题的解决

    可以通过检查 `window.onload` 是否已经定义并将其转换为函数,然后将其与新函数合并。以下是一个示例: ```javascript var o = window.onload; if ((typeof o)=='function') { window.onload = function(){ o...

    IE中图片的onload事件无效问题和解决方法

    此外,如果需要在所有浏览器中保持一致的行为,还可以考虑使用`window.onload`或`document.DOMContentLoaded`事件来确保在所有图片加载完毕后再执行后续操作。但请注意,这些全局事件可能会影响整个页面的加载时机,...

    jQuery中的read和JavaScript中的onload函数的区别

    特别地,当涉及页面加载完毕时的事件处理函数时,我们必须区分jQuery中的$(document).ready()与JavaScript原生的window.onload()方法。 首先,JavaScript的window.onload事件处理函数是一个传统的JavaScript事件,...

    各浏览器对link标签onload/onreadystatechange事件支持的差异分析

    另外,可以考虑使用`window.onload`或`DOMContentLoaded`事件来确保整个页面资源(包括外部样式表)加载完毕后再执行特定操作。 总的来说,onload和onreadystatechange事件在浏览器之间的支持并不统一,这要求...

    一些主流JS框架中DOMReady事件的实现小结

    描述中提到了window.onload事件与DOMContentLoaded事件的区别。window.onload事件是等整个页面完全加载完成后才会触发,这包括所有图片、脚本、样式表、iframe等资源,通常会较晚触发,而DOMContentLoaded仅需DOM树...

    解析页面加载与js函数的执行 onload or ready

    在W3C标准中,DOMContentLoaded事件与ready事件类似,它会在DOM完全加载和解析完成后触发,而不必等待样式表、图片和子框架的加载完成。这为开发者提供了更好的灵活性和控制能力。现在许多流行的JavaScript库(例如...

    js onload处理html页面加载之后的事件

    此外,window.onload与DOMContentLoaded事件也是有区别的。window.onload关注的是整个页面完全加载完毕,包括样式表、图片、脚本等资源。而DOMContentLoaded事件则只需要DOM结构加载完毕后就会触发,这个时间点通常...

    仅img元素创建后不添加到文档中会执行onload事件的解决方法

    3. **使用`defer`属性**:对于`&lt;script&gt;`元素,可以使用`defer`属性确保脚本在DOM解析完成后、`DOMContentLoaded`事件触发之前执行。但这不适用于`&lt;img&gt;`元素。 4. **使用`new Image()`构造函数**:在JavaScript中...

    async与defer的区别

    形象的描述了async与defer的区别,简单易懂的理解 async是异步执行,异步下载完毕后就会执行,不确保执行顺序,一定在 onload前,但不确定在 DOMContentLoaded事件的前或后 defer是延迟执行,在浏览器看起来的效果像...

    Jquery知识点一 Jquery的ready和Dom的onload的区别

    这是因为`jQuery`会监听DOM的`DOMContentLoaded`事件,一旦这个事件触发,`ready`函数内的代码就会运行。例如: ```javascript $(document).ready(function() { alert("加载结束"); }); ``` 上面的代码会在DOM...

    js 某个页面监听事件渲染完毕的时间.docx

    `window.onload`和`DOMContentLoaded`是两个关键的事件,用于监听页面加载的不同阶段。它们各自有其应用场景和优势。 首先,`window.onload`事件是在整个页面(包括HTML、CSS、JavaScript、图片和其他外部资源)...

    offsetHeight在OnLoad中获取为0的现象

    在其他浏览器中,通常使用 `addEventListener` 监听 `DOMContentLoaded` 或 `window.onload` 事件来确保元素已经完全加载并计算尺寸。 总的来说,`offsetHeight` 在 `onload` 事件中获取为 0 主要是因为浮动布局...

    js 某个页面监听事件渲染完毕的时间.pdf

    JavaScript页面渲染完毕时间的监听是前端开发者不可或缺...通过合理选择和使用`window.onload`、`$(document).ready`或`DOMContentLoaded`事件,我们可以确保在正确的时间执行必要的操作,从而提升网页的性能和交互性。

    somepjs-document-onload-dc-web-102819

    了解DOMContentLoaded为什么如此重要 在DOMContentLoaded上设置一个事件 介绍 使用JavaScript的重要部分是确保您的代码在正确的时间运行。 有时您可能不得不添加一些额外的代码,以确保您的代码在页面准备就绪之前...

    littlepjs-document-onload-dc-web-120919

    了解DOMContentLoaded为什么如此重要 在DOMContentLoaded上设置一个事件 介绍 使用JavaScript的重要部分是确保您的代码在正确的时间运行。 有时您可能不得不添加一些额外的代码,以确保您的代码在页面准备就绪之前...

    fewpjs-document-onload-rcdd_202104_tur_few

    了解DOMContentLoaded为什么如此重要 在DOMContentLoaded上设置一个事件 介绍 使用JavaScript的重要部分是确保您的代码在正确的时间运行。 有时您可能不得不添加一些额外的代码,以确保您的代码在页面准备就绪之前...

    addonload:添加多个[removed]函数的简单函数

    在JavaScript编程领域,"addonload: 添加多个[removed]函数的简单函数"是一个与扩展功能或模块加载相关的主题。在JavaScript环境中,特别是浏览器或Node.js环境中,开发人员经常需要加载和管理自定义的功能或第三方...

    在DOM加载完成时运行的代码,可以这样写:

    总结来说,确保代码在DOM加载完成后再执行是网页开发中的基础实践,可以利用jQuery的`$(document).ready()`或者原生JavaScript的`DOMContentLoaded`和`window.onload`事件来实现这一目标。正确使用这些方法可以优化...

    基于javascript原生判断DOM是否加载完毕

    与DOMContentLoaded事件不同,onload事件会在整个页面的资源(包括DOM、样式表、图片、flash等)完全加载完成后触发。这意味着onload事件标志着整个页面加载的结束。它适合用来执行依赖于页面全部资源加载完成后的...

Global site tag (gtag.js) - Google Analytics