ActionScript краткий обзор

         

ActionScript краткий обзор


Интеграция Flash с веб-приложениями > Обмен информацией с удаленными файлами

Обмен (отсылка и получением) информацией с удаленными файлами

Flash-клип это окно для сбора и отображения информации и он во многом похож на HTML страницу. Но Flash-клипы, в отличие от HTML страниц, могут постоянно обновляться, оставаясь загруженными в браузер, без необходимости обновления окна браузера. Вы можете использовать Flash-команды и методы объектов для отсылки и получения информации от серверных скриптов, текстовых файлов и XML-файлов.

Серверные скрипты могут запрашивать разнообразную информацию из баз данных что позволяет производить обмен информацией между базой данных и Flash-клипом (например, в настоящее время на http://polar-lights.com/en/ производится разработка расширения Flash2Databases для общения флеша с базами данных - Прим. переводчика). Серверные скрипты могут быть написаны на разных языках, причем наиболее предпочтительными и современными языками являются PHP (прямой наследник Perl) и ASP (Microsoft Active Server Pages) несколько более устаревший, но могучий Perl все еще не теряет актуальности, а более редкими но мощными и интересными языками являются JSP (Java Server Pages) и особенно удобный и простой для разработчика CFM (Allare ColdFusion).

Хранение информации в базах данных и динамическая подгрузка ее во Flash-клип позволяет создавать Flash-страницы с динамическим и персонализированным содержанием. Например, можно создать доску объявлений, чат, персональный профайл для пользователя или "shopping cart" (корзину покупок), которая будет помнить все покупки клиента, что может помочь в определении его предпочтений.

Вы можете использовать некоторые команды Actionscript и методы объектов для передачи информации внутрь и за пределы Flash-клипа. Каждая команда и метод могут использовать свой протокол для передачи информации, каждый из которых, в свою очередь, может требовать определенной разметки (формата) передаваемой информации.

Команды getURL, loadVariables и loadMovie используют HTTP или HTTPS протокол для посылки информации в кодированном формате URL.




Методы XML.send, XML.load и XML.sendandLoad используют HTTP или HTTPS протокол для посылки информации, как XML.

Методы XMLSocket.connect и XMLSocket.send создают и используют a TCP/IP сокет и соединение для посылки информации, как XML.

О безопасности

Во время воспроизведения Flash-клипа в браузере, можно загрузить данные в этот клип только из файла на сервере в том же субдомене. (Это, по замыслу Макромедии, должно было запретить Flash-клипам даже думать о попытках загрузить информацию с чужих серверов. Тем не менее все существующие на данный момент (21.09.2000) Flash-плееры для всех браузеров позволяют загружать во Flash-клип SWF-файлы с любого другого сервера по команде Load Movie. - Прим.переводчика)

Для определения субдомена URL состоящего из одного или двух компонентов, используется имя домена:

Domain

Subdomain

http://macromedia

macromedia

http://macromedia.com macromedia.com

Для определения субдомена URL состоящего из более чем двух компонентов, удаляют верхний уровень:

Domain

Subdomain

http://x.y.macromedia.com

y.macromedia.com http://www.macromedia.com macromedia.com

Следующий график показывает как Flash плеер определяет разрешить или нет HTTP запрос:

Используя XMLSocket объект для создания сокет-соединения с сервером, нужно использовать порт с номером 1024 или выше. (Порты с меньшими номерами обычно используются стандартными вещами типа Telnet, FTP, World Wide Web или Finger.)

Flash-клипам доступны все стандартные возможности браузеров в части HTTP и HTTPS защищенных соединений. По существу, Flash предоставляет ту же защищенность, что доступна при применении стандартного HTML протокола. Нужно следовать тем же правилам, которым обычно следуют при создании страниц с функцией защищенного соединения. Проще говоря команда LoadVariables произведенное из Flash-клипа (безразлично с передачей переменных или нет) оказывает точно такое же воздействие на сервер как и загрузка соответствующего скрипта или файла в стандартное окно браузера (с передачей тех же переменных и тем же методом).




Для защиты паролем чего-либо, используйте текстовое поле для запроса пароля от пользователя. Введенное значение можно отправить на сервер командой loadVariables или методом XML.sendandLoad, указав в свойствах HTTPS URL и метод POST. И уже на сервере можно будет проверить пароль и произвести соответствующие действия - чаще всего применяется генерация ответа от сервера в виде понятном для Flash (например var=something&var2=another& для случая LoadVariables). Полученные от сервера данные можно обработать внутри Flash-клипа и произвести какие-либо действия в зависимости от полученной информации. Другие методы обработки паролей (например проверка внутри Flash-клипа) не могут обеспечить сколько-нибудь стойкой защиты.


  Проверка загруженности данных

Каждая команда и метод загружающие данные во Flash-клип (кроме XMLSocket.send) является асинхронным, т.е. результаты этого действия возвращаются через неопределенное время.

Перед тем как использовать полученные из удаленного источника данные во Flash-клипе, необходимо проверить, загружены ли эти данные или еще нет. Например, нельзя использовать команду LoadVariables и манипулировать полученными значениями в одном ключевом кадре. В следующем примере нельзя использовать переменную lastFrameVisited, если она загружается из файла myData.txt. Более того, ее нельзя использовать и в последующих кадрах до тех пор пока не будет полной уверенности в том, что загрузка данных из файла myData.txt завершилась. Короче говоря, этот скрипт написан неправильно.

loadVariables("myData.txt", 0); gotoandPlay(lastFrameVisited);

Каждая команда и метод требуют использования специфической техники проверки загруженности данных. При использовании команд loadVariables или loadMovie можно загрузить информацию в символ типа movie clip и использовать событие data в контейнере действия onClipEvent. Замечательным свойством Flash5 является тот факт, что команда loadVariables при загрузке переменных в Target (в Movie clip, а не в Level), событие onClipEvent(data) происходит только после окончания загрузки последней переменной. Если же загружать переменные из отдельного .swf файла командой loadMovie (например при загрузке данных с другого домена), событие onClipEvent(data) происходит после загрузки каждого фрагмента этого .swf файла (т.е. обычно несколько раз).




Например, кнопка со следующей командой загружает переменные из файла myData.txt в символ типа movie clip с именем (Name в окошке Instance/Instance) loadTargetMC (причем этот movie clip расположен в основной Timeline):

on(release){ loadVariables("myData.txt", _root.loadTargetMC); }

Если какая-либо команда внутри символа loadTargetMC использует переменную lastFrameVisited, загруженную из внешнего файла myData.txt, то следующее действие будет выполнено только после окончания загрузки всех переменных из этого файла, включая lastFrameVisited:

onClipEvent(data) { gotoandPlay(lastFrameVisited); 1

}

При использовании методов XML.load и XMLSocket.connect можно определить программу обработки (XML handler) данных, которая будет обрабатывать данные после их появления. Программа обработки это свойство XML и XMLSocket объектов, к которому привязаны определенные вами (набитые на клавиатуре в окошке "Actions") функции. Программы обработки вызываются автоматически сразу после получения информации. Для XML объекта используйте XML.onLoad, а для XMLSocket объекта - XMLSocket.onConnect.

Для более подробной информации, щелкайте мышкой сюда Использование XML объекта и Использование XMLSocket объекта.

От переводчика:

Cудя по всему, переменная "lastFrameVisited" это что-то вроде вручную созданной переменной с именем подобным "КадрНаКоторыйВыХотитеПерейти". Она не имеет никакого отношения к стандартным функциям и свойствам Flash и не связана с проверкой загруженности данных. Так что не советую забывать дописывать в конец файлов предназначенных для загрузки в основную Timeline Flash-клипов что-то вроде

&finishloading=1&

и каким-либо циклом ожидать появления во Flash-клипе переменной "finishloading" равной 1. И только после появления этой переменной делать вывод об окончании загрузки данных. Для этого случая можно сказать в каком-либо кадре

loadVariables("myData.txt", 0);

в следующем кадре

play ();

и в третьем кадре

if (finishloading!=1) { prevFrame (); }



Интеграция Flash с веб-приложениями: Обзор


Flash-клипы могут обмениваться (отсылать и получать) информацией с удаленными файлами. Для отсылки и получения переменных используется команда loadVariables или, если требуется только отослать данные - getURL. Для загрузки другого Flash-клипа в текущий, используется команда loadMovie. Для отсылки и получения XML данных, используются XML или XMLSocket объекты. Можно также организовывать XML данные при помощи разнообразных методов XML объекта.

Кроме того, можно создавать Flash-формы, собранные из обычных интерфейсных элементов, таких как тестовые поля (text fields) и всплывающие окошки (pop-up menus), и использовать их для сбора информации и отсылки данных серверным приложениям.

Если же вспомнить про все возможности Flash, мы увидим что он позволяет обмениваться данными не только с удаленными файлами и серверными приложениями, но и с HTML окружением (ява скриптом) на клиентской машине. Позднее мы рассмотрим способы отсылки и получения данных из яваскрипта, причем рассмотрим не только устаревший метод fscommand, но и прямые вызовы яваскрипта из Flash-клипа c помощью команды getURL. 1

От редактора:

Насчет устаревшего метода и прямых вызовов переводчик добавил от себя и я с ним согласен :)



Использование fscommand и взаимодействие


on(release){ fscommand("fullscreen", "true"); }

В таблице указаны значения, которые вы можете использовать в качестве параметров команды fscommand для управления воспроизведением клипа в автономном Flash Player. (запущен прожектор)

Команда

Аргументы

Результат

quit

Нет Закрывает прожектор. fullscreen true или false Если true, то прожектор разворачивается на полный экран Если false, то прожектор сворачивается обратно к стандартному размеру. allowscale true или false Если false, то прожектор воспроизводит ролик всегда в стандартном размере и не изменяет его масштаб. Если true, то прожектор будет проигрывать ролик в масштабе 100% от своего собственного размера. showmenu true или false Если true, то в контекстном меню отображаются все пункты. Если false, то убираются все пункты меню, кроме "About Flash Player". exec Путь к приложению Выполняет приложение внутри прожектора.
Для вызова исполнимых файлов с параметром, например

file.exe /s -e

нужно войти в "expert mode" и заменить все пробелы в выражении табуляцией (кнопка TAB :)

Чтобы использовать fscommand для передачи сообщения скриптовому языку в броузере, например JavaScript, вы можете передать два любых аргумента в параметрах Command и arguments. Это могут быть строки или выражения, они будут использоваться в JavaScript функции, в которой находится команда fscommand.

Команда fscommand вызывает JavaScript-функцию moviename_DoFSCommand в HTML странице которая включает ролик, где moviename это имя ролика. Если Flash Player назначен имени myMovie, вызванная JavaScript функция будет myMovie_DoFSCommand.

Чтобы использовать команду fscommand для открытия окна сообщения между роликом и HTML страницей через JavaScript, надо:

1 На HTML странице, которая содержит ролик добавить следующий JavaScript-код:
function theMovie_DoFSCommand(command, args) { if (command == "messagebox") { alert(args); } }
Если вы публикуете ваш ролик, используя Flash с FSCommand-шаблоном, то этот код вставляется автоматически. Имя ролика и ID атрибуты будут именем файла. Например, для файла myMovie.fla, атрибуты будут установлены в myMovie.
Для дополнительной информации смотрите Help к Программе Flash.
2 В ролике, добавьте команду fscommand кнопке:
fscommand("messagebox", "This is a message box invoked from within Flash.")
Вы также можете использовать выражения в качестве параметров команды fscommand, например:
fscommand("messagebox", "Hello, " & name & ", welcome to our Web site!")
3 Выберите File > Publish Preview > HTML чтобы протестировать ролик.

Команда fscommand также может посылать сообщения программе Macromedia Director, которые представлены как строки, события или выполнимый lingo-код. Если сообщение является строкой или событием, вы должны написать Lingo-код для получения указаний из команды fscommand и выполнения их. Для дополнительной информации смотрите сайт Direct Support Center.

В Visual Basic, Visual C++ и других программах, которые используют ActiveX, fscommand посылает VB-событие в виде двух строк и оно может быть обработано этими языками программирования. Для дополнительной информации смотрите сайт Flash Support Center.



Использование команд loadVariables, getURL и loadMovie


Команды loadVariables, getURL и loadMovie взаимодействуют с серверными скриптами используя протокол HTTP. Каждая из этих команд посылает все переменные из Timeline туда, куда она направлена; каждая команда обрабатывает ответ следующим образом:

getURL возвращает любую информацию в окно броузера, не во Flash Player
loadVariables загружает переменные в заданную линейку (Timeline) во Flash Player.
loadMovie загружает ролик в заданный уровень во Flash Player.

Когда вы используете команды loadVariables, getURL или loadMovie, можете указать некоторые параметры:

URL файла, в котором находятся удаленные переменные
Местоположение (Location) - уровень или место в ролике, которое получает переменные. Для дополнительной информации об уровнях и местах смотрите О множестве линеек
Примечание: в команде getURL нельзя указывать местоположение.
Переменные могут быть отосланы разными HTTP методами - GET или POST.

Например, если хотите использовать таблицу достижений (high scores) в игре, можете положить таблицу на сервер и использовать команду loadVariables чтобы загружать её в ролик каждый раз, когда кто-то поиграл в игру. Команда будет похожей на эту:

loadVariables("http://www.mySite.com/scripts/high_score.php", _root.scoreClip, GET);

Здесь команда loadVariables загрузит переменные из PHP-скрипта high_score.php в мувик с именем scoreClip, используя GET HTTP метод.

Все переменные используемые с командой loadVariables должны быть в стандартном MIME формате application/x-www-urlformencoded (стандартный формат используемый в CGI скриптах). Скрипт, который вы указываете в URL-параметре команды loadVariables, должен выдать в виде ответа переменную и пары значений тоже в этом формате, чтобы Flash мог прочитать их.

Файл может содержать любое количество переменных; переменные и пары значений разделяются амперсандом (&), а слова с пробелами внутри, разделяются плюсом (+) (формат url-кодирования). Например, это выражение определяет несколько переменных:

highScore1=54000&playerName1=rockin+good&highScore2=53455&playerName2=bonehelmet&highScore3=42885&playerName3=soda+pop

Дополнительную информацию о командах loadVariables, getURL и loadMovie, смотрите в ActionScript словаре.
Информация по url-кодированию спец-символов доступна на сайте Макромедии.



Использование объекта XMLSocket


Чтобы установить Socket-соединение, необходимо создать приложение на сервере, которое будет ждать запрос на Socket-соединение и посылать ответ обратно Flash-клипу. Это серверное приложение можно написать на каком-либо языке программирования, например на Java.

Методы connect и send XMLSocket объектов используются для передачи XML-данных серверу и для возвращения их с сервера во время Socket-соединения. Метод connect устанавливает Socket-соединение с портом сервера. Метод send посылает XML объект на сервер, который указан в Socket-соединении.

При использовании метода connect, Flash Player открывает TCP/IP соединение с сервером и не закрывает его до тех пор, пока не произойдет одно из следующих событий:

Вызван метод close XMLSocket объекта.
Ссылок на XMLSocket объект больше не существует.
Flash Player прекратил работу.
Соединение прервано (например, отключился модем)

Следующий пример создает XML сокет-соединение и отсылает данные из XML объекта myXML. Для облегчения понимания, в скрипте встречаются комментарии, начинающиеся с символов //:

//Создаем новый XMLSocket объект sock = new XMLSocket(); //Вызываем его метод соединения чтобы законнектиться с портом 1024 //сервера по этому урл sock.connect("http://www.myserver.com", 1024); //Определяем функцию назначенную для этого sock объекта, которая будет обрабатывать //ответ сервера. Если соединение произошло, отсылаем myXML объект. //Если что-то не получилось, выводим сообщение об ошибке в текстовом поле "msg" function onSockConnect(success){ if (success){ sock.send(myXML); } else { msg="There has been an error connecting to "+serverName; } } //назначаем onSockConnect функцию для свойства onConnect sock.onConnect = onSockConnect;

Дополнительную информацию смотрите в ActionScript словаре.



Использование переменных в формах


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

Когда вы посылаете/получаете информацию серверному скрипту и от него, переменные в ролике должны совпадать с переменными в скрипте. Например, если скрипт ожидает переменную с именем pаssword, текстовое поле в котором пользователи вводят пароль тоже должно иметь имя переменной password.

Некоторые скрипты требуют скрытых переменных. Это такие переменные, которые пользователь не видит. Чтобы создать скрытую переменную в Flash, вы можете назначить переменную на кадр в ролике, который содержит другие элементы формы. Скрытые переменные отсылаются серверному скрипту наряду с любыми другими переменными из линейки

Примечание: Встроенные Flash-методы GET и POST отсылают все переменные из текущей линейки, включая разные $version. Поэтому, если хочется отослать только то, что необходимо, обычно создают отдельный символ с текстовыми полями и кнопкой "send" и помещают этот символ в основную линейку.



О XML


XML (Расширяемый язык разметки - Extensible Markup Language) стал стандартом обмена структурированными данными в Интернет-Приложениях. Вы можете объединять данные из Flash с серверами, которые используют XML технологию для создания сложных приложений, как например чата или банковской системы .

В XML, так же как и в HTML, вы можете использовать тэги для разметки текста. В HTML вы можете использовать предопределенные тэги чтобы указать каким должен быть показан текст в броузере (например, тэг <b> выделяет текст жирным начертанием). В XML вы указываете тэги которые выделяют тип части данных (например, <password>VerySecret</password>). XML разделяет структуру данных в зависимости от способа их отображения. Это позволяет многократно использовать один и тот же документ в различных средах.

Каждый XML тэг называется узлом (node) или элементом (element). Узлы бывают 2х типов (1-XML элемент, или 3-text узел). Элементы так же могут иметь атрибуты. Узел вложенный в узел (а node nested in a node) называется child или childNode. Эта иерархическая структура узлов называется XML DOM (Document Object Model). Она во многом похожа на JavaScript DOM, являющимся структурой элементов в броузере.

В следующем примере, <PORTFOLIO> является главным узлом (parent node), он не имеет атрибутов и содержит childNode <HOLDING>, который имеет атрибуты SYMBOL, QTY, PRICE и VALUE:

<PORTFOLIO> <HOLDING SYMBOL="RICH" QTY="75" PRICE="245.50" VALUE="18412.50" /> </PORTFOLIO>



Отсылка и прием сообщений Flash


От переводчика:

На данный момент существует альтернатива fscommand, которая работает в большем числе браузеров и позволяет передать среде окружения более одного параметра за один раз- это прямые вызовы яваскриптовых функций командой getURL с синтаксисом

getURL ("javascript:functionname(params,morepareams)");

или

getURL ("javascript:functionname()");

Для использования прямых вызовов яваскрипта не нужно использовать шаблон публикации от fscommand. HTML код обеспечивающий работу прямых вызовов яваскрипта отличается от Flash Only (default) (файл Default.html в папке HTML) только присутствием swLiveConnect=true и NAME=movieID внутри тега Embed. Можно создать собственный шаблон публикации для таких случаев, просто скопировав все содержимое Default.html и добавив swLiveConnect=true NAME=$TI в тег embed (хотя в принципе еще можно слегка изменить строку $TTFlash Only (Default) к примеру на $TTFlash and JavaScript чтобы не путаться :)



Создание форм


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

Простым элементом формы является, например, поле для ввода текста. Стандартным типом форм, использующим этот интерфейс элементов, являются ЧАТы, бланки-заявки и поисковые формы. Например, Flash-форма может собирать адреса и посылать их другому приложению которое в свою очередь преобразует информацию в E-mail письмо или запись базы данных. Даже одиночное текстовое поле рассматривается как форма и может использоваться для получения информации вводимой пользователем и отображения результата.

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

Для составления формы необходимо:

1 Поместить элементы интерфейса в ролик. (Можете использовать элементы интерфейса из библиотеки или создать свои).
2 В панели Text Options установите РАЗНЫЕ имена переменных для текстовых полей для ввода и подтверждения. (Для дополнительной информации о создании изменяемых текстовых полей смотрите Help файл Flash.)
3 Назначьте команду, которая будет отсылать и загружать данные.



Создание поисковой формы


Примером простейшей поисковой формы может служить поле ввода строки поиска с кнопкой "ОК". Следующий пример содержит указания для создания поискового интерфейса с использованием команды getURL.

Для создания простой поисковой формы необходимо:

1 Создать кнопку, которая подтверждает введенную информацию для поиска.
2 Создать чистое текстовое поле и пояснительную надпись.
Ваш экран будет примерно таким:

3 Выделить текстовое поле и выбрать в Window > Panels> Text Options.
4 В панели Text Options установить следующие параметры:
Выбрать Input Text из всплывающего меню
Включить Border/Bg.
Указать имя переменной.
ПРИМЕЧАНИЕ: Некоторые поисковые машины могут требовать специальное имя переменной. Для дополнительной информации смотрите сайт поисковой машины..
5 Нажать на правую кнопку в рабочей области и выбрать Window > Actions.
Появится панель действий объектов.
ПРИМЕЧАНИЕ: галочка рядом с Actions в меню Window показывает, что панель открыта.
6 Удерживая кнопку мыши, перетащить команду getURL из окна со списком команд в окно скрипта.
7 В области Параметров действия, установить следующие опции:
В строку URL, ввести URL поисковой машины.
Для Window, выбрать _blank. Это откроет новое окно с результатами поиска.
Для Variables, выбрать Send using GET.
8 Для проверки формы выбрать File > Publish Preview > HTML.