Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   DOMContentLoaded (https://javascript.ru/forum/events/29819-domcontentloaded.html)

cyber 12.07.2012 17:47

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?
Помогите разобратся.

cyber 13.07.2012 13:28

неужели такой сложный вопрос?

melky 13.07.2012 18:26

Цитата:

Сообщение от cyber
Почему для браузеров <...> сделать добавление, и если боди еще не загрузился, то откладывать повторную попытку timeout?

в первый раз это увидел. отсебятина?

Цитата:

Сообщение от cyber
не пойму почему в старых ИЕ он срабатывает после полной загрузки страницы, как я понял функция tryScroll , должна срабатывает до загрузки картинок?

а что, если так же, по нулевому таймауту, проверять document.body.innerHTML, или что-то в этом роде?

cyber 13.07.2012 20:14

Цитата:

Сообщение от melky (Сообщение 188566)
в первый раз это увидел. отсебятина?

угу=)
вот что получилось
<!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>

cyber 13.07.2012 20:33

блин лоханулся, не работает старых ИЕ =)
сам ответил на свой вопрос(почему не этот вариант не используется)

cyber 13.07.2012 21:19

Цитата:

Сообщение от melky (Сообщение 188566)
а что, если так же, по нулевому таймауту, проверять document.body.innerHTML, или что-то в этом роде?

спасибо за подсказку.
получилась такая простенькая кроссбразуерная функция
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);
						}
				
				}());
			  
		
		} 
}

Раед 13.07.2012 22:05

Цитата:

Сообщение от cyber
получилась такая простенькая кроссбразуерная функция

Что-то мне подсказывает что она будет работать неправильно

cyber 13.07.2012 22:13

Цитата:

Сообщение от Раед (Сообщение 188594)
Что-то мне подсказывает что она будет работать неправильно

проверил работает вроде нормально(в старых ие тоже)

Раед 14.07.2012 00:22

Цитата:

Сообщение от cyber
проверил работает вроде нормально(в старых ие тоже)

Пробуйте на страницах с большим количеством разнообразного контента

devote 14.07.2012 01:05

Цитата:

Сообщение от Раед
Что-то мне подсказывает что она будет работать неправильно

конечно будет работать не правильно... Ибо innerHTML у body появляется сразу после того как открывается тег body, а не когда оно закрывается, то-есть содержимое тега может быть не полным при его определении.. Так же в других случаях с appendChild или еще что-то..

это легко проверить:
<body>
<script>
    alert( document.body.innerHTML ); // хотя документ еще не сформирован
</script>
<div></div>
</body>
увидим лишь то что идет до тега script

Поэтому этот вариант никто и не использует, потому как он не гарантирует полной загрузки документа. Это вы сможете ощутить при огромном количестве тегов на странице..


Часовой пояс GMT +3, время: 01:37.