Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.08.2009, 12:21
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

Отслеживание готовности DOM-структуры
К сожалению мне сново пришлось создать тему, но я риально нигде немогу найти инфы ни в этой ветке, ни в статьях, ни в поисковиках.

В общем прочитал я в одной книжечке, что страница в браузере загружаеться так:
1. Синтаксический анализ HTML-разметки.
2. Загрузка внешних сценаривев.
3. Выполнение сценариев по мере их анализа в документе.
4. Полное формирование DOM-структуры HTML-кода.
5. Загрузка изображений и внешнего содержимого.
6. Завершение загрузки страницы.

И соответственно скриптик:
function domReady(f)
{
    // Если DOM уже загружена, немедленно выполнить функцию
    if (domReady.done) return f();

    // Если мы уже дополнили функцию
    if (domReady.timer) {
        // внести ее в список исполняемых
        domReady.ready.push(f);
    }else{
        // Подключение события завершения загрузки страницы
        // на тот случай, если ее загрузка закончится первой.
        addEvent(window, 'load', isDOMReady);
        test = function() {alert(111);}
        addEvent(window, 'load', test);
        // Инициализация массива исполняемых функций
        domReady.ready = [f];

        // Проверка DOM на готовность, проводимая как можно быстрее
        domReady.timer = setInterval(isDOMReady, 13);
    }
}
// Проверка DOM на готовность к перемещению по ее структуре
function isDOMReady()
{
    // Если мы уже определили готовность страницы - проигнорировать
    // дальнейшее выполнение
    if (domReady.done) return false;

    // Проверка доступности некотрых функций и элементов
    if(document && document.getElementsByTagName && document.getElementById && document.body) {
    alert(document.getElementById('search_module'))
        // Если они готовы, можно прекратить проверку
        clearInterval(domReady.timer);
        domReady.timer =  null;
        //removeEvent(window, 'load', isDOMReady);

        // Выполнение всех ожидавших функций
        for (var i = 0; i< domReady.ready.length; i++) {
            domReady.ready[i]();
        }

        // Сохранение того, что только что было сделано
        domReady.ready = null;
        domReady.done = true;
    }
}


Готовность DOM они там определяют по доступности методов и свойств:
document && document.getElementsByTagName && document.getElementById && document.body


Если добавить в загрузку допустим такую функцию:

domReady(function()
{
alert('DOM is ready!');
});

то мы и вправду получим alert() теоретически до загрузки картинок(теоретически, потому что я картинки до алерта уже видел, но только часть, возможно єто чемто связано с кєшированием..)

Но вот когда я попытался использовать эту функцию напрактике, то столкнулся с следущей проблемой:
Все функции выполняються по два раза. Первый раз по таймеру, причем они получают сбой изза того что getElementById существует, но вот самого id эллемента еще нету. Ну а второй раз уже все почеловечески запускаеться, по событию onload. Моих знаний нехватает, что бы обеспечить правильную работу этого скрипта. Я сейчас вижу только четыре варианта решения проблемы, которые вобщем-то значительно отличаються от начальной цели.
1. Переделать все функции, которые будут запускаться, что бы они сами проверяли наличие нужных им id в документе и возвращали false в случае неудачи, а в скрипте проверки готовности DOM дописать проверку значений возвращаемых функциями (но ето только для инициализирующих функций, которые ничего вобщемто возвращать недолжны)
2. Вставить файл скрипта вконце страницы. Минус - пока браузер не добереться до конца хтмл кода, страница будет малость некрасивая... Еще в той же книге я читал, что мол это не лучший вариант, так как оно вносит беспорядок: в HTML вносятся дополнение только ради инициализации (там основной код был в шапке, а внизу вызывалась функция инициализации. Я вообще планирую туда просто весь JS код кинуть, думаю тогда никаких беспорядков точно не будет или всетаки лучше размещать основной код в шапке?).
3. Забить на всю эту затею и переделать функцию domReady только на событие onload. Ет уже намного дальше от истинной цели, эдинственное что не прикольно, что юзер не будет видеть нормальной страницы, до того как она вся не загрузиться. И есть еще один минус... Бывает передача содержимого страницы затягиваеться надолго изза какогото эллемента, который не как не выдаеться браузеру. В итоге будет совсем уныло(
4. Хоть ето самый "лучший" вариант в данном случае, но я разместил его в самом конце, так как я не хочу использовать библиотеки, потому, что я не собираюся пользоваться ихними вспомогательными функциями (если не щитать готовность DOM), а +60кб к загрузке страницы изза одной функции мне незачем...

на данный момент мне 2 пункт кажеться самым оптимальным, поскольку у него скорость срабатывания будет быстрее чем у пункта 3, ну и тормозить загрузку он будет меньше чем 1 пункт (у меня такое чуство, что если каждых 13 милисекунд будут проверяться все функции, а их около 10, то это может малость замедлить загруку... что мне совсем не нужно)

Вот. Вроде бы все. Получилось немного очень много буков, так что сори Хотелось бы услышать ваши предложения, бо всетаки было бы лучше, если бы функции выполнялись до загрузки изображений и приетом находились всетаки в шапке... зарание спасибо

З.Ы. Еще я дето читал мол есть событие загрузки DOM для w3c браузеров, но как тогда поступить с ие?
книга: Рейсиг Дж. Javascript. Профессиональные приемы программирования. - СПб.: Питер 2008.
Ответить с цитированием
  #2 (permalink)  
Старый 18.08.2009, 12:41
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Книжку выкиньте, последовательность загрузки описана как-то странно, функция какая-то бредовая.

Сообщение от SleepWalker
Минус - пока браузер не добереться до конца хтмл кода, страница будет малость некрасивая...
А DomReady и не наступит, пока браузер не доберется до конца хтмл, на то он и DomReady.

Сообщение от SleepWalker
Забить на всю эту затею и переделать функцию domReady только на событие onload.
Не лучшая идея, какой-нибудь счетчик может начать тормозить.

Без библиотек у вас несколько выходов разной степени сложности:
1. Реализовать событие domready самому. Описание, например, здесь http://webo.in/articles/habrahabr/05-delayed-loading/
2. Размещать скрипты в конце body (лично я предпочитаю этот вариант, как наиболее универсальный и безболезненный).
3. Размещать вызов скриптов непосредственно после объявления элементов, используемых этими скриптами.
Ответить с цитированием
  #3 (permalink)  
Старый 18.08.2009, 12:47
Интересующийся
Отправить личное сообщение для SleepWalker Посмотреть профиль Найти все сообщения от SleepWalker
 
Регистрация: 09.11.2008
Сообщений: 15

Сообщение от Kolyaj Посмотреть сообщение
3. Размещать вызов скриптов непосредственно после объявления элементов, используемых этими скриптами.
От етого я уже давно отказался. Ето было первым вариантом. Но теперь я собрал все скрипты в один файл, потому что так быстрее грузиться страница. Чем меньше запросов, тем быстрее грузиться страница.

Сейчас прочитаю статейку, но наверное остановлюсь на
Сообщение от Kolyaj Посмотреть сообщение
2. Размещать скрипты в конце body (лично я предпочитаю этот вариант, как наиболее универсальный и безболезненный).
Я уже до вашего поста немного поексперементировать. Результат мне понравился. Такое впечатление, будто автор решил подвыпендриться, а я у него на поваду завелся в заблуждение..
Ответить с цитированием
  #4 (permalink)  
Старый 21.08.2009, 14:52
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Ну есть ведь уже написанные функции, возьмите пару-тройку фреймворков, посмотрите, как там реализовано, и вуаля -- у Вас есть своя функция. К чему изобретать велосипеды...
Ответить с цитированием
  #5 (permalink)  
Старый 21.08.2009, 15:01
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

e1f,
тут как бы не изобретение, а отказ.
Ответить с цитированием
  #6 (permalink)  
Старый 21.08.2009, 16:44
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Сообщение от SleepWalker Посмотреть сообщение
Но вот когда я попытался использовать эту функцию напрактике, то столкнулся с следущей проблемой:
...
З.Ы. Еще я дето читал мол есть событие загрузки DOM для w3c браузеров, но как тогда поступить с ие?
Kolyaj, по-моему, ТС хочет найти метод, как отслеживать domReady. И тот метод, который он дал в первом посте, ему не нравится. Честно говоря, не вижу, где здесь отказ
Ответить с цитированием
  #7 (permalink)  
Старый 21.08.2009, 16:58
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от e1f
Честно говоря, не вижу, где здесь отказ
Сообщение от SleepWalker
2. Вставить файл скрипта вконце страницы.
Сообщение от SleepWalker
Я уже до вашего поста немного поексперементировать. Результат мне понравился.
. .
Ответить с цитированием
  #8 (permalink)  
Старый 21.08.2009, 17:59
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

А, ТС решил так... Тогда да.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к layer в DOM Asd Элементы интерфейса 2 01.07.2009 23:16
Сохранение дерева DOM в файл Александр1985 Общие вопросы Javascript 7 24.01.2009 23:15