Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.07.2012, 17:47
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

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?
Помогите разобратся.
Ответить с цитированием
  #2 (permalink)  
Старый 13.07.2012, 13:28
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

неужели такой сложный вопрос?
Ответить с цитированием
  #3 (permalink)  
Старый 13.07.2012, 18:26
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

Сообщение от cyber
не пойму почему в старых ИЕ он срабатывает после полной загрузки страницы, как я понял функция tryScroll , должна срабатывает до загрузки картинок?
а что, если так же, по нулевому таймауту, проверять document.body.innerHTML, или что-то в этом роде?
Ответить с цитированием
  #4 (permalink)  
Старый 13.07.2012, 20:14
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

Сообщение от melky Посмотреть сообщение
в первый раз это увидел. отсебятина?
угу=)
вот что получилось
<!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>
Ответить с цитированием
  #5 (permalink)  
Старый 13.07.2012, 20:33
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

блин лоханулся, не работает старых ИЕ =)
сам ответил на свой вопрос(почему не этот вариант не используется)
Ответить с цитированием
  #6 (permalink)  
Старый 13.07.2012, 21:19
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

Сообщение от melky Посмотреть сообщение
а что, если так же, по нулевому таймауту, проверять 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);
						}
				
				}());
			  
		
		} 
}
Ответить с цитированием
  #7 (permalink)  
Старый 13.07.2012, 22:05
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от cyber
получилась такая простенькая кроссбразуерная функция
Что-то мне подсказывает что она будет работать неправильно
Ответить с цитированием
  #8 (permalink)  
Старый 13.07.2012, 22:13
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

Сообщение от Раед Посмотреть сообщение
Что-то мне подсказывает что она будет работать неправильно
проверил работает вроде нормально(в старых ие тоже)
Ответить с цитированием
  #9 (permalink)  
Старый 14.07.2012, 00:22
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от cyber
проверил работает вроде нормально(в старых ие тоже)
Пробуйте на страницах с большим количеством разнообразного контента
Ответить с цитированием
  #10 (permalink)  
Старый 14.07.2012, 01:05
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

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

Поэтому этот вариант никто и не использует, потому как он не гарантирует полной загрузки документа. Это вы сможете ощутить при огромном количестве тегов на странице..
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 14.07.2012 в 01:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по DOMContentLoaded Newbie_ Events/DOM/Window 10 19.08.2010 20:00
DOMContentLoaded и defer HelpeR Events/DOM/Window 9 16.11.2009 15:36