Понятное дело что Flash имеет массу ограничений по отображению HTML тэгов. В ячейке ниже выводится полная версия поста. Делается это с помощью короткого JavaScript. NB: За период Лето 2007 у меня в ЖЖ есть очень объемные записи с фотографиями. Так что если экономите трафик, особо не кликайте. |
| 0 | без ошибок; парсинг успешно завершен. |
| -2 | Секция CDATA неправельно оканчивается. |
| -3 | декларация XML неправельно оканчивается. |
| -4 | декларация DOCTYPE dнеправельно оканчивается. |
| -5 | Комментарий неправельно закрыт. |
| -6 | Элемент XML неправельно форматирован. |
| -7 | Нехватает памяти. |
| -8 | Значение атрибута неправельно оканчивается. |
| -9 | Начальный тэг не совпадает с закрывающим его конечным тэгом. |
| -10 | Конечный тэг не совпадает с открывающим его начальным тэгом. |
dynamic class XMI extends XML {
private var xml_data_obj:Object;
private var interval:Number;
function XMI() {
super();
AsBroadcaster.initialize(this);
ignoreWhite = true;
}
public function addListener(xobj:Object) {
}
public function removeListener(xobj:Object) {
}
public function broadcastMessage(event_name:String) {
}
public function load(url:String) {
interval = setInterval(this, "checkProgress", 100);
return super.load.apply(super, arguments);
}
private function onLoad(success:Boolean) {
//
if (!success || status != 0) {
clearInterval(interval);
return broadcastMessage("onLoadFailure", status);
}
var xml_data_obj:Object = parse(firstChild);
var cnt:Number = 0;
for (var i in xml_data_obj) {
++cnt;
if (cnt>1) {
break;
}
}
if (cnt == 1) {
xml_data_obj = xml_data_obj[i];
}
var tmp = {};
tmp.data = xml_data_obj;
broadcastMessage("onXMLLoad", tmp.data, this);
}
private function parse(node:XMLNode):Object {
var value:Object = new Object();
var nodes:Number = node.childNodes.length;
for (var i = 0; i != nodes; ++i) {
var name:String = node.childNodes[i].nodeName;
if (name != null) {
if (value[name] != undefined) {
if (!(value[name] instanceof Array)) {
value[name] = new Array(value[name]);
}
value[name].push(getValue(node.childNodes[i]));
} else {
value[name] = getValue(node.childNodes[i]);
}
} else {
value = getValue(node.childNodes[i]);
}
}
var attributes:Object = getAttributes(node);
if (attributes != null) {
if (nodes != 0) {
if (!(value instanceof XMLNode)) {
for (var i in value) {
attributes[i] = value[i];
}
} else {
attributes['_val'] = value.nodeValue;
}
}
return attributes;
}
return value;
}
private function getAttributes(node:XMLNode):Object {
var attributes = new Object();
for (var i in node.attributes) {
attributes[i] = node.attributes[i];
}
return i != undefined ? attributes : null;
}
private function getValue(node:XMLNode):Object {
switch (node.nodeType) {
case 1 :
return parse(node);
case 3 :
return node;
}
return null;
}
private function checkProgress() {
var bytes_loaded:Number = getBytesLoaded();
var bytes_lotal:Number = getBytesTotal();
if (bytes_loaded == bytes_lotal) {
clearInterval(interval);
}
broadcastMessage("onXMLLoadProgress", bytes_loaded, bytes_lotal);
}
}
XML.load(); XML.sendAndLoad(); LoadVars.load(); LoadVars.sendAndLoad(); loadVariables(); loadVariablesNum();Flash документ пытается загрузить файл с кросс-доменными правилами (crossdomain.xml, cross-domain policy file). Файл с кросс-доменными правилами представляет из себя XML файл, который дает возможность серверу "показать", что его данные и документы доступны для SWF файлов, находящихся в указанных в файле с правилами доменах. Любой SWF файл, который находится в домене, указанном в файле с правилами на сервере, будет иметь доступ к файлам и данным на этом сервере.
Когда Flash документ пытается получить доступ к файлу в другом домене, Flash Player автоматически пытается загрузить файл с правилами с этого домена. Если домен, в котором находится Flash документ, включен в файл с правилами, он получает доступ к данным.
Файл с правилами должен иметь имя crossdomain.xml и может находиться в корневом или ином каталоге сервера (в последнем случае необходимо будет указать где при помощи ActionScript, например так:
System.security.loadPolicyFile("http://ink.envisionext.com/docs/xml_files/crossdomain.xml");.
Файлы с правилами работают только на серверах, взаимодействующих по HTTP, HTTPS или FTP. Файл с правилами зависит от протокола и порта сервера, на котором он находится.
Как уже видно, XML файл с правилами состоит из одного единственного тэга <cross-domain-policy>, который, в свою очередь, содержит 0, 1 или более тэгов <allow-access-from/>. Каждый тэг <allow-access-from/> содержит аттрибут domain, определяющий либо точный IP адрес, либо точное имя домена, либо групповой символ, указывающий на любой домен. Групповым символом может быть астерикс (*), соответствующий всем доменам и всем IP адресам, или астерикс с суффиксом, соответствующий всем доменам с таким суффиксам. Если дочитали до этого места, то подробнее можно дочитать на русском сдесь.
Файл с правилами, не содержащий <allow-access-from/> тэгов, равносилен его полному отсутствию.


&' (ampersand) стает '&'
'"' (double quote) стает '"'
''' (single quote) стает '''
'<' (less than) превращается в '<'
'>' (greater than) и сотвецтвенно '>' и так далее...
Но иногда просто таки жизненно неоходимо впихнуть что то поизвращенней. Но скорее всего, из за того что Flash имеет проблемы с отобрадением HTML, нужно впихнуть предформатированиы
<PRE> текст. Я засовываю его обычно в CDATA.
Что такое CDATA? CDATA — <![CDATA[Это всякая муть с кучей специальных символов которой место как раз тут. Например такая: <div id="flashid" style="width:100%; height:325px;">]]>. Дальше и больше о CDATA ничего знать ненадо. Итак. Что же делать с полученым в таком виде (<div id="flashid" style="width:100%; height:325px;">]]>) текстом? Он совсем не годится для отображении в htmlText полях.
Есть способ дурацкий, а есть правельный. Итак правельный способ. Заодно бонусом ответ на поставленый (если учесть что этот текст я начал писать два года назад то "только что поставленый") вопрос в сообществе ru_flash.
Для примера с CDATA и ответа на вопрос берем XML найденый там же:
<?xml version='1.0' encoding='utf-8' ?>
<menuitems>
<item type="battons">
<battName>Cyclone Aviation</battName>
<datatext><![CDATA[<b>This is bold text </b> And this is not! """ <>!!== <font color="#DA0000">RED</font>]]></datatext>
<simage>1.jpg</simage>
<bimage>Image1.jpg</bimage>
<parts>
<image id="ids1" mainmenuid="vfvdf" slideid="sfsd" submenuid="jkjkkjkj" video="no" smalpicture="Image1.jpg" bigpicture="Image1.jpg" order="1" />
<image id="ids2" slideid="sfsd" submenuid="fhfhf" mainmenuid="vfvdf" video="no" smalpicture="Image14.jpg" bigpicture="Image15.jpg" order="2" />
<image id="ids3" slideid="sfsd" submenuid="fhgfhgy" mainmenuid="vfvdf" video="no" smalpicture="Image15.jpg" bigpicture="Image15.jpg" order="3" />
</parts>
</item>
<item type="battons">
<battName>Cyclone Aviation</battName>
<datatext><![CDATA[The explosions took place minutes apart at an open-air auditorium and a popular outdoor restaurant.]]></datatext>
<simage>2.jpg</simage>
<bimage>Image2.jpg</bimage>
<parts>
<image id="ids1" mainmenuid="vfvdf" slideid="sfsd" submenuid="jkjkkjkj" video="no" smalpicture="Image1.jpg" bigpicture="Image1.jpg" order="1" />
<image id="ids2" slideid="sfsd" submenuid="fhfhf" mainmenuid="vfvdf" video="no" smalpicture="Image14.jpg" bigpicture="Image15.jpg" order="2" />
<image id="ids3" slideid="sfsd" submenuid="fhgfhgy" mainmenuid="vfvdf" video="no" smalpicture="Image15.jpg" bigpicture="Image15.jpg" order="3" />
</parts>
</item>
</menuitems>
Итак. Открывает файл cdata_usage.fla приложеный в архив и смотрим.
Как доступится к тексту в CDATA? После загрузки XML именно так:
trace(xml_obj[0].datatext); //<b>This is bold text </b> And this is not! &quot;&quot;&quot; &lt;&gt;!!== <font color="#DA0000">RED</font>Как получить читаемый HTML? Именно так:
var cdata_str = xml_obj[0].datatext; var str = new XML(cdata_str).firstChild.nodeValue; out_txt.htmlText = str;И наконец то ответ на вопрос о картинках:
// для того что бы доступится к ID картинок trace(xml_obj[0].parts.image[0].id); //ids1 trace(xml_obj[0].parts.image[1].id); //ids2 trace(xml_obj[0].parts.image[2].id); //ids3
Filename Size Description ------------------------- -------- ----------- cdata_xml.xml 2 KB XML файл с примером CDATA ink_rss.xml 29 KB XML файл RSS моего ЖЖ get_livejournal.php 1 KB Скрипт чтения RSS из моего ЖЖ LJitem.as 2 KB Класс айтема для отображения заголовка и даты MyLJApp.as 3 KB Класс приложение, в этом месте все и собирается XMI.as 3 KB Класс XMI, собственно вокруг него и весь разговор SimpleButton.as 1 KB Мелочи жизни...простейшая кнопка SimpleScroller.as 2 KB Скролус Симпулус или скроллер обыкновенный, тоже из отряда простейших :) my_lj_app.fla 78 KB Исходник приложения my_lj_app.swf 57 KB Компилированая версия simple_usage.fla 42 KB Примера самого простого использования класса XMI simple_usage.swf 2 KB swfobject.js 7 KB JavaScript файл SWFObject v1.5 (настоятельно рекомендую ознакомится) flash_resize.js 2 KB JavaScript файл для изменения высоты слоя в который выводится контент.