#actionscript-3 #apache-flex #air #flex4
#actionscript-3 #apache-flex #воздух #flex4 #air
Вопрос:
Я создаю приложение с Adobe AIR, которое содержит компонент просмотра с mx:HTML
. Этот браузер будет использоваться для загрузки внешнего контента (общедоступные URL, такие какhttp://google.com, например) и после загрузки внешнего контента я добавляю CSS и JS в HTMLLoader, чтобы предоставить другие компоненты пользовательского интерфейса для моего приложения.
Эта часть работает просто отлично. Мой JS-код выполняется WebKit; мои правила CSS используются WebKit. В компонентах пользовательского интерфейса, которые я создаю с помощью CSS и JS, я хотел бы использовать некоторые изображения. До сих пор у меня был успех с рендерингом изображений в HTMLLoader с помощью схемы URI данных, но это вынуждает меня создавать копии в кодировке base64 (добавленные к правилам CSS) изображений в assets / folder.
Я хотел бы иметь возможность загружать внешние URL-адреса с помощью HTMLLoader, а затем добавлять CSS, JS и изображения для создания компонентов пользовательского интерфейса в том же HTMLLoader. Мне известно о свойстве HTMLLoader, placeLoadStringContentInApplicationSandbox, но если это то, что я бы использовал для загрузки локальных изображений из моих ресурсов / в HTMLLoader, как бы выглядело HTML-содержимое тега IMG, т. Е. Как ссылаться на изображение?
Есть другие идеи о том, как загружать локальные изображения в содержимое объекта HTMLLoader?
Обновить
Я попробовал идею первого комментатора, используя src=»app:/path/to/image.png», но безуспешно.
Вот что я сделал:
<mx:HTML id="browser"/>
<fx:Script>
<![CDATA[
browser.addEventListener(Event.COMPLETE,browserEventCompleteHandler);
browser.htmlLoader.placeLoadStringContentInApplicationSandbox = true; // have set to true and false with no difference.
....initiate browser load....
private function browserEventCompleteHandler(event:Event):void
{
var img:* = browser.domWindow.document.createElement('IMG');
img.src = "app:/assets/arrow_refresh.png";
img.width="300";
img.height="300";
browser.domWindow.document.getElementsByTagName('body')[0].appendChild(img);
}
]]>
</fx:Script>
Запустив приведенный выше код, я вижу, что элемент IMG добавлен к внешнему содержимому шириной и высотой 300 пикселей, но само изображение в формате PNG не отображается. Просто посмотрите на пустой квадрат размером 300 пикселей для элемента IMG.
ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ
Ответ решил мою проблему, но с одним изменением. Я использовал классы File и FileStream вместо URLRequest для загрузки png. Вот что я сделал:
var f:File = File.applicationDirectory.resolvePath("app:/assets/arrow_refresh.png");
var s:FileStream = new FileStream();
s.open(f, flash.filesystem.FileMode.READ);
var data:ByteArray = new ByteArray();
s.readBytes(data,0,s.bytesAvailable);
var b64Encoder : Base64Encoder = new Base64Encoder;
b64Encoder.encodeBytes(data);
Комментарии:
1. Вы пробовали
src="app:/assets/image.png"
?2. Хм, все еще не повезло. Смотрите ОБНОВЛЕНИЕ выше с кодом, который я использовал для тестирования. Я дважды пытался установить для каждого placeLoadStringContentInApplicationSandbox значение true и по одному разу значение false. Я должен также отметить, что это всего лишь небольшой фрагмент кода, перед вызовом windowDocument.createElement (‘IMG’) выше, у меня есть локальные файлы JS и CSS, вставленные в browser.DOMWindow и затем успешно выполненные.
3. Позже я обнаружил, что ответ Шона сработал бы нормально… У меня есть другие URL-адреса, запрещающие код, которые не соответствуют /^ [a-z]: ///i, и поскольку app:/ не является app: //, мое приложение не загружало его. Итак, спасибо за правильное предложение, Шон.
Ответ №1:
Почему img не кодируется в base 64 во время выполнения?
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.html.HTMLLoader;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
// Base64Encoder from as3corelib (https://github.com/mikechambers/as3corelib)
import mx.utils.Base64Encoder;
public class TestHtml extends Sprite
{
private var _htmlLoader : HTMLLoader = new HTMLLoader();
private var _rawImgLoader : URLLoader = new URLLoader;
public function TestHtml()
{
super();
_htmlLoader.width = stage.stageWidth;
_htmlLoader.height = stage.stageHeight;
// Load google page
_htmlLoader.load(new URLRequest("http://www.google.fr"));
_htmlLoader.addEventListener(Event.COMPLETE, onEvent);
// Load one image
_rawImgLoader.dataFormat = URLLoaderDataFormat.BINARY;
_rawImgLoader.addEventListener(Event.COMPLETE, onEvent);
_rawImgLoader.load(new URLRequest("logo.png"));
addChild(_htmlLoader);
}
private function onEvent(e:Event) : void
{
addImg();
}
private function addImg() : void
{
// Wait for img and html
if(_htmlLoader.loaded amp;amp; _rawImgLoader.data)
{
// Encode img
var b64Encoder : Base64Encoder = new Base64Encoder;
b64Encoder.encodeBytes(_rawImgLoader.data);
var img:Object = _htmlLoader.window.document.createElement('IMG');
img.src = "data:image/png;base64," b64Encoder.flush();
img.width="300";
img.height="300";
var body :Object = _htmlLoader.window.document.getElementsByTagName('div');
body[0].appendChild(img);
}
}
}
}
Ответ №2:
placeLoadStringContentInApplicationSandbox
не работает, потому что ваш контент загружается не из строки, а с внешнего URL. А удаленному контенту запрещено использовать локальные файлы. Если вы получите загруженный html и установите для него вручную значение htmlText
property, он станет локальным контентом, но при этом могут возникнуть проблемы (например, мерцание страницы).