Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение окончания загрузки (без onLoad) 
V
    Опции темы
svl63
Дата 5.4.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Следующий скрипт запускается из левого фрейма ссылкой типа <a href="javascript:vis('cpu')">, в правом фрейме изначально имеется какой-либо документ.
Код

ido=0
function vis(idn) {
    if (parent.right.document.title=="list") { //если в правом фрейме находится list.html...
        if (ido!=0) parent.right.document.getElementById(ido).style.display="none" // стираем с экрана блок со старым id
        parent.right.document.getElementById(idn).style.display="" // отображаем блок с новым id
        ido=idn // запоминаем новый id, чтобы потом использовать его в качестве старого
    }
    else { // если в правом фрейме не list.html...
        parent.right.document.location="list.html" // загружаем list.html
        parent.right.document.getElementById(idn).style.display="" // отображаем блок
        ido=idn // запоминаем id
    }
}

Проблема возникает в блоке else, т.к. документ не успевает загрузиться. Её можно решить, если отложить отображение блока с помощью setTimeout:
Код

    else {
        parent.right.document.location="list.html"
        ido=idn
        setTimeout ('parent.right.document.getElementById(ido).style.display=""',50)
    }

Но, на мой взгляд, это кривое решение, т.к. необходимое значение задержки для разных браузеров, документов, машин сильно различается. Например, для IE можно установить любое значение, вплоть до 0, т. е. IE (в отличие от Opera и Firefox), по видимому, не отслеживает Timeout во время некоторых других своих процессов (например, загрузки документа). Короче, вопрос: как можно отследить в этом скрипте, что list.html уже загружен полностью, или как можно передать idn в list.html, чтобы там его обработать по onLoad?

PM MAIL   Вверх
SelenIT
Дата 5.4.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(svl63 @  5.4.2007,  22:36 Найти цитируемый пост)
или как можно передать idn в list.html, чтобы там его обработать по onLoad?

А зачем передавать туда idn? Есть же глобальный ido, который после отрабатывания ф-ции имеет нужное значение. Почему бы его-то и не считать по загрузке правого фрейма?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
svl63
Дата 6.4.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Каким образом? Я пробовал его (ido) просто использовать в list.html, но по информации из http://dklab.ru/chicken/nablas/39.html глобальные области видимости скриптов разных фреймов не пересекаются. Пробовал также выносить скрипты в отдельный JS-файл, подключаемый к обоим документам - тоже облом.
PM MAIL   Вверх
12345c
Дата 6.4.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Конечно, нужно проверять существование контрольной переменной в фрейме, которая определяется в конце страницы, а задержку делать в цикле, пока не станет определённой. Совсем хорошо, если предусмотреть возможность недозагрузки страницы в фрейме, остановить цикл по истечении разумного времени (пользователь может нажать "Stop" в любой момент).

Добавлено через 4 минуты и 53 секунды
Области видимости разные, но обращайтесь через объет фрейма, как полагается, он там в любом случае нужен, чтобы ошибки не было при undefined. Или, точнее, достаточно проверять только наличие document в фрейме. Так будет лучше, чем onload, потому что сработает раньше по загрузке текста данного фрейма, а не всего окна с фреймами и картинками.
PM WWW   Вверх
svl63
Дата 7.4.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Я не очень продвинут в Javascript, поэтому, если можно, пожалуйста, немного подробнее.
Я пытался организовать задержку в цикле while (parent.right.document.title!="list"){}, но какие действия выполнять в теле цикла, не смог определиться.
Далее. Что вы имеете в виду, говоря об объекте фрейма: уже имеющийся объект или его нужно создавать. Если первое - как через него обращаться, если второе - как его создать? Пытался создать просто объект со свойством ido в общем JS-файле, но получается, как и при простом определении переменной: при каждой загрузке правого фрейма по событию onLoad загружаемого list.html создается новый объект, и ido переопределяется. Далее я не совсем понял, проверять наличие какого document, в каком фрейме и откуда проверять (документы во время работы скрипта во всех фреймах имеются всегда, кроме момента замены документа в правом фрейме на list.html)? Если проверять из левого фрейма наличие нужного document в правом, то это ведь делается в блоке if, если проверять из list.html наличие во фрейме самого себя, не вижу в этом смысла.
Забыл сказать. Скрипт предназначен для локальной работы, поэтому особенности загрузки через сеть не имеют значения.
PM MAIL   Вверх
svl63
Дата 10.4.2007, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Всем большое спасибо. С объектом фрейма разобрался: parent.left.ido. Хотелось бы еще разобаться с циклом задержки. Если не трудно, хоть какой-нибудь намек.
PM MAIL   Вверх
12345c
Дата 10.4.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



В JS нельзя сделать задержку в настоящем цикле (только "зависание" браузера), поэтому под задержкой в цикле я подразумевал цикл на if  с setTimeout. Если условие не выполнено (нет документа в фрейме), делаете новый setTimeout той же функции (как бы рекурсия, но и не рекурсия никаким боком, как и не цикл), если выполнено - не делаете. Цикл получается из разрозненных вызовов, между которыми таймаут. По-другому в JS никак (нет wait()|sleep() ).


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
svl63
Дата 12.4.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Спасибо еще раз. Про цикл с задержкой все ясно. Меня вполне устраивает решение с передачей переменной из фрейма в фрейм.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.