关于 HTMLLoader 类

Adobe AIR 1.0 和更高版本

Adobe AIR 的 HTMLLoader 类定义可在 AIR 应用程序中显示 HTML 内容的显示对象。基于 SWF 的应用程序可以向现有窗口中添加一个 HTMLLoader 控件,也可以使用 HTMLLoader.createRootWindow() 创建 HTML 窗口,该窗口会自动包含 HTMLLoader 对象。可以通过 JavaScript window.htmlLoader 属性从加载的 HTML 页内部访问 HTMLLoader 对象。

从 URL 加载 HTML 内容

以下代码将 URL 加载到 HTMLLoader 对象中(添加 HTMLLoader 作为舞台或其他显示对象容器的子容器,以便在应用程序中显示 HTML 内容):

import flash.html.HTMLLoader; 
 
var html:HTMLLoader = new HTMLLoader; 
html.width = 400; 
html.height = 600; 
var urlReq:URLRequest = new URLRequest("http://www.adobe.com/"); 
html.load(urlReq);

HTMLLoader 对象的 widthheight 属性默认情况下均设置为 0。向舞台添加 HTMLLoader 对象时需要设置这些尺寸。HTMLLoader 在加载页面时会调度多个事件。可以使用这些事件来确定何时与加载的页面进行交互是安全的。处理 AIR 中与 HTML 相关的事件中对这些事件进行了介绍。

注: 在 Flex 框架中,只有 UIComponent 类的扩展类才可以作为 Flex 容器组件的子组件进行添加。因此,无法将 HTMLLoader 作为 Flex 容器组件的子组件直接进行添加;但是可以通过以下方式添加:使用 Flex mx:HTML 控件;构建一个自定义类对 UIComponent 进行扩展,并将 HTMLLoader 作为 UIComponent 的子组件包含在其中;将 HTMLLoader 作为 UIComponent 的子组件进行添加,然后将 UIComponent 添加到 Flex 容器中。

您也可以使用 TextField 类来呈现 HTML 文本,但该类的功能受到限制。Adobe® Flash® Player 的 TextField 类支持 HTML 标记的子集,但是由于大小限制,该类的功能受到限制。(Flash Player 不支持 Adobe AIR 中包含的 HTMLLoader 类。)

从字符串加载 HTML 内容

HTMLLoader 对象的 loadString() 方法可以将 HTML 内容字符串加载到 HTMLLoader 对象中:

var html:HTMLLoader = new HTMLLoader(); 
var htmlStr:String = "<html><body>Hello <b>world</b>.</body></html>"; 
html.loadString(htmlStr);

默认情况下,通过 loadString() 方法加载的内容放置在非应用程序沙箱中,并具有以下特征:

  • 有权从网络加载内容(但不能从文件系统加载)。

  • 无法使用 XMLHttpRequest 加载数据。

  • window.location 属性设置为 "about:blank"

  • 内容无法访问 window.runtime 属性(像任何非应用程序沙箱中的内容那样)。

在 AIR 1.5 中,HTMLLoader 类包含 placeLoadStringContentInApplicationSandbox 属性。对 HTMLLoader 对象将此属性设置为 true 时,将通过 loadString() 方法加载的内容放置在应用程序沙箱中。(默认值为 false。)这样就使通过 loadString() 方法加载的内容有权访问 window.runtime 属性和所有 AIR API。如果将此属性设置为 true,请确保在调用 loadString() 方法时所使用的字符串的数据源受信任。此属性设置为 true 时,将以完全应用程序权限执行 HTML 字符串中的代码语句。请仅在确定字符串不会包含有害代码时才将此属性设置为 true

在用 AIR 1.0 或 AIR 1.1 SDK 编译的应用程序中,通过 loadString() 方法加载的内容放置在应用程序沙箱中。

在 AIR 应用程序中使用 HTML 的重要安全规则

随 AIR 应用程序一起安装的文件能够访问 AIR API。出于安全方面的考虑,来自其他源的内容不能访问 AIR API。例如,此限制将阻止远程域(例如 http://example.com)中的内容读取用户桌面目录中的内容(也可能是更严重的情况)。

由于存在可通过调用 eval() 函数(及相关 API)来利用的安全漏洞,因此,默认情况下限制使用这些方法。但是,某些 Ajax 框架会调用 eval() 函数和相关 API。

为确保结构内容在 AIR 应用程序中能够正常工作,必须考虑对来自不同源的内容制订相应的安全限制规则。来自不同源的内容分别放置在不同的安全性分类中,称为沙箱(请参阅安全沙箱)。默认情况下,随应用程序一起安装的内容安装在称为应用程序 的沙箱中,这将授予该内容访问 AIR API 的权限。应用程序沙箱通常是最安全的沙箱,设计了一些限制,可阻止不受信任代码的执行。

运行时允许将随应用程序一起安装的内容加载到应用程序沙箱之外的沙箱中。非应用程序沙箱中的内容在类似于典型 Web 浏览器的安全环境中运行。例如,非应用程序沙箱中的代码可以使用 eval() 和相关方法(但不允许该代码访问 AIR API)。运行时包含有相关方法,可以让不同沙箱中的内容安全地进行通信(例如,不将 AIR API 公开给非应用程序内容)。有关详细信息,请参阅跨脚本访问不同安全沙箱中的内容

如果出于安全方面的考虑,限制在沙箱中使用所调用的代码,则运行时将发出 JavaScript 错误:“Adobe AIR runtime security violation for JavaScript code in the application security sandbox”(应用程序安全沙箱中存在针对 JavaScript 代码的 Adobe AIR 运行时安全侵犯)。

为了避免此错误,请按照下一部分避免与安全相关的 JavaScript 错误中介绍的代码编写方法进行操作。

有关详细信息,请参阅 Adobe AIR 中的 HTML 安全性