| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > определение окончания загрузки (без onLoad) |
| Автор: svl63 5.4.2007, 22:36 | ||||
Следующий скрипт запускается из левого фрейма ссылкой типа <a href="javascript:vis('cpu')">, в правом фрейме изначально имеется какой-либо документ.
Проблема возникает в блоке else, т.к. документ не успевает загрузиться. Её можно решить, если отложить отображение блока с помощью setTimeout:
Но, на мой взгляд, это кривое решение, т.к. необходимое значение задержки для разных браузеров, документов, машин сильно различается. Например, для IE можно установить любое значение, вплоть до 0, т. е. IE (в отличие от Opera и Firefox), по видимому, не отслеживает Timeout во время некоторых других своих процессов (например, загрузки документа). Короче, вопрос: как можно отследить в этом скрипте, что list.html уже загружен полностью, или как можно передать idn в list.html, чтобы там его обработать по onLoad? |
| Автор: svl63 6.4.2007, 00:39 |
| Каким образом? Я пробовал его (ido) просто использовать в list.html, но по информации из http://dklab.ru/chicken/nablas/39.html глобальные области видимости скриптов разных фреймов не пересекаются. Пробовал также выносить скрипты в отдельный JS-файл, подключаемый к обоим документам - тоже облом. |
| Автор: 12345c 6.4.2007, 12:44 |
| Конечно, нужно проверять существование контрольной переменной в фрейме, которая определяется в конце страницы, а задержку делать в цикле, пока не станет определённой. Совсем хорошо, если предусмотреть возможность недозагрузки страницы в фрейме, остановить цикл по истечении разумного времени (пользователь может нажать "Stop" в любой момент). Добавлено через 4 минуты и 53 секунды Области видимости разные, но обращайтесь через объет фрейма, как полагается, он там в любом случае нужен, чтобы ошибки не было при undefined. Или, точнее, достаточно проверять только наличие document в фрейме. Так будет лучше, чем onload, потому что сработает раньше по загрузке текста данного фрейма, а не всего окна с фреймами и картинками. |
| Автор: svl63 7.4.2007, 15:39 |
| Я не очень продвинут в Javascript, поэтому, если можно, пожалуйста, немного подробнее. Я пытался организовать задержку в цикле while (parent.right.document.title!="list"){}, но какие действия выполнять в теле цикла, не смог определиться. Далее. Что вы имеете в виду, говоря об объекте фрейма: уже имеющийся объект или его нужно создавать. Если первое - как через него обращаться, если второе - как его создать? Пытался создать просто объект со свойством ido в общем JS-файле, но получается, как и при простом определении переменной: при каждой загрузке правого фрейма по событию onLoad загружаемого list.html создается новый объект, и ido переопределяется. Далее я не совсем понял, проверять наличие какого document, в каком фрейме и откуда проверять (документы во время работы скрипта во всех фреймах имеются всегда, кроме момента замены документа в правом фрейме на list.html)? Если проверять из левого фрейма наличие нужного document в правом, то это ведь делается в блоке if, если проверять из list.html наличие во фрейме самого себя, не вижу в этом смысла. Забыл сказать. Скрипт предназначен для локальной работы, поэтому особенности загрузки через сеть не имеют значения. |
| Автор: svl63 10.4.2007, 02:08 |
| Всем большое спасибо. С объектом фрейма разобрался: parent.left.ido. Хотелось бы еще разобаться с циклом задержки. Если не трудно, хоть какой-нибудь намек. |
| Автор: 12345c 10.4.2007, 17:41 |
| В JS нельзя сделать задержку в настоящем цикле (только "зависание" браузера), поэтому под задержкой в цикле я подразумевал цикл на if с setTimeout. Если условие не выполнено (нет документа в фрейме), делаете новый setTimeout той же функции (как бы рекурсия, но и не рекурсия никаким боком, как и не цикл), если выполнено - не делаете. Цикл получается из разрозненных вызовов, между которыми таймаут. По-другому в JS никак (нет wait()|sleep() ). |
| Автор: svl63 12.4.2007, 00:00 |
| Спасибо еще раз. Про цикл с задержкой все ясно. Меня вполне устраивает решение с передачей переменной из фрейма в фрейм. |