DOMContentLoaded
щас разбираюсь с событием DOMContentLoaded по этой статье http://javascript.ru/tutorial/events/ondomcontentloaded , и возникло пару вопросов, вот сам скрипт
function bindReady(handler){
var called = false
function ready() { // (1)
if (called) return
called = true
handler()
}
if ( document.addEventListener ) { // (2)
document.addEventListener( "DOMContentLoaded", function(){
ready()
}, false )
} else if ( document.attachEvent ) { // (3)
// (3.1)
if ( document.documentElement.doScroll && window == window.top ) {
function tryScroll(){
if (called) return
if (!document.body) return
try {
document.documentElement.doScroll("left")
ready()
} catch(e) {
setTimeout(tryScroll, 0)
}
}
tryScroll()
}
// (3.2)
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
ready()
}
})
}
// (4)
if (window.addEventListener)
window.addEventListener('load', ready, false)
else if (window.attachEvent)
window.attachEvent('onload', ready)
/* else // (4.1)
window.onload=ready
*/
}
не пойму почему в старых ИЕ он срабатывает после полной загрузки страницы, как я понял функция tryScroll , должна срабатывает до загрузки картинок? Почему для браузеров которые не поддерживают DOMContentLoaded , сделать добавление document.body.appendChild(), если боди еще не загрузился то откладывать повторную попытку timeout? Помогите разобратся. |
неужели такой сложный вопрос?
|
Цитата:
Цитата:
|
Цитата:
вот что получилось
<!DOCTYPE HTML>
<html>
<head>
<script>
var scr = document.createElement('script');
scr.type = 'text/javascript';
scr.innerHTML = 'handler()';
scr.id = 'DomLoadedScript';
(function body_end(){
try {
document.body.appendChild(scr);
} catch(e){
setTimeout(body_end,0);
}
}());
</script>
</head>
<body>
<script >
function handler(){
alert('готов');
}
</script>
<img src="http://worldoftanks.ru/dcont/fb/media/batchat_ru_june_clear/1920x1200.jpg">
<img id="img" src="http://wallpaper.goodfon.ru/image/302908-2880x1800.jpg"/>
</body>
</html>
|
блин лоханулся, не работает старых ИЕ =)
сам ответил на свой вопрос(почему не этот вариант не используется) |
Цитата:
получилась такая простенькая кроссбразуерная функция
function ready(fnc){
if(document.addEventListener){
document.addEventListener('DOMContentLoaded',fnc,false);
} else {
(function body_end(){
try {
document.body.innerHTML
fnc();
} catch(e){
setTimeout(body_end,0);
}
}());
}
}
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
это легко проверить:
<body>
<script>
alert( document.body.innerHTML ); // хотя документ еще не сформирован
</script>
<div></div>
</body>
увидим лишь то что идет до тега scriptПоэтому этот вариант никто и не использует, потому как он не гарантирует полной загрузки документа. Это вы сможете ощутить при огромном количестве тегов на странице.. |
| Часовой пояс GMT +3, время: 05:54. |