По существу, стандартизация дает возможность взаимодействовать между собой разнородным предметам – фонарику и батарейкам, Macromedia
В этом уроке мы познакомим вас с основами формата XML, а также покажем, как можно использовать во
В этом уроке:

Несложное чат-приложение, которое мы запрограммируем в этом уроке, будет использовать соединение типа XML
socket .
На выполнение этого урока требуется примерно полтора часа.
Файлы-носители:
Нет
Стартовые файлы:
Lesson12/Assets/LoginRegister1.fla Lesson12/Assets/Chat1.fla
Законченные проекты:
LoginRegister2.fla Chat2.fla
Хотя само название XML, или
Когда вы хотите написать другу письмо, вы должны структурировать свои мысли (информацию) в таком формате, который ваш друг сможет распознать. Итак, вы начинаете писать слова на листе бумаги, начиная с левого верхнего угла и разделяя свои мысли на абзацы, предложения и слова. Конечно, вы могли бы писать не слева направо, а как-нибудь по кругу, или вообще попытаться передать свои мысли картинками, однако такой способ, скорее всего, лишь приведет вашего друга в недоумение. А написав письмо в таком формате, который вашему другу привычен, вы сможете быть уверены в том, что ваше послание будет понято – то есть передача ваших мыслей (данных, информации) получателю письма совершится успешно.

Для того же предназначен и XML – это формат для передачи информации. Если, к примеру, нужно переслать данные из
В синтаксисе XML, подобно HTML, используются теги, атрибуты и значения – но на этом сходство и заканчивается. Тогда как в HTML используются заранее определенные теги (например, body, head или html ), в XML пользователь создает свои собственные, а не выбирает готовые имена из библиотеки. Давайте для начала рассмотрим вот этот простой документ XML:
<MyFriends> <Name Gender="female">Kelly Makar</Name> <Name Gender="male">Mike Grundvig</Name> <Name Gender="male">Free Makar</Name> </MyFriends>
Каждый тег XML называется узлом ( ), набор данных в формате XML называется документом XML. В нашем документе-примере имеется корневой узел MyFriends и три дочерних узла. Каждый Name и значение узла Kelly Makar. Слово Gender в каждом из дочерних узлов – атрибут. Атрибуты необязательны; каждый узел может иметь неограниченное число атрибутов. Обычно атрибуты используются для размещения небольших порций информации, которые необязательно отображать на экране (например, идентификационный номер пользователя).

Как вы видите в этом примере, теги (которые мы сами же создали и описали) придают смысл порциям информации (Kelly Makar, Mike Grundvig и
Следующий
<AddressBook>
<Person>
<Name>Kelly Makar</Name>
<Street>121 Baker Street</Street>
<City>Some City</City>
<State>North Carolina</State>
</Person>
<Person>
<Name>Tripp Carter</Name>
<Street>777 Another Street</Street>
<City>Elizabeth City</City>
<State>North Carolina</State>
</Person>
</AddressBook>
В этом примере показано, как могут выглядеть данные
Каким же образом следует создавать свои узлы, свою структуру? Как объект-получатель (ASP-страница,

Иногда также используют текстовые файлы, содержащие информацию в формате XML – например, статичный XML-файл, хранящий информацию о том, какую ASP-страницу следует вызвать или какой порт и IP-адрес использовать для соединения с
Итак, с основами структуры XML вы ознакомились; теперь мы перечислим некоторые правила, которым необходимо следовать при составлении XML-документов.
<Name> служит </Name>.escape () ). Многие анализаторы интерпретируют некоторые не кодированные служебные символы как начало нового узла – а потом не обнаруживают его завершения. Документ с незавершенными узлами не сможет пройти через XML-анализатор полностью. С атрибутами нужно быть еще внимательнее – здесь ошибку анализа могут вызвать даже такие символы, как ). Правильно кодируя текст по стандарту URL, вы избежите подобных проблем.<Name>, а завершился </name>, это приведет к ошибке.Прежде чем приступить к работе, стоит, пожалуй, упомянуть еще об одном. Все это правильное и красивое оформление структуры XML-документа (каждый узел с новой строки, отступы для дочерних узлов и т.п.) совершенно необязательно. Все это просто облегчает чтение документа для нас. А для XML-анализаторов это просто пустое место; им все равно, есть эти отступы или нет их.
Что ж, пришла пора применить XML! Во
Объект XML имеет набор методов, предназначенных для создания и форматирования XML-документов. Правда, они весьма не просты в использовании – однако существует и более простой способ форматирования XML-объектов: нужно создать строку и затем преобразовать ее в объект XML.
Во
myXML = new XML();
Чтобы заполнить этот объект данными в формате XML, необходимо передать конструктору (указать в скобках)
Предположим, что мы хотим создать во
<MyFriends> <Name Gender="female">Kelly Makar</Name> <Name Gender="male">Free Makar</Name> </MyFriends>
Для этого мы должны сделать две вещи:
Например, так:
myString = "<MyFriends><Name Gender=\"female"\>Kelly Makar</Name><Name Gender=\"male"\>Free Makar</Name></MyFriends>"; myXML = new XML(myString);
Как видите, в этом скрипте текст XML-документа создается в виде строки, которая затем преобразовывается в настоящий объект XML под названием myXML. Затем этот объект можно послать для обработки на сервер, воспользовавшись одним из предназначенных для этого методов (которые мы опишем далее в этом разделе).
Слово анализ в данном случае означает разбор на составные, структурные части. Так, когда говорят о написании скрипта, анализирующего myXML.
: Это свойство указывает на первый узел внутри структуры. Например: myXML. возвратит значение <Name Gender="female">Kelly Makar</Name>. Первый дочерний узел XML-документа есть корневой узел ( MyFriends ), а первый дочерний узел корневого узла – Name.
childNodes: Это свойство возвращает массив дочерних узлов данной точки структуры. Например: myArray = myXML.. Массив myArray будет содержать два элемента, значения которых будут равны значениям двух узлов Name.
nextSibling: Это свойство указывает на следующий узел того же уровня в структуре. Например, myXML. возвратит <Name Gender="male">.
: Это свойство возвращает ассоциативный массив имен атрибутов. Например: myXML. возвратит значение "male".

Мы рассказали здесь лишь о наиболее употребительных свойствах объекта XML; прочие свойства работают похожим образом, указывая на различные части структуры документа.
Обычно работа с XML во
load() объекта XML загрузить данные в XML-формате из внешнего источника.Например:
myXML = new XML();
myXML.load("http://somedomain.com/info.xml");
В данном случает документ загружается из статичного XML-файла, однако это не единственный путь. Можно указать ASP-страницу (или другую страницу сценария), результатом выполнения скрипта которой станет
Как узнать, что загрузка XML из источника в объект XML завершилась? Очень просто – с помощью события onLoad объекта XML. Можно использовать обработчик этого события для вызова функции, которую необходимо выполнить по окончании загрузки. Возьмем такой пример:
function init () {
//здесь могут быть действия, анализирующие документ
}
myXML = new XML();
myXML.onLoad = init;
myXML.load("http://somedomain.com/info.xml");
Как указывает вторая снизу строка, по завершении загрузки документа XML должна быть вызвана функция .
Объект XML дает возможность отослать XML-данные по указанному адресу. Также имеется возможность, послав XML, сразу же загрузить результаты его обработки.
Для отсылки XML нужно воспользоваться методом , указав необходимый URL. Например:
myXML = new XML("<Message><Text>Hi!</Text></Message>");
myXML.send("http://somedomain.com/somedestination.asp");
Чтобы послать XML и сразу получить ответ, следует применить метод sendAndLoad() объекта XML. При этом необходимо указать XML-объект, содержимое которого нужно отослать, URL-адрес места назначения, а также объект XML, в который должно быть загружено ответное послание. Как и в случае с методом load(), здесь событие onLoad поможет узнать, что ответ уже загружен. Вот пример:
URL = "http://www.electrotank.com/projects/tfts/using_xml/UserLogin.asp";
function init () {
trace(objToReceive);
}
xmlToSend =
"<Login><UserName>Jobem</UserName><Password>hayes</Password></Login>";
objToSend = new XML(xmlToSend);
objToReceive = new XML();
objToReceive.onLoad = init;
objToSend.sendAndLoad(URL, objToReceive);
Данный скрипт создает объект XML ( objToSend ), содержащий информацию для входа на сайт, и затем отсылает его на URL, ожидая получить ответ. Как только этот ответ будет полностью загружен в принимающий XML-объект ( objToReceive ), вызывается функция .

Итак, вы кое-что узнали о формате XML, а также об объектах XML, их методах и свойствах. Пора применить знания на практике! В этом разделе урока мы с вами создадим несколько простых XML-документов, выполним несложный анализ и применим метод sendAndLoad() – все это в рамках
Страница
<Register> <UserName>jobem</UserName> <Email>jobe@electrotank.com</Email> <Password>secret</Password> </Register>
В случае правильной регистрации пользователя страница
<Register> <Message>User Inserted</Message> </Register>
Если же пользователь с таким именем уже существует, будет возвращен такой результат:
<Register> <Message>User Exists</Message> </Register>
Страница UserLogin.asp воспринимает
<Login> <UserName>jobem</UserName> <Password>secretword</Password> </Login>
Если информация верна, то страница возвращает следующий результат:
<Login> <Message>Login Correct</Message> </Login>
Если информация неверна, будет возвращен такой результат:
<Login> <Message>Login Incorrect</Message> </Login>
Все необходимые кадры, текстовые поля и кнопки в этом файле уже созданы. Файл имеет четыре слоя: в слое Actions мы будем размещать все наши скрипты, слой Labels содержит метки кадров, в слое

Этим мы предотвращаем автоматическое воспроизведение фильма.
on (release) {
_root.gotoAndStop("login");
}
Если пользователь нажмет эту кнопку, на экран будет выведен кадр, предлагающий заполнить форму входа на сайт.
on (release) {
_root.gotoAndStop("register");
}
При нажатии пользователем этой кнопки на экран будет выводиться кадр, предлагающий заполнить форму регистрации пользователя для создания новой учетной записи.
loginURL="http://вашдомен.com/projects/tfts/using_xml/UserLogin.asp";

Это будет адрес ASP-страницы, принимающей
function loginSubmit () {
xmlToSend =
"<Login><UserName>"+userName.text+"</UserName><Password>"+password.text+"</Password></Login>";
objToSend = new XML(xmlToSend);
objToReceive = new XML();
objToReceive.onLoad = loginResponse;
objToSend.sendAndLoad(loginURL,objToReceive);
_root.gotoAndStop("waiting");
}
Эта функция будет вызываться при нажатии кнопки Submit (мы потом присоединим к ней соответствующий скрипт). В первой строке функции используются значения, введенные в текстовые поля и password. Они вставляются в текстовую строку данных XML-формата; эта строка становится значением переменной xmlToSend. Затем мы создаем новый объект XML с именем objToSend и передаем ему только что sendAndLoad() работает только с XML-объектами – мы не можем применить его непосредственно к строке. Далее мы создаем новый объект под именем objToReceive. В этот XML-объект будет загружаться ответ ASP-страницы. Далее мы, используя событие onLoad, указываем, что по завершении objToReceive должна быть вызвана функция loginResponce() (эту функцию мы создадим на следующем шаге).
Следующим действием вызывается метод sendAndLoad() с указанием передающего объекта, URL назначения и объекта, в который должен быть загружен ответ. Наконец, последнее действие перемещает монтажный стол к кадру с меткой , информируя пользователя о том, что данные переданы и ожидается ответ сервера.
function loginResponse () {
var response = objToReceive.firstChild.firstChild.firstChild.nodeValue;
if (response == "Login Correct") {
_root.gotoAndStop("login success");
} else if (response == "Login Incorrect") {
_root.gotoAndStop("login failed")
}
}
Эта функция будет вызвана, как только последний байт XML будет загружен в XML-объект objToReceive. Функция анализирует ответ, полученный с сервера.
Первая response и присваивает ей значение, извлеченное из XML-документа, возвращенного сервером. Если помните, ответ страницы UserLogin.asp имеет такой формат:
<Login> <Message>Login Correct|Login Incorrect</Message> </Login>
Таким образом, переменная response получит значение "Login if, который, в зависимости от значения response, отправляет фильм к кадру с меткой login success либо login . Тем самым фильм покинет кадр , на котором, как вы помните, он был остановлен в ожидании ответа сервера.
on (release, keyPress "<Enter>") {
loginSubmit();
}
При нажатии этой кнопки будет вызвана и выполнена функция loginSubmit(). Тем самым будет активирован процесс входа на сайт, описанный на предыдущих шагах.
Подведем итоги. При вызове функции loginSubmit() XML-данные отсылаются на сервер, а фильм перемещается к кадру с меткой . По получении ответа с сервера автоматически вызывается функция loginResponse(), и фильм переходит к кадру с меткой login success либо login .
Теперь мы запрограммируем обработку проектом процесса регистрации.
registrationURL = "http://вашдомен.com/projects/tfts/using_xml/AddUser.asp";
Это адрес ASP-страницы, которая будет принимать для обработки

function registrationSubmit () {
XMLtoSend= "<Register><UserName>" + userName.text + "</UserName><Email>
" + email.text + "</Email><Password>" + password.text + "</Password></Register>";
objToSend = new XML(XMLtoSend);
objToReceive = new XML();
objToReceive.onLoad = registrationResponse;
objToSend.sendAndLoad(registrationURL,objToReceive);
_root.gotoAndStop("waiting");
}
Эта функция очень похожа на функцию loginSubmit(), описанную нами на шаге 6 – различия заключаются лишь в структуре данных XML и некоторых именах. Обратите внимание, что и password.text. Эти данные должны быть введены пользователем в соответствующие текстовые поля. Скрипт-получатель проанализирует документ и извлечет эти данные.
function registrationResponse () {
var response = objToReceive.firstChild.firstChild.firstChild.nodeValue;
if (response == "User Inserted") {
_root.gotoAndStop("registration success");
} else if (response == "User Exists") {
_root.gotoAndStop("registration failed")
}
}
Эта функция будет вызвана, как только последний байт XML будет загружен в XML-объект objToReceive. Функция очень похожа на функцию loginResponse(), описанную нами на шаге 7. Если помните, страница
<Register> <Message>User Inserted|User Exists</Message> </ Register >
Таким образом, переменная response получит значение либо "User Inserted", либо "User Exists". Затем оператор if, используя это значение, отправляет фильм к кадру с меткой либо .
on (release, keyPress "<Enter>") {
registrationSubmit();
}
При нажатии этой кнопки либо клавиши Enter будет вызвана функция registrationSubmit(). Тем самым будет активирован процесс регистрации пользователя, описанный на предыдущих шагах. Таким образом, при вызове функции registrationSubmit() XML-данные отсылаются на сервер, а фильм перемещается к кадру с меткой . По получении ответа с сервера автоматически вызывается функция registrationResponse(), и фильм переходит к кадру с меткой login success либо login .
Мы с вами только что создали несложное приложение, иллюстрирующее применение объекта XML. Протестируйте фильм еще несколько раз; убедитесь, что вы поняли, как это запрограммировано и как работает.
Теперь вы готовы приступить к созданию более продвинутых приложений,
Ключевая мысль: при использовании
Учтите, однако, что
В следующем упражнении мы покажем вам, как подготовить и запустить

На прилагаемом к книге
Далее мы расскажем вам, как запустить сервер для определенного порта. Вот что следует сделать для запуска сервера в Windows:
Буквы cd – это команда смены каталога ( change directory ).
Это предложение следует вводить в точности так, как написано, соблюдая заглавные и строчные буквы. В окне командной строки должна отобразиться информация о том, что сервер запущен и прослушивает порт 9999.
Если вы правильно установили
AquaServer – один из немногих бесплатных
Чтобы
Для создания нового объекта
server = new XMLSocket();
Приведенная строка с именем server. Для установления соединения с сервером следует применить метод connect(), используя следующий синтаксис:
server.connect(hostName,port);
Параметр , по которому находится указывает на порт, который прослушивается сервером.
server = new XMLSocket();
server.connect("localhost",9999);
Закрыть соединение с сервером можно с помощью метода close() – это выглядит так:
server.close();
Для передачи информации через с указанием объекта, который нужно передать. Например:
server.send("<Text>Hi</Text>");
способен обрабатывать следующие виды событий:
Мы можем назначить обработчики этих событий для созданного нами объекта (так же, как мы делали с событием onLoad объекта XML).
Например:
function serverConnected (success) {
trace(success);
}
server.onConnect = serverConnected;
Здесь, как видите, функция serverConnected() вызывается при возникновении события onConnect. Параметр success, использованный в описании функции, имеет значение true, если соединение установлено успешно, и false – если соединение не удалось установить.
Событие onXML используется следующим образом:
function xmlReceived (data) {
trace(data);
}
server.onXML = xmlReceived;
Функция xmlReceived() будет вызываться каждый раз, когда через data содержит
Событие onClose можно использовать так:
function socketClosed () {
//уведомление для пользователя
}
server.onClose = socketClosed;
Обработчик этого события обычно используют, чтобы уведомить пользователя о том, что соединение разорвано.
В этом упражнении мы с вами построим несложное чат-приложение, соединяющееся с AquaServer (бесплатный
Этот файл содержит четыре слоя: в слой Actions мы будем помещать наши скрипты, слой Labels содержит метки кадров фильма, в слое

Мы начнем с того, что запрограммируем базовые функциональные возможности нашего чат-приложения. Позднее мы присоединим соответствующие действия к различным кнопкам.
stop();
function setChatText (msg) {
chatText += msg;
chatBox.htmlText = chatText;
scrollbar.setScrollPosition(chatBox.maxscroll);
}
Первая строка содержит действие stop() – это останавливает воспроизведение фильма на первом кадре до дальнейших указаний. Со следующей строки начинается описание функции. Функция будет обновлять текст, отображаемый в окне чата (текст в поле chatBox с включенной опцией HTML). Окно чата находится в кадре с меткой . Функция при вызове принимает один параметр, под именем , который является текстовой строкой в формате HTML – с соответствующими тегами: разрыв строки ( <BR> ) и т.п. Первая строка в chatText, в которой хранится полная "стенограмма" чата. В общем-то, эта переменная содержит необработанное HTML-представление сеанса чата. В следующей строке функции переменная chatText используется для обновления окна чата (текстовое поле chatBox ). Поскольку для этого поля включена опция HTML, сырой HTML из переменной chatText
будет обработан и отображен как нормальный текст с соответствующим форматированием.

Если вы посмотрите на кадр с меткой , то увидите, что к текстовому полю chatBox присоединен setScrollPosition() используется для прокрутки текста в поле, к которому присоединен компонент. Таким образом, последняя строка функции прокручивает текст в поле chatBox в самый конец.
Эта функция будет интенсивно использоваться в нашем приложении, особенно при onXML.
function initializeChat (itWorked) {
if(itWorked) {
_root.gotoAndStop("login");
} else {
_root.gotoAndStop("failed");
}
}
Эта функция будет вызываться обработчиком события onConnect (мы создадим его на шаге 8). Этот обработчик будет автоматически передавать функции значение true или false (параметр itWorked ), в зависимости от того, удалось ли установить соединение. Оператор if проанализирует значение параметра и выполнит соответствующее действие. Если соединение успешно установлено (то есть itWorked имеет значение true ), монтажный стол фильма будет перемещен к кадру с меткой login. Если установить соединение не удалось, произойдет переход к кадру с меткой . Таким образом, эта функция не допустит перехода пользователя к экрану входа на сайт, если он не соединен с сервером.
function received (info) {
info.ignoreWhite = true;
var from = info.firstChild.firstChild.attributes.from;
var message = info.firstChild.firstChild.firstChild.nodeValue;
setChatText("<BR><B><FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#333333\">
"+from +"</B></FONT>: <FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#999999\">
"+message+"</FONT>");
}
Эту функцию мы назначим для onXML (на шаге 8), то есть она будет вызываться при получении информации с сервера. Параметр info представляет собой полученные XML-данные. Эти полученные данные (сообщение чата) идентичны данным, которые послал сервер. Они форматированы так:
<doc> <message from="jobe">Hello world</message> </doc>
В двух первых строках функции используются свойства объекта XML – для присвоения значений from и message. Согласно структуре XML-документа значением переменной from станет имя пославшего сообщение, а переменная message будет содержать сам текст сообщения. После этого эти переменные используются при setChatText() (описанной на шаге 2).
Примечание Информацию об использовании текста в HTML-формате вы найдете в Уроке 13 – Проверка и форматирование данных.
function connectionClosed () {
setChatText("<BR><B><FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#666666\">
The connection has been terminated.</B></FONT>");
}
Вскоре мы назначим эту функцию для onClose (на шаге 8). Функция будет вызываться при закрытии или потере соединения с сервером. Собственно, все действие этой функции заключается в вызове другой функции – setCharText(), которая, как вы помните, обновляет текст в окне чата. Таким образом, при завершении соединения в окне чата появляется сообщение "The connection has been
function closeConnection () {
server.close();
}
Вызов этой функции приведет к принудительному разрыву onClose. Вызов этой функции мы вскоре присоединим к одной из кнопок.
function send (messageToSend) {
server.send("<doc><message from=\""+screenName+"\">"+messageToSend+"</message></doc>");
}
Эта функция посылает сообщение на сервер при помощи метода – само сообщение передается функции как параметр ( messageToSend ); его значение – это любой текст, введенный пользователем. Этот текст форматируется в
<doc> <message from="jobe">Hello</message> </doc>
Этот документ отсылается на сервер, и тот рассылает его всем прочим пользователям; вызывается функция (мы описали ее на шаге 4) и выводит новое полученное сообщение во всех открытых окнах чата.

XML.prototype.ignoreWhite = true;
server = new XMLSocket();
server.onConnect = initializeChat;
server.onXML = received
server.onClose = connectionClosed;
server.connect("localhost",9999);
Первая строка здесь устанавливает свойство ignoreWhite всех XML-объектов в значение true. Благодаря этому все "пустые" пробелы (то есть, отступы и ignoreWhite значение true, вы можете получить дополнительные ненужные "узлы". Не беспокойтесь об отступах и переводах строки внутри узлов – с ними ничего не случится. Свойство ignoreWhite действует только между узлами.
Остальные строки этого скрипта создают новый объект с именем server и назначают функции для обработки всех его событий. Последняя строка открывает соединение с сервером. Напомним: все это у нас запрограммировано в кадре 1, а значит, будет выполнено (либо определено) сразу после начала воспроизведения фильма.
on (release) {
_root.gotoAndStop(1);
}
При неудачной попытке установления соединения фильм перемещается к кадру с меткой . Этой кнопкой мы даем пользователю возможность повторить попытку установить соединение, перемещая фильм опять к кадру 1, где содержатся запрограммированные нами действия для установления соединения.
selection.setFocus("nameField");
Когда фильм перейдет к этому кадру, данная строка установит курсор в текстовое поле nameField. Таким образом, пользователь сможет сразу начать вводить свое имя – ему не придется щелкать мышкой в этом текстовом поле. Для нас запрограммировать это совсем не сложно, а для пользователей будет большое удобство.
on (release, keyPress "<Enter>") {
if (nameField.text != "") {
screenName = nameField.text;
_root.gotoAndStop("chat");
}
}
Этот скрипт будет устанавливать "экранное имя" пользователя, которое будет использоваться при передаче сообщений (см. шаг 7). Когда пользователь нажмет кнопку Submit, оператор if сначала проверит, введено ли хоть что-нибудь в текстовое поле nameField. Текст из этого поля станет значением переменной screenName – именно она и будет содержать "экранное имя" пользователя. Последнее действие перемещает монтажный стол фильма к кадру с меткой , где пользователь уже сможет отправлять и получать сообщения.
setChatText("<FONT FACE=\"arial\" SIZE=\"20\" COLOR=\"#666666\">
<b>You have just joined the chat!</b></FACE>");
selection.setFocus("chatMessage");
Эти действия будут выполнены, как только фильм перейдет к кадру с меткой . Первая строка вызывает функцию setChatText() (описанную на шаге 2), которая отобразит в окне чата сообщение для пользователя о том, что он только что присоединился к чату.

Следующая строка устанавливает курсор в текстовое поле chatMessage, где пользователь может вводить свои сообщения для передачи. Это сделано для удобства – как и скрипт на шаге 10.
on (release,keyPress "<enter>") {
if (chatMessage.text != "") {
send(chatMessage.text);
chatMessage.text = "";
}
}
Этот скрипт будет отсылать введенное пользователем сообщение при нажатии кнопки if проверяет, введено ли хоть что-нибудь в поле chatMessage. Если в нем имеется какой-либо текст, он передается в качестве параметра функции , описанной нами на шаге 7.
Последнее действие в этом скрипте опустошает текстовое поле chatMessage, так что пользователь сможет сразу начать вводить следующее сообщение.
on (release) {
closeConnection();
}
Этот скрипт вызывает функцию closeConnection(), описанную на шаге 6. Когда пользователь нажмет эту кнопку,
Инструкции, как это сделать, вы найдете в предыдущем разделе.
В окне чата у вас должны появиться HTML-форматированные сообщения. Вы можете открыть несколько экземпляров этого SWF-файла и попробовать вести чат сразу за нескольких пользователей. Нажав кнопку Close connection, вы увидите сообщение о том, что вы отключены от чата.
Мы, наконец, закончили! Как вы убедились, чтобы создать даже самое простое чат-приложение, требуется выполнить немалую работу. Зато теперь вы освоились с XML, а также приобрели опыт построения довольно больших и сложных приложений.
По существу, стандартизация дает возможность взаимодействовать между собой разнородным предметам – фонарику и батарейкам, Macromedia
В этом уроке мы познакомим вас с основами формата XML, а также покажем, как можно использовать во
В этом уроке:

Несложное чат-приложение, которое мы запрограммируем в этом уроке, будет использовать соединение типа XML
socket .
На выполнение этого урока требуется примерно полтора часа.
Файлы-носители:
Нет
Стартовые файлы:
Lesson12/Assets/LoginRegister1.fla Lesson12/Assets/Chat1.fla
Законченные проекты:
LoginRegister2.fla Chat2.fla
Хотя само название XML, или
Когда вы хотите написать другу письмо, вы должны структурировать свои мысли (информацию) в таком формате, который ваш друг сможет распознать. Итак, вы начинаете писать слова на листе бумаги, начиная с левого верхнего угла и разделяя свои мысли на абзацы, предложения и слова. Конечно, вы могли бы писать не слева направо, а как-нибудь по кругу, или вообще попытаться передать свои мысли картинками, однако такой способ, скорее всего, лишь приведет вашего друга в недоумение. А написав письмо в таком формате, который вашему другу привычен, вы сможете быть уверены в том, что ваше послание будет понято – то есть передача ваших мыслей (данных, информации) получателю письма совершится успешно.

Для того же предназначен и XML – это формат для передачи информации. Если, к примеру, нужно переслать данные из
В синтаксисе XML, подобно HTML, используются теги, атрибуты и значения – но на этом сходство и заканчивается. Тогда как в HTML используются заранее определенные теги (например, body, head или html ), в XML пользователь создает свои собственные, а не выбирает готовые имена из библиотеки. Давайте для начала рассмотрим вот этот простой документ XML:
<MyFriends> <Name Gender="female">Kelly Makar</Name> <Name Gender="male">Mike Grundvig</Name> <Name Gender="male">Free Makar</Name> </MyFriends>
Каждый тег XML называется узлом ( ), набор данных в формате XML называется документом XML. В нашем документе-примере имеется корневой узел MyFriends и три дочерних узла. Каждый Name и значение узла Kelly Makar. Слово Gender в каждом из дочерних узлов – атрибут. Атрибуты необязательны; каждый узел может иметь неограниченное число атрибутов. Обычно атрибуты используются для размещения небольших порций информации, которые необязательно отображать на экране (например, идентификационный номер пользователя).

Как вы видите в этом примере, теги (которые мы сами же создали и описали) придают смысл порциям информации (Kelly Makar, Mike Grundvig и
Следующий
<AddressBook>
<Person>
<Name>Kelly Makar</Name>
<Street>121 Baker Street</Street>
<City>Some City</City>
<State>North Carolina</State>
</Person>
<Person>
<Name>Tripp Carter</Name>
<Street>777 Another Street</Street>
<City>Elizabeth City</City>
<State>North Carolina</State>
</Person>
</AddressBook>
В этом примере показано, как могут выглядеть данные
Каким же образом следует создавать свои узлы, свою структуру? Как объект-получатель (ASP-страница,

Иногда также используют текстовые файлы, содержащие информацию в формате XML – например, статичный XML-файл, хранящий информацию о том, какую ASP-страницу следует вызвать или какой порт и IP-адрес использовать для соединения с
Итак, с основами структуры XML вы ознакомились; теперь мы перечислим некоторые правила, которым необходимо следовать при составлении XML-документов.
<Name> служит </Name>.escape () ). Многие анализаторы интерпретируют некоторые не кодированные служебные символы как начало нового узла – а потом не обнаруживают его завершения. Документ с незавершенными узлами не сможет пройти через XML-анализатор полностью. С атрибутами нужно быть еще внимательнее – здесь ошибку анализа могут вызвать даже такие символы, как ). Правильно кодируя текст по стандарту URL, вы избежите подобных проблем.<Name>, а завершился </name>, это приведет к ошибке.Прежде чем приступить к работе, стоит, пожалуй, упомянуть еще об одном. Все это правильное и красивое оформление структуры XML-документа (каждый узел с новой строки, отступы для дочерних узлов и т.п.) совершенно необязательно. Все это просто облегчает чтение документа для нас. А для XML-анализаторов это просто пустое место; им все равно, есть эти отступы или нет их.
Что ж, пришла пора применить XML! Во
Объект XML имеет набор методов, предназначенных для создания и форматирования XML-документов. Правда, они весьма не просты в использовании – однако существует и более простой способ форматирования XML-объектов: нужно создать строку и затем преобразовать ее в объект XML.
Во
myXML = new XML();
Чтобы заполнить этот объект данными в формате XML, необходимо передать конструктору (указать в скобках)
Предположим, что мы хотим создать во
<MyFriends> <Name Gender="female">Kelly Makar</Name> <Name Gender="male">Free Makar</Name> </MyFriends>
Для этого мы должны сделать две вещи:
Например, так:
myString = "<MyFriends><Name Gender=\"female"\>Kelly Makar</Name><Name Gender=\"male"\>Free Makar</Name></MyFriends>"; myXML = new XML(myString);
Как видите, в этом скрипте текст XML-документа создается в виде строки, которая затем преобразовывается в настоящий объект XML под названием myXML. Затем этот объект можно послать для обработки на сервер, воспользовавшись одним из предназначенных для этого методов (которые мы опишем далее в этом разделе).
Слово анализ в данном случае означает разбор на составные, структурные части. Так, когда говорят о написании скрипта, анализирующего myXML.
: Это свойство указывает на первый узел внутри структуры. Например: myXML. возвратит значение <Name Gender="female">Kelly Makar</Name>. Первый дочерний узел XML-документа есть корневой узел ( MyFriends ), а первый дочерний узел корневого узла – Name.
childNodes: Это свойство возвращает массив дочерних узлов данной точки структуры. Например: myArray = myXML.. Массив myArray будет содержать два элемента, значения которых будут равны значениям двух узлов Name.
nextSibling: Это свойство указывает на следующий узел того же уровня в структуре. Например, myXML. возвратит <Name Gender="male">.
: Это свойство возвращает ассоциативный массив имен атрибутов. Например: myXML. возвратит значение "male".

Мы рассказали здесь лишь о наиболее употребительных свойствах объекта XML; прочие свойства работают похожим образом, указывая на различные части структуры документа.
Обычно работа с XML во
load() объекта XML загрузить данные в XML-формате из внешнего источника.Например:
myXML = new XML();
myXML.load("http://somedomain.com/info.xml");
В данном случает документ загружается из статичного XML-файла, однако это не единственный путь. Можно указать ASP-страницу (или другую страницу сценария), результатом выполнения скрипта которой станет
Как узнать, что загрузка XML из источника в объект XML завершилась? Очень просто – с помощью события onLoad объекта XML. Можно использовать обработчик этого события для вызова функции, которую необходимо выполнить по окончании загрузки. Возьмем такой пример:
function init () {
//здесь могут быть действия, анализирующие документ
}
myXML = new XML();
myXML.onLoad = init;
myXML.load("http://somedomain.com/info.xml");
Как указывает вторая снизу строка, по завершении загрузки документа XML должна быть вызвана функция .
Объект XML дает возможность отослать XML-данные по указанному адресу. Также имеется возможность, послав XML, сразу же загрузить результаты его обработки.
Для отсылки XML нужно воспользоваться методом , указав необходимый URL. Например:
myXML = new XML("<Message><Text>Hi!</Text></Message>");
myXML.send("http://somedomain.com/somedestination.asp");
Чтобы послать XML и сразу получить ответ, следует применить метод sendAndLoad() объекта XML. При этом необходимо указать XML-объект, содержимое которого нужно отослать, URL-адрес места назначения, а также объект XML, в который должно быть загружено ответное послание. Как и в случае с методом load(), здесь событие onLoad поможет узнать, что ответ уже загружен. Вот пример:
URL = "http://www.electrotank.com/projects/tfts/using_xml/UserLogin.asp";
function init () {
trace(objToReceive);
}
xmlToSend =
"<Login><UserName>Jobem</UserName><Password>hayes</Password></Login>";
objToSend = new XML(xmlToSend);
objToReceive = new XML();
objToReceive.onLoad = init;
objToSend.sendAndLoad(URL, objToReceive);
Данный скрипт создает объект XML ( objToSend ), содержащий информацию для входа на сайт, и затем отсылает его на URL, ожидая получить ответ. Как только этот ответ будет полностью загружен в принимающий XML-объект ( objToReceive ), вызывается функция .

Итак, вы кое-что узнали о формате XML, а также об объектах XML, их методах и свойствах. Пора применить знания на практике! В этом разделе урока мы с вами создадим несколько простых XML-документов, выполним несложный анализ и применим метод sendAndLoad() – все это в рамках
Страница
<Register> <UserName>jobem</UserName> <Email>jobe@electrotank.com</Email> <Password>secret</Password> </Register>
В случае правильной регистрации пользователя страница
<Register> <Message>User Inserted</Message> </Register>
Если же пользователь с таким именем уже существует, будет возвращен такой результат:
<Register> <Message>User Exists</Message> </Register>
Страница UserLogin.asp воспринимает
<Login> <UserName>jobem</UserName> <Password>secretword</Password> </Login>
Если информация верна, то страница возвращает следующий результат:
<Login> <Message>Login Correct</Message> </Login>
Если информация неверна, будет возвращен такой результат:
<Login> <Message>Login Incorrect</Message> </Login>
Все необходимые кадры, текстовые поля и кнопки в этом файле уже созданы. Файл имеет четыре слоя: в слое Actions мы будем размещать все наши скрипты, слой Labels содержит метки кадров, в слое

Этим мы предотвращаем автоматическое воспроизведение фильма.
on (release) {
_root.gotoAndStop("login");
}
Если пользователь нажмет эту кнопку, на экран будет выведен кадр, предлагающий заполнить форму входа на сайт.
on (release) {
_root.gotoAndStop("register");
}
При нажатии пользователем этой кнопки на экран будет выводиться кадр, предлагающий заполнить форму регистрации пользователя для создания новой учетной записи.
loginURL="http://вашдомен.com/projects/tfts/using_xml/UserLogin.asp";

Это будет адрес ASP-страницы, принимающей
function loginSubmit () {
xmlToSend =
"<Login><UserName>"+userName.text+"</UserName><Password>"+password.text+"</Password></Login>";
objToSend = new XML(xmlToSend);
objToReceive = new XML();
objToReceive.onLoad = loginResponse;
objToSend.sendAndLoad(loginURL,objToReceive);
_root.gotoAndStop("waiting");
}
Эта функция будет вызываться при нажатии кнопки Submit (мы потом присоединим к ней соответствующий скрипт). В первой строке функции используются значения, введенные в текстовые поля и password. Они вставляются в текстовую строку данных XML-формата; эта строка становится значением переменной xmlToSend. Затем мы создаем новый объект XML с именем objToSend и передаем ему только что sendAndLoad() работает только с XML-объектами – мы не можем применить его непосредственно к строке. Далее мы создаем новый объект под именем objToReceive. В этот XML-объект будет загружаться ответ ASP-страницы. Далее мы, используя событие onLoad, указываем, что по завершении objToReceive должна быть вызвана функция loginResponce() (эту функцию мы создадим на следующем шаге).
Следующим действием вызывается метод sendAndLoad() с указанием передающего объекта, URL назначения и объекта, в который должен быть загружен ответ. Наконец, последнее действие перемещает монтажный стол к кадру с меткой , информируя пользователя о том, что данные переданы и ожидается ответ сервера.
function loginResponse () {
var response = objToReceive.firstChild.firstChild.firstChild.nodeValue;
if (response == "Login Correct") {
_root.gotoAndStop("login success");
} else if (response == "Login Incorrect") {
_root.gotoAndStop("login failed")
}
}
Эта функция будет вызвана, как только последний байт XML будет загружен в XML-объект objToReceive. Функция анализирует ответ, полученный с сервера.
Первая response и присваивает ей значение, извлеченное из XML-документа, возвращенного сервером. Если помните, ответ страницы UserLogin.asp имеет такой формат:
<Login> <Message>Login Correct|Login Incorrect</Message> </Login>
Таким образом, переменная response получит значение "Login if, который, в зависимости от значения response, отправляет фильм к кадру с меткой login success либо login . Тем самым фильм покинет кадр , на котором, как вы помните, он был остановлен в ожидании ответа сервера.
on (release, keyPress "<Enter>") {
loginSubmit();
}
При нажатии этой кнопки будет вызвана и выполнена функция loginSubmit(). Тем самым будет активирован процесс входа на сайт, описанный на предыдущих шагах.
Подведем итоги. При вызове функции loginSubmit() XML-данные отсылаются на сервер, а фильм перемещается к кадру с меткой . По получении ответа с сервера автоматически вызывается функция loginResponse(), и фильм переходит к кадру с меткой login success либо login .
Теперь мы запрограммируем обработку проектом процесса регистрации.
registrationURL = "http://вашдомен.com/projects/tfts/using_xml/AddUser.asp";
Это адрес ASP-страницы, которая будет принимать для обработки

function registrationSubmit () {
XMLtoSend= "<Register><UserName>" + userName.text + "</UserName><Email>
" + email.text + "</Email><Password>" + password.text + "</Password></Register>";
objToSend = new XML(XMLtoSend);
objToReceive = new XML();
objToReceive.onLoad = registrationResponse;
objToSend.sendAndLoad(registrationURL,objToReceive);
_root.gotoAndStop("waiting");
}
Эта функция очень похожа на функцию loginSubmit(), описанную нами на шаге 6 – различия заключаются лишь в структуре данных XML и некоторых именах. Обратите внимание, что и password.text. Эти данные должны быть введены пользователем в соответствующие текстовые поля. Скрипт-получатель проанализирует документ и извлечет эти данные.
function registrationResponse () {
var response = objToReceive.firstChild.firstChild.firstChild.nodeValue;
if (response == "User Inserted") {
_root.gotoAndStop("registration success");
} else if (response == "User Exists") {
_root.gotoAndStop("registration failed")
}
}
Эта функция будет вызвана, как только последний байт XML будет загружен в XML-объект objToReceive. Функция очень похожа на функцию loginResponse(), описанную нами на шаге 7. Если помните, страница
<Register> <Message>User Inserted|User Exists</Message> </ Register >
Таким образом, переменная response получит значение либо "User Inserted", либо "User Exists". Затем оператор if, используя это значение, отправляет фильм к кадру с меткой либо .
on (release, keyPress "<Enter>") {
registrationSubmit();
}
При нажатии этой кнопки либо клавиши Enter будет вызвана функция registrationSubmit(). Тем самым будет активирован процесс регистрации пользователя, описанный на предыдущих шагах. Таким образом, при вызове функции registrationSubmit() XML-данные отсылаются на сервер, а фильм перемещается к кадру с меткой . По получении ответа с сервера автоматически вызывается функция registrationResponse(), и фильм переходит к кадру с меткой login success либо login .
Мы с вами только что создали несложное приложение, иллюстрирующее применение объекта XML. Протестируйте фильм еще несколько раз; убедитесь, что вы поняли, как это запрограммировано и как работает.
Теперь вы готовы приступить к созданию более продвинутых приложений,
Ключевая мысль: при использовании
Учтите, однако, что
В следующем упражнении мы покажем вам, как подготовить и запустить

На прилагаемом к книге
Далее мы расскажем вам, как запустить сервер для определенного порта. Вот что следует сделать для запуска сервера в Windows:
Буквы cd – это команда смены каталога ( change directory ).
Это предложение следует вводить в точности так, как написано, соблюдая заглавные и строчные буквы. В окне командной строки должна отобразиться информация о том, что сервер запущен и прослушивает порт 9999.
Если вы правильно установили
AquaServer – один из немногих бесплатных
Чтобы
Для создания нового объекта
server = new XMLSocket();
Приведенная строка с именем server. Для установления соединения с сервером следует применить метод connect(), используя следующий синтаксис:
server.connect(hostName,port);
Параметр , по которому находится указывает на порт, который прослушивается сервером.
server = new XMLSocket();
server.connect("localhost",9999);
Закрыть соединение с сервером можно с помощью метода close() – это выглядит так:
server.close();
Для передачи информации через с указанием объекта, который нужно передать. Например:
server.send("<Text>Hi</Text>");
способен обрабатывать следующие виды событий:
Мы можем назначить обработчики этих событий для созданного нами объекта (так же, как мы делали с событием onLoad объекта XML).
Например:
function serverConnected (success) {
trace(success);
}
server.onConnect = serverConnected;
Здесь, как видите, функция serverConnected() вызывается при возникновении события onConnect. Параметр success, использованный в описании функции, имеет значение true, если соединение установлено успешно, и false – если соединение не удалось установить.
Событие onXML используется следующим образом:
function xmlReceived (data) {
trace(data);
}
server.onXML = xmlReceived;
Функция xmlReceived() будет вызываться каждый раз, когда через data содержит
Событие onClose можно использовать так:
function socketClosed () {
//уведомление для пользователя
}
server.onClose = socketClosed;
Обработчик этого события обычно используют, чтобы уведомить пользователя о том, что соединение разорвано.
В этом упражнении мы с вами построим несложное чат-приложение, соединяющееся с AquaServer (бесплатный
Этот файл содержит четыре слоя: в слой Actions мы будем помещать наши скрипты, слой Labels содержит метки кадров фильма, в слое

Мы начнем с того, что запрограммируем базовые функциональные возможности нашего чат-приложения. Позднее мы присоединим соответствующие действия к различным кнопкам.
stop();
function setChatText (msg) {
chatText += msg;
chatBox.htmlText = chatText;
scrollbar.setScrollPosition(chatBox.maxscroll);
}
Первая строка содержит действие stop() – это останавливает воспроизведение фильма на первом кадре до дальнейших указаний. Со следующей строки начинается описание функции. Функция будет обновлять текст, отображаемый в окне чата (текст в поле chatBox с включенной опцией HTML). Окно чата находится в кадре с меткой . Функция при вызове принимает один параметр, под именем , который является текстовой строкой в формате HTML – с соответствующими тегами: разрыв строки ( <BR> ) и т.п. Первая строка в chatText, в которой хранится полная "стенограмма" чата. В общем-то, эта переменная содержит необработанное HTML-представление сеанса чата. В следующей строке функции переменная chatText используется для обновления окна чата (текстовое поле chatBox ). Поскольку для этого поля включена опция HTML, сырой HTML из переменной chatText
будет обработан и отображен как нормальный текст с соответствующим форматированием.

Если вы посмотрите на кадр с меткой , то увидите, что к текстовому полю chatBox присоединен setScrollPosition() используется для прокрутки текста в поле, к которому присоединен компонент. Таким образом, последняя строка функции прокручивает текст в поле chatBox в самый конец.
Эта функция будет интенсивно использоваться в нашем приложении, особенно при onXML.
function initializeChat (itWorked) {
if(itWorked) {
_root.gotoAndStop("login");
} else {
_root.gotoAndStop("failed");
}
}
Эта функция будет вызываться обработчиком события onConnect (мы создадим его на шаге 8). Этот обработчик будет автоматически передавать функции значение true или false (параметр itWorked ), в зависимости от того, удалось ли установить соединение. Оператор if проанализирует значение параметра и выполнит соответствующее действие. Если соединение успешно установлено (то есть itWorked имеет значение true ), монтажный стол фильма будет перемещен к кадру с меткой login. Если установить соединение не удалось, произойдет переход к кадру с меткой . Таким образом, эта функция не допустит перехода пользователя к экрану входа на сайт, если он не соединен с сервером.
function received (info) {
info.ignoreWhite = true;
var from = info.firstChild.firstChild.attributes.from;
var message = info.firstChild.firstChild.firstChild.nodeValue;
setChatText("<BR><B><FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#333333\">
"+from +"</B></FONT>: <FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#999999\">
"+message+"</FONT>");
}
Эту функцию мы назначим для onXML (на шаге 8), то есть она будет вызываться при получении информации с сервера. Параметр info представляет собой полученные XML-данные. Эти полученные данные (сообщение чата) идентичны данным, которые послал сервер. Они форматированы так:
<doc> <message from="jobe">Hello world</message> </doc>
В двух первых строках функции используются свойства объекта XML – для присвоения значений from и message. Согласно структуре XML-документа значением переменной from станет имя пославшего сообщение, а переменная message будет содержать сам текст сообщения. После этого эти переменные используются при setChatText() (описанной на шаге 2).
Примечание Информацию об использовании текста в HTML-формате вы найдете в Уроке 13 – Проверка и форматирование данных.
function connectionClosed () {
setChatText("<BR><B><FONT FACE=\"arial\" SIZE=\"15\" COLOR=\"#666666\">
The connection has been terminated.</B></FONT>");
}
Вскоре мы назначим эту функцию для onClose (на шаге 8). Функция будет вызываться при закрытии или потере соединения с сервером. Собственно, все действие этой функции заключается в вызове другой функции – setCharText(), которая, как вы помните, обновляет текст в окне чата. Таким образом, при завершении соединения в окне чата появляется сообщение "The connection has been
function closeConnection () {
server.close();
}
Вызов этой функции приведет к принудительному разрыву onClose. Вызов этой функции мы вскоре присоединим к одной из кнопок.
function send (messageToSend) {
server.send("<doc><message from=\""+screenName+"\">"+messageToSend+"</message></doc>");
}
Эта функция посылает сообщение на сервер при помощи метода – само сообщение передается функции как параметр ( messageToSend ); его значение – это любой текст, введенный пользователем. Этот текст форматируется в
<doc> <message from="jobe">Hello</message> </doc>
Этот документ отсылается на сервер, и тот рассылает его всем прочим пользователям; вызывается функция (мы описали ее на шаге 4) и выводит новое полученное сообщение во всех открытых окнах чата.

XML.prototype.ignoreWhite = true;
server = new XMLSocket();
server.onConnect = initializeChat;
server.onXML = received
server.onClose = connectionClosed;
server.connect("localhost",9999);
Первая строка здесь устанавливает свойство ignoreWhite всех XML-объектов в значение true. Благодаря этому все "пустые" пробелы (то есть, отступы и ignoreWhite значение true, вы можете получить дополнительные ненужные "узлы". Не беспокойтесь об отступах и переводах строки внутри узлов – с ними ничего не случится. Свойство ignoreWhite действует только между узлами.
Остальные строки этого скрипта создают новый объект с именем server и назначают функции для обработки всех его событий. Последняя строка открывает соединение с сервером. Напомним: все это у нас запрограммировано в кадре 1, а значит, будет выполнено (либо определено) сразу после начала воспроизведения фильма.
on (release) {
_root.gotoAndStop(1);
}
При неудачной попытке установления соединения фильм перемещается к кадру с меткой . Этой кнопкой мы даем пользователю возможность повторить попытку установить соединение, перемещая фильм опять к кадру 1, где содержатся запрограммированные нами действия для установления соединения.
selection.setFocus("nameField");
Когда фильм перейдет к этому кадру, данная строка установит курсор в текстовое поле nameField. Таким образом, пользователь сможет сразу начать вводить свое имя – ему не придется щелкать мышкой в этом текстовом поле. Для нас запрограммировать это совсем не сложно, а для пользователей будет большое удобство.
on (release, keyPress "<Enter>") {
if (nameField.text != "") {
screenName = nameField.text;
_root.gotoAndStop("chat");
}
}
Этот скрипт будет устанавливать "экранное имя" пользователя, которое будет использоваться при передаче сообщений (см. шаг 7). Когда пользователь нажмет кнопку Submit, оператор if сначала проверит, введено ли хоть что-нибудь в текстовое поле nameField. Текст из этого поля станет значением переменной screenName – именно она и будет содержать "экранное имя" пользователя. Последнее действие перемещает монтажный стол фильма к кадру с меткой , где пользователь уже сможет отправлять и получать сообщения.
setChatText("<FONT FACE=\"arial\" SIZE=\"20\" COLOR=\"#666666\">
<b>You have just joined the chat!</b></FACE>");
selection.setFocus("chatMessage");
Эти действия будут выполнены, как только фильм перейдет к кадру с меткой . Первая строка вызывает функцию setChatText() (описанную на шаге 2), которая отобразит в окне чата сообщение для пользователя о том, что он только что присоединился к чату.

Следующая строка устанавливает курсор в текстовое поле chatMessage, где пользователь может вводить свои сообщения для передачи. Это сделано для удобства – как и скрипт на шаге 10.
on (release,keyPress "<enter>") {
if (chatMessage.text != "") {
send(chatMessage.text);
chatMessage.text = "";
}
}
Этот скрипт будет отсылать введенное пользователем сообщение при нажатии кнопки if проверяет, введено ли хоть что-нибудь в поле chatMessage. Если в нем имеется какой-либо текст, он передается в качестве параметра функции , описанной нами на шаге 7.
Последнее действие в этом скрипте опустошает текстовое поле chatMessage, так что пользователь сможет сразу начать вводить следующее сообщение.
on (release) {
closeConnection();
}
Этот скрипт вызывает функцию closeConnection(), описанную на шаге 6. Когда пользователь нажмет эту кнопку,
Инструкции, как это сделать, вы найдете в предыдущем разделе.
В окне чата у вас должны появиться HTML-форматированные сообщения. Вы можете открыть несколько экземпляров этого SWF-файла и попробовать вести чат сразу за нескольких пользователей. Нажав кнопку Close connection, вы увидите сообщение о том, что вы отключены от чата.
Мы, наконец, закончили! Как вы убедились, чтобы создать даже самое простое чат-приложение, требуется выполнить немалую работу. Зато теперь вы освоились с XML, а также приобрели опыт построения довольно больших и сложных приложений.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.