Это способ, которым jQuery оборачивает нужные вам функции - сниппету не требуется jQuery, и он совместим с различными браузерами. Я заменил все вызовы jQuery.ready () на yourcallback
- который нужно определить.
Что здесь происходит:
- сначала определяется функция
DOMContentLoaded
, которая будет использоваться при возникновении события DOMContentLoaded - это гарантирует, что обратный вызов вызывается только один раз.
- проверка, если документ уже загружен - если да, немедленно запустить обратный вызов
- в противном случае отыскивать функции (
document.addEventListener
/ document.attachEvent
) и привязывать к нему обратные вызовы (разные для IE и обычных браузеров, плюс обратный вызов onload)
Удалено из jQuery 1.4.3, функции bindReady () и DOMContentLoaded :
/*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/
// Cleanup functions for the document ready method
// attached in the bindReady handler
if ( document.addEventListener ) {
DOMContentLoaded = function() {
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
//jQuery.ready();
yourcallback();
};
} else if ( document.attachEvent ) {
DOMContentLoaded = function() {
// Make sure body exists, at least, in case IE gets a little overzealous
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", DOMContentLoaded );
//jQuery.ready();
yourcallback();
}
};
}
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
//return setTimeout( jQuery.ready, 1 );
// ^^ you may want to call *your* function here, similarly for the other calls to jQuery.ready
setTimeout( yourcallback, 1 );
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
//window.addEventListener( "load", jQuery.ready, false );
window.addEventListener( "load", yourcallback, 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", DOMContentLoaded);
// A fallback to window.onload, that will always work
window.attachEvent( "onload", yourcallback );
}
Это 51 строка чистого кода JavaScript, просто для надежной регистрации события. Насколько я знаю, более простого способа не существует. Здесь мы покажем, для чего подходят обертки, такие как jQuery: они обертывают возможности перехвата возможностей и отвратительные проблемы совместимости, так что вы можете сосредоточиться на чем-то другом.