2009-08-05 10 views

Respuesta

22

Esto se aprovecha de DOMContentLoaded - que dispara antes onload - pero permite que sea fiel en toda su escasa presencia ...

window.onload - Dean Edwards - La entrada de blog habla más sobre él - y aquí está el código completo copiado del comentarios de ese mismo blog.

// Dean Edwards/Matthias Miller/John Resig 

function init() { 
    // quit if this function has already been called 
    if (arguments.callee.done) return; 

    // flag this function so we don't do the same thing twice 
    arguments.callee.done = true; 

    // kill the timer 
    if (_timer) clearInterval(_timer); 

    // do stuff 
}; 

/* for Mozilla/Opera9 */ 
if (document.addEventListener) { 
    document.addEventListener("DOMContentLoaded", init, false); 
} 

/* for Internet Explorer */ 
/*@cc_on @*/ 
/*@if (@_win32) 
    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(); // call the onload handler 
    } 
    }; 
/*@end @*/ 

/* for Safari */ 
if (/WebKit/i.test(navigator.userAgent)) { // sniff 
    var _timer = setInterval(function() { 
    if (/loaded|complete/.test(document.readyState)) { 
     init(); // call the onload handler 
    } 
    }, 10); 
} 

/* for other browsers */ 
window.onload = init; 
-1

Existen varios métodos diferentes que debe utilizar para diferentes navegadores. Sin embargo, las bibliotecas como jQuery le ofrecen una interfaz multiproveedor que lo maneja todo para usted.

19

¿Por qué no utilizar el window propio onload evento?

window.onload = function() { 
     alert("LOADED!"); 
} 

Si no me equivoco, eso es compatible en todos los navegadores.

+17

window.onload ocurre después/todo/está cargado, incluidas las imágenes, etc. Si desea comenzar a manipular el DOM lo antes posible para evitar el retraso de inicio, no puede usar window.onload. – rpjohnst

9

document.body.onload es un multi-navegador, sino un mecanismo legado que sólo permite una sola llamada de retorno (no se puede asignar varias funciones a la misma).

La alternativa más cercana "estándar", addEventListener no es compatible con Internet Explorer (que utiliza attachEvent), por lo que es probable que desee utilizar una biblioteca (jQuery, MooTools, prototype.js, etc.) para abstraer la cruzada fealdad del navegador para ti.

+1

Internet Explorer admite 'addEventListener' [a partir de la versión 9] (http://msdn.microsoft.com/en-us/library/ie/ff975245 (v = vs.85) .aspx). – Sampson

2

La idea de jcalfee314 funcionó para mí - Tenía un window.onload = onLoad que significaba que las funciones en <body onload="..."> no se estaban llamando (que no tengo control).

que esto esté arreglado que:

oldOnLoad = window.onload 
window.onload = onLoad; 

function onLoad() 
{ 
oldOnLoad(); 
... 
} 

Editar: Firefox no le gustaba oldOnLoad = document.body.onload;, por lo reemplazó con oldOnLoad = window.onload.

+0

Como Rusky señaló en la respuesta de Andreas, window.onload es diferente de document.body.onload; sucede una vez que todo está cargado, en lugar de solo el DOM. – Muhd

+0

Dado que Firefox, al menos desde la versión 10, admite oldOnLoad = document.body.onload, estoy usando una variación de esto: if (oldOnLoad = document.body.onload) {document.body.onload = onLoad; } else {oldOnLoad = window.onload; window.onload = onLoad; }. Esto parece darme lo que quiero con la mayoría de los navegadores, con la opción window.onload como alternativa cuando sea necesario. – arlomedia

14

Cruz evento navegador window.load

function load(){} 

window[ addEventListener ? 'addEventListener' : 'attachEvent' ](addEventListener ? 'load' : 'onload', load) 
+0

¡Corto y al punto! –

+1

Cosas increíbles :) – Jake

-3

Por qué no usar jQuery?

$(document).ready(function(){})) 

Por lo que sé, esta es la solución perfecta.

+0

Esto se dispara antes de que se cargue el documento completo. – rbrundritt

Cuestiones relacionadas