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 的实现方式,请大家参考
- function bindReady(){
- if ( readyBound ) return;
- readyBound = true;
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", function(){
- document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
- jQuery.ready();
- }, false );
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent("onreadystatechange", function(){
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", arguments.callee );
- jQuery.ready();
- }
- });
- // If IE and not an iframe
- // continually check to see if the document is ready
- if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" )
- (function(){
- if ( jQuery.isReady ) return;
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch( error ) {
- 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 );
- }
YUI:
- /*! DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
- // Internet Explorer: use the readyState of a defered script.
- // This isolates what appears to be a safe moment to manipulate
- // the DOM prior to when the document's readyState suggests
- // it is safe to do so.
- if (EU.isIE) {
- // Process onAvailable/onContentReady items when the
- // DOM is ready.
- YAHOO.util.Event.onDOMReady(
- YAHOO.util.Event._tryPreloadAttach,
- YAHOO.util.Event, true);
- var n = document.createElement('p');
- EU._dri = setInterval(function() {
- try {
- // throws an error if doc is not ready
- n.doScroll('left');
- clearInterval(EU._dri);
- EU._dri = null;
- EU._ready();
- n = null;
- } catch (ex) {
- }
- }, EU.POLL_INTERVAL);
- // The document's readyState in Safari currently will
- // change to loaded/complete before images are loaded.
- } else if (EU.webkit && EU.webkit < 525) {
- EU._dri = setInterval(function() {
- var rs=document.readyState;
- if ("loaded" == rs || "complete" == rs) {
- clearInterval(EU._dri);
- EU._dri = null;
- EU._ready();
- }
- }, EU.POLL_INTERVAL);
- // FireFox and Opera: These browsers provide a event for this
- // moment. The latest WebKit releases now support this event.
- } else {
- EU._simpleAdd(document, "DOMContentLoaded", EU._ready);
- }
- /
- EU._simpleAdd(window, "load", EU._load);
- EU._simpleAdd(window, "unload", EU._unload);
- EU._tryPreloadAttach();
- })();
EXTJS:
- function initDocReady(){
- var COMPLETE = "complete";
- docReadyEvent = new Ext.util.Event();
- if (Ext.isGecko || Ext.isOpera) {
- DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false);
- } else if (Ext.isIE){
- DOC.write("<S"+'CRIPT id=" + IEDEFERED + " src="/'+'/:" defer="defer"></S'+"CRIPT>");
- DOC.getElementById(IEDEFERED).onreadystatechange = function(){
- if(this.readyState == COMPLETE){
- fireDocReady();
- }
- };
- } else if (Ext.isWebKit){
- docReadyProcId = setInterval(function(){
- if(DOC.readyState == COMPLETE) {
- fireDocReady();
- }
- }, 10);
- }
- // no matter what, make sure it fires on load
- E.on(WINDOW, "load", fireDocReady);
- };
总结各大主流框架的做法,写了以下这个版本。主要是尽量的做到优化并考虑到FF2下的Bug,提供一个是否使用DOMContentLoaded的开关配置。
- /*
- * 注册浏览器的DOMContentLoaded事件
- * @param { Function } onready [必填]在DOMContentLoaded事件触发时需要执行的函数
- * @param { Object } config [可选]配置项
- */
- function onDOMContentLoaded(onready,config){
- //浏览器检测相关对象,在此为节省代码未实现,实际使用时需要实现。
- //var Browser = {};
- //设置是否在FF下使用DOMContentLoaded(在FF2下的特定场景有Bug)
- this.conf = {enableMozDOMReady:true};
- if( config )
- for( var p in config)
- this.conf[p] = config[p];
- var isReady = false;
- function doReady(){
- if( isReady ) return;
- //确保onready只执行一次
- isReady = true;
- onready();
- }
- /*IE*/
- if( Browser.ie ){
- (function(){
- if ( isReady ) return;
- try {
- document.documentElement.doScroll("left");
- } catch( error ) {
- setTimeout( arguments.callee, 0 );
- return;
- }
- doReady();
- })();
- window.attachEvent('onload',doReady);
- }
- /*Webkit*/
- else if (Browser.webkit && Browser.version < 525){
- (function(){
- if( isReady ) return;
- if (/loaded|complete/.test(document.readyState))
- doReady();
- else
- setTimeout( arguments.callee, 0 );
- })();
- window.addEventListener('load',doReady,false);
- }
- /*FF Opera 高版webkit 其他*/
- else{
- if( !Browser.ff || Browser.version != 2 || this.conf.enableMozDOMReady)
- document.addEventListener( "DOMContentLoaded", function(){
- document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
- doReady();
- }, false );
- window.addEventListener('load',doReady,false);
- }
- }
2.Onload
onload要等到所有页面元素加载完成才会触发, 包括页面上image、flash、iframe等内容都加载完毕才会执行。
另外 onload 是window 的事件 可以直接只用window.οnlοad=function(){}使用
DomContentLoaded是document 上的事件续注册后使用 document.addEventListener('DomContentLoaded',function(){});