Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2868 / 252 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 14:

Работа флэш-программ в Internet

Аннотация: Управление загрузкой веб-страниц из флэш-ролика. URL-кодированные строки переменных и их использование. Способы загрузки дополнительных роликов в текущий. Загрузка переменных. Предзагрузчики: простейший (встроенный в ролик) предзагрузчик, внешний предзагрузчик. Внешнее управление: передача флэш-ролику параметров из HTML (при загрузке ролика), управление роликом из JavaScript (или VBScript). Вызов JavaScript-функций (VBScript-функций) из ролика. Команда fscommand, ее различные применения. Взаимодействие несвязанных роликов между собой: механизм Local Connection. Shared Objects: сохранение данных на локальном диске и обмен этими данными. Изменение текущей (по умолчанию) директории: атрибут BASE в html-коде. Динамическая загрузка звуковых файлов, работа с потоковыми звуками. XML-данные: загрузка через HTTP и с помощью XMLSocket. Flash Remoting - специальная технология взаимодействия с серверной частью приложения. Отладка (в том числе - удаленная) при работе в браузере.

Как правило, анимационные модули, создаваемые в вашем проекте, будут работать через Интернет. По сравнению с работой на локальной машине (вашей или дизайнера), здесь есть, как минимум, три особенности. Во-первых, сама анимация может загружаться достаточно долго. Во-вторых, любые, даже маленькие, дополнительные ресурсы будут загружаться какое-то заметное время (может, полсекунды, а, может, и полминуты). В-третьих, ваш флэш-модуль скорее всего будет вставлен в веб-страницу, с содержимым которой, возможно, понадобится взаимодействовать. Наконец, нужно учитывать, что платформа, на которой работает пользователь может отличаться от вашей - ну, это уж совсем привычное дело для всех Интернет-разработчиков, поэтому о необходимости тестирования на десятке платформ (сочетаний браузера и операционной системы) мы более говорить не будем. Сейчас мы со всеми этими особенностями разберемся подробнее.

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

  1. Если мы описываем метод класса, то имя класса будем указывать в угловых скобках.
  2. Необязательные параметры будем писать в квадратных скобках.

Например, запись

<ClassName>.methodName(parametr1 [, parametr2]);

обозначает, что метод по имени methodName принадлежит классу ClassName (и должен вызываться у объектов этого класса). Аргумент parametr1 передавать обязательно (иначе метод сработает неверно или не сработает вообще), а аргумент parametr2 в принципе можно и опустить.

Загрузка веб-страниц из Flash MX

Сперва рассмотрим важную возможность флэш-роликов, о которой мы раньше почти не говорили. Мы имеем в виду возможность загружать документ с заданным URL в заданное окно браузера. Делается это с помощью глобальной функции getURL или метода getURL класса MovieClip. Синтаксис вызова у них практически одинаков и имеет следующий вид:

getURL(url [, window [, variables]]);
<MovieClip>.getURL(url [,window, variables]);

Первый параметр - это URL того документа, который вы хотите загрузить. Это может быть как html-документ, так и просто *.swf-файл или картинка. Допускаются не только полные, но и относительные пути. По умолчанию относительный путь отсчитывается от html-документа, в который был загружен ваш ролик. О том, как поменять это умолчание, см. параграф "Изменение текущей директории (атрибут BASE )". Учтите, что вы можете загружать дополнительные файлы только из того же домена, из которого была исходная страница.

Второй параметр (необязательный) - это имя окна (фрейма), в которое должна быть загружена страница. Если вы его не указываете, то загрузка произойдет в текущее окно (фрейм). Есть четыре предопределенных значения этого аргумента; сейчас мы поясним, что значит каждое из них.

_self - текущий фрейм текущего окна.

_blank - новое окно.

_parent - родительский фрейм (по отношению к текущему).

_top - фрейм верхнего уровня в текущем окне.

Имейте в виду, что если вы в качестве имени окна передаете " _self " или не передаете ничего (то есть хотите загрузить страницу в то окно, в котором сейчас находится ваш флэш-ролик), то прежняя страница (вместе с вашим роликом) будет выгружена. Это произойдет даже в том случае, если вы загрузите повторно текущую страницу с вашим роликом - ролик (вместе с флэш-плеером) будет выгружен, а потом загружен в начальном состоянии. Если вы хотите сохранять состояние ролика, используйте SharedObjects (см. одноименный параграф).

Третий аргумент (также необязательный) - это имя метода, которым будут посланы на сервер переменные. Вот здесь стоит задержаться: во-первых, информация, которую мы хотим вам сейчас сообщить вовсе не очевидна; во-вторых, она пригодится вам в нескольких следующих параграфах.

Итак, веб-страница, которую вы хотите показать, может быть получена как из некоего локального хранилища, так и с веб-сервера. В последнем случае она могла храниться на сервере статическим образом, а могла быть сгенерирована им по вашему запросу. Так вот, очень часто нужно передать на сервер какую-то информацию (скажем, о действиях пользователя), чтобы сгенерированная сервером страница была адекватна текущей ситуации. В настоящей лекции вы узнаете несколько способов это сделать; сейчас мы опишем самый старый и заслуженный. Состоит данный способ в том, что все поля некоторого объекта упаковываются в строчку специального вида и отправляются на сервер. (О том, как именно происходит упаковка, мы расскажем в следующем параграфе). Причем есть два способа отправить эту строчку на сервер. Первый - прикрепить ее в конце URL запрашиваемого документа (вы наверняка встречали URL такого вида, когда после вопросительного знака идет набор параметров). Второй - послать в отдельном HTTP-пакете. Первый способ годится, если посылаемая на сервер информация не очень объемиста. Второй годится всегда. Чтобы переменные были отправлены первым способом, вам в качестве третьего аргумента getURL нужно написать " GET ", а чтобы вторым - " POST ". Если же вы опустите третий аргумент при вызове getURL, переменные не будут отправляться на сервер вовсе (при этом на сервер пойдет типа GET, только без переменных, присоединенных к строке URL).

Остался один важный вопрос, который мы еще не рассмотрели. Поля какого именно объекта пересылает на сервер функция getURL? Если речь идет о методе MovieClip, то ответ очевиден: у какого объекта метод вызвали, у того и возьмут поля для отправки. А если вызвана глобальная функция? В таком случае будут отправлены переменные того клипа, в кадре которого расположен ваш код. Например, если вы писали код прямо в корневом клипе, то и отправятся на сервер все переменные из _root.

Ко всему вышесказанному нужно сделать примечание: есть три случая, когда Флэш демонстрирует нам слегка неожиданное поведение. Неожиданность первая случается, если вы сказали посылать переменные методом POST, но в объекте, из которого надо слать переменные, не нашлось ни одного поля (доступного для for...in -перебора), чтобы его можно было послать. Тогда Флэш неожиданно решает проявить интеллект и оптимизировать ваш запрос, послав его методом GET, а не POST. Спору нет, это может увеличить скорость работы, но вдруг сервер в данном случае рассчитывает только на POST -запрос? Если такое поведение действительно окажется неудобным, придется завести в вашем объекте фиктивную переменную для отправки ее на сервер. Неожиданность вторая произойдет, если вы вызовете метод getURL у объекта типа MovieClip (или его наследника), который был создан при помощи команды new MovieClip() вместо attachMovie, createEmptyMovieClip и т.п. (то есть ваш объект не встроен в дерево клипов). В этом случае переменные будут отправлены из клипа, в кадре которого написан текущий кусок кода, а вовсе не из того клипа, у которого вы вызвали getURL. Неожиданность третья: если вы тестируете ваш ролик из-под встроенного во Флэш МХ плеера (того, что запускается по нажатию Ctrl+Enter ), то вы обнаружите, что getURL всегда посылает на сервер запрос типа GET, независимо от того, какой тип запроса вы указали в третьем аргументе. К счастью, в браузере все работает как надо.