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, время: 01:37. |