在AIR中显示HTML

AIR应用程序中显示的HTML内容可以在内存中创建,从本地文件加载,或者从远程网站加载。为了在基于Flex的AIR应用程序显示HTML内容,将使用mx:HTML组件,这个包在原始的Adobe AIR flash.html.HTMLLoader类外面的一个友好的Flex包装器。从UIComponent继承了该Flex版本,并且允许它以分层的形式在基于Flex的显示器中呈现。在mx:HTML组件中,使实际的htmlLoader类通过htmlLoader属性变得可用。

39.3.1  加载远程内容

在AIR应用程序中查看HTML内容最简单的办法就是使用以下的MXML加载远程内容。

 

<mx:HTML

id="htmlContainer"

width="100%" height="100%"

complete="onHtmlLoadComplete(event)"

location="http://www.wrox.com"

</mx:HTML>

我们可以使用Flex的mx:HTML组件来设置远程URL(http://www.wrox.com)的location属性,用来加载和显示网页。在完成远程内容的加载后,将调用onHTMLLoadCmoplete事件,同时指示HTML内容已经完成。从此时起,自定义代码就可以访问HTML内容的DOM或JavaScript用于操作(分别参见39.4.3节和39.4节)。

1. 与安全沙箱一起工作

Adobe AIR将可执行代码分到沙箱中,这要依据HTML的内容来自哪里。在大多数情况下,本地HTML内容直接从Adobe AIR应用程序的安装目录加载,这一操作将同时更新应用程序沙箱中的内容,并且支持Adobe AIR API的完整访问以及JavaScript/ActionScript之间的双向通信。当从本地文件系统加载HTML数据时(在应用程序安装目录外面),它将被放置在本地沙箱中。最后,远程HTML内容,就像上面的示例代码那样,将放置在它自已的安全沙箱中,这些沙箱基于内容源自的域,同时将会限制访问在沙箱外为它创建的资源。

这个主要的应用程序沙箱允许充分访问Adobe AIR API,以及从JavaScript访问ActionScript代码,反之亦然。本章剩下的部分将讲述当从AIR应用程序的本地目录加载所有的HTML时,我们如何同安全沙箱一起工作。

注意:

因为HTML内容被加载到应用程序的安全沙箱中,但是这并不意味着JavaScript将获得一个一劳永逸的访问权限。当在应用程序的沙箱中运行时,关于JavaScript可以执行的代码有相当多的局限性:eval()表达式是受限的,加载远程JavaScript库是禁止的,XMLHttpRequest的响应仅限于JSON对象。没有可执行的JavaScript,没有cookies等。一个完整的清单,可以参见第7节中标题为“Developing Adobe Air Applications With Adobe Flex 3”的文档中找到,这些也能在www.adobe.com/support/documentation/en/air/#flex中找到。

2. 在不同的沙箱之间交互

加载到沙箱应用程序的内容不能直接与加载到任何其他沙箱的HTML内容通信。许多意想不到的事情可能发生(就跨站脚本攻击方面考虑,但附带上用户的AIR应用程序可以访问的本地文件,您就可以开始看到可能的错误)。

然而,因为它也会对不同沙箱中内容之间的互动进行限制,Adobe AIR提供一组方法来显式地使不同沙箱中的内容互相通信。

●       沙箱桥接时,其中显式地创建一个JavaScript界面,并且显式地声明了可以来回流动的数据。

●       跨脚本,在这里将html内容放置在嵌入的HTML内容中的AIR特定iframe标记中,然后设置几个AIR特定属性,如sandboxRoot和documentRoot。

关于细节的处理和AIR中不同安全沙箱之间的通信不在本书的范围内。务必提前阅读前面引用的Adobe文档标题为“HTML内容”的这一节。它像这里提到的那样,当在应用程序中遇到过安全性错误,或者遇到嵌入的HTML页面中错误的JavaScript代码,您就会详细阅读Adobe文件中了解具有哪些限制。

39.3.2  加载内存中的内容

您可能想要在AIR中快速生成自己的HTML。不通过访问一个远程地址,可以只通过为自己的HTML字符串提供mx:HTML.htmlLoader来达到目的:

private function loadInMemoryHTML():void

{

var html:XML =

<html>

<head>

<title>Test Title</title>

</head>

<body>

This is in-memory html

</body>

</html>;

 

htmlContainer.htmlLoader.loadString(html.toString());

}

这里,htmlContainer与前面定义的mx:Flex组件相同,除此之外,不设置location属性,通过设置已包含的htmlLoader的loadString属性在运行时加载内容。这个代码示例也使用Flex 的XML的本地XML在代码中声明XML,从而不需要使用混乱的字符串连接。

这个示例中的HTML被加载到AIR应用程序的域中,它允许任何JavaScript直接访问完整的AIR API,并且允许任何ActionScript HTML内容中的DOM和JavaScript。

39.3.3  加载本地文件的内容

最后,由于Adobe AIR可以直接访问本地文件,因此可以把HTML内容读取到mx:HTML组件中。这是在示例应用程序中为嵌入式YouTube控件创建自定义代码的方式:

private function loadCustomEmbeddedPlayerHTML():String

{

var file:File = File.applicationDirectory.resolvePath("embeddedPlayer.html");

 

var fs:FileStream = new FileStream();

fs.open( file, FileMode.READ );

 

// Read the entire contents of the HTML file

var html:String = fs.readUTFBytes( fs.bytesAvailable )

 

fs.close();

 

youTubeEmbeddedPlayer.htmlLoader.loadString(html);

}

这个函数使用AIR的File类从安装AIR应用程序的文件系统路径中解析对embeddedPlayer.html文件的引用。这个embeddedPlayer.html文件声明所有的HTML,包括把YouTube嵌入式Flash音频播放器嵌入到HTML中的代码。这段代码包含引用外部JavaScript以及远程SWF文件。

获取这个文件引用之后,将把这个文件引用赋予file变量,然后将创建并以只读方式打开FileStream,以便将HTML文件的内容读入一个变量。当完成的时候,记得关闭所有打开的文件引用。

然后,就像前面处理内存中的HTML一样,把HTML字符串加载到youTubeEmbeddedPlayer,这是AIR应用程序中用于呈现的一个mx:HTML控件,在MXML中其定义为:

<mx:HTML

id="youTubeEmbeddedPlayer" width="600" height="400"

complete="onHtmlLoadComplete(event)"

verticalScrollPolicy="off"

horizontalScrollPolicy="off"

/>

查看embeddedPlayer.html文件的内容

YouTube embeddedPlayer.html文件包含大量JavaScript代码,它使用已归档的公有YouTube Embedded Player API来控制它们的嵌入式播放器。

此外,embeddedPlayer.html页面有一个嵌入式SWF对象,其中包含用来显示视频的实际播放器。为了嵌入播放器,HTML代码采用swfobject.js代码函数库,其在下面一行HTML中声明:

<script src="swfobject.js" type="text/javascript"></script>

这从本地应用程序目录(也即父页面embeddedPlayer.html所在的相同目录)加载swfobject.js,因为加载到mx:HTML组件的HTML内容将继续使用子内容的相对路径。

YouTube的原始嵌入式示例HTML页面引用把JavaScript代码swfobject.js加载到一个script src HTML中的其中一个服务器的过程,该HTML如下所示:

<script

src="http://swfobject.googlecode.com/svn/tags/rc3/swfobject/src/swfobject.js"

type="text/javascript">

</script>

Google在自己的服务器上存储swfobject.js,这样,当使用它们的API时,就不必担心驻留它们的任何特定文件。但是,因为AIR沙箱的限制,当我们正在尝试加载用于访问这些APIS的本地HTML内容时,这并不能起作用。

 

如前所述,由于沙箱的冲突,将swfobject.js从Google服务器加载到从本地加载内容的AIR应用程序将无法工作。由于embeddedPlayer.html内容是从AIR应用程序的目录加载的,因此它被放置到常规的AIR应用程序沙箱中。当AIR应用程序从远程域http://swfobject.googlecode.com加载swfobject.js时,所有的JavaScript代码和引用将放置在swfobject.js自己的沙箱中,它只能访问自己拥有的有限个沙箱,其中不包括默认的AIR应用程序沙箱。

实现这种功能最简单的方法是只下载swfobject.js并从本地目录加载它,而这正是在该示例中完成的。然而,把不同域中的JavaScript文件加载到AIR应用程序并创建一个脚本桥也是可能的。但是,对于这个示例,可能还有更多可行的方法,当可以完全控制使用AIR应用程序发布的HTML文件时就不值得创建脚本桥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值