加载内容

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

Flash Player 和 AIR 内容可加载多种类型的其他内容,其中包括:

  • SWF 文件

  • 图像

  • Sound

  • 视频

  • HTML 文件(仅限 AIR)

  • JavaScript(仅限 AIR)

使用 Loader 类加载 SWF 文件和图像

使用 Loader 类加载 SWF 文件和图像(JPG、GIF 或 PNG 文件)。除只能与本地文件系统内容交互的沙箱中的 SWF 文件之外,其他所有 SWF 文件都可以从任何网络域加载 SWF 文件和图像。只有本地沙箱中的 SWF 文件才能从本地文件系统中加载 SWF 文件和图像。但是,只能与远程内容交互的沙箱中的文件只能加载位于受信任的本地沙箱或只能与远程内容交互的沙箱中的本地 SWF 文件。只能与远程内容交互的沙箱中的 SWF 文件可加载非 SWF 文件(例如图像)的本地内容,但是无法访问所加载内容中的数据。

从不受信任的来源(如 Loader 对象的根 SWF 文件所在域以外的域)加载 SWF 文件时,您可能需要为 Loader 对象定义遮罩,以防止加载的内容(Loader 对象的子级)绘制到该遮罩之外的 Stage 部分中,如以下代码所示:

import flash.display.*; 
import flash.net.URLRequest; 
var rect:Shape = new Shape(); 
rect.graphics.beginFill(0xFFFFFF); 
rect.graphics.drawRect(0, 0, 100, 100); 
addChild(rect); 
var ldr:Loader = new Loader(); 
ldr.mask = rect; 
var url:String = "http://www.unknown.example.com/content.swf"; 
var urlReq:URLRequest = new URLRequest(url); 
ldr.load(urlReq); 
addChild(ldr);

当调用 Loader 对象的 load() 方法时,可以指定一个 context 参数,该参数是一个 LoaderContext 对象。LoaderContext 类包括三个属性,用于定义如何使用加载的内容的上下文:

  • checkPolicyFile:仅当加载图像文件(不是 SWF 文件)时才会使用此属性。如果图像文件所在的域与包含 Loader 对象的文件所在的域不同,则指定此属性。如果将此属性设置为 true,Loader 将检查 URL 策略文件的原始服务器(请参阅网站控制(策略文件))。如果服务器授予 Loader 域适当权限,则来自 Loader 域中 SWF 文件的 ActionScript 可以访问所加载图像中的数据。换言之,可以使用 Loader.content 属性获取对表示所加载图像的 Bitmap 对象的引用,或使用 BitmapData.draw() 方法访问所加载图像中的像素。

  • securityDomain:仅当加载 SWF 文件(不是图像)时才会使用此属性。如果 SWF 文件所在的域与包含 Loader 对象的文件所在的域不同,则指定此属性。对于 securityDomain 属性而言,目前仅支持以下两个值:null(默认值)和 SecurityDomain.currentDomain。如果指定 SecurityDomain.currentDomain,则要求加载的 SWF 文件应“导入”到执行加载的 SWF 文件所在的沙箱中,这意味着其运行方式就像它已从执行加载的 SWF 文件自己的服务器中加载一样。只有在位于加载的 SWF 文件的服务器上找到 URL 策略文件时才允许这样做,从而允许执行加载的 SWF 文件所在的域进行访问。如果找到所需的策略文件,则一旦加载开始,加载方和被加载方可以自由地互相访问脚本,原因是它们位于同一沙箱中。请注意,多数情况可以通过执行普通加载操作然后让加载的 SWF 文件调用 Security.allowDomain() 方法来取代沙箱导入。由于加载的 SWF 文件将位于自己的原始沙箱中,并因而能够访问自己实际服务器上的资源,因此后一种方法会更易于使用。

  • applicationDomain:仅当加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 2.0 编写的 SWF 文件)时才会使用此属性。当加载文件时,可以指定文件应放置在特定的应用程序域中,而不是默认放置在一个新的应用程序域中,这个新的应用程序域是执行加载的 SWF 文件所在应用程序域的子域。请注意,应用程序域是安全域的子单位,因此仅当要加载的 SWF 文件由于以下原因来自您自己的安全域时,才能指定目标应用程序域:该文件来自您自己的服务器,或者使用 securityDomain 属性已成功地将该文件导入到您的安全域中。如果指定应用程序域,但加载的 SWF 文件属于其他安全域,则在 applicationDomain 中指定的域将被忽略。有关详细信息,请参阅使用应用程序域

有关详细信息,请参阅指定加载上下文

Loader 对象的一个重要属性就是 contentLoaderInfo 属性,该属性是一个 LoaderInfo 对象。与大部分对象不同,LoaderInfo 对象在执行加载的 SWF 文件和被加载的内容之间共享,并且双方始终可以访问该对象。当被加载的内容为 SWF 文件时,它可以通过 DisplayObject.loaderInfo 属性访问 LoaderInfo 对象。LoaderInfo 对象包括诸如加载进度、加载方和被加载方的 URL、加载方和被加载方之间的信任关系等信息及其他信息。有关详细信息,请参阅监视加载进度

加载声音和视频

允许任何内容使用 Sound.load()NetConnection.connect()NetStream.play() 方法从网络源加载声音和视频,只能与本地文件系统内容交互的沙箱中的内容除外。

只有只能与本地文件系统内容交互的沙箱和 AIR 应用程序沙箱中的内容可以从本地文件系统中加载媒体。只有只能与本地文件系统内容交互的沙箱、AIR 应用程序沙箱或受信任的本地沙箱中的内容可以访问这些加载的文件中的数据。

对加载的媒体还存在一些其他数据访问限制。有关详细信息,请参阅作为数据访问加载的媒体

使用文本字段中的 <img> 标签加载 SWF 文件和图像

通过使用 <img> 标签,可以将 SWF 文件和位图加载到文本字段中,如以下代码所示:

<img src = 'filename.jpg' id = 'instanceName' >

通过使用 TextField 实例的 getImageReference() 方法,可以访问以这种方式加载的内容,如以下代码所示:

var loadedObject:DisplayObject = myTextField.getImageReference('instanceName');

但是请注意,以这种方式加载的 SWF 文件和图像会被放入与各自来源相应的沙箱中。

当在文本字段中使用 <img> 标签加载图像文件时,通过 URL 策略文件可以允许访问图像中的数据。通过将 checkPolicyFile 属性添加到 <img> 标签上,可以检查是否存在策略文件,如以下代码所示:

<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >

当在文本字段中使用 <img> 标签加载 SWF 时,可以允许通过调用 Security.allowDomain() 方法来访问该 SWF 文件的数据。

当在文本字段中使用 <img> 标签加载外部文件时(相对于使用嵌在 SWF 文件中的 Bitmap 类),会自动创建一个 Loader 对象作为 TextField 对象的子对象,并且会将外部文件加载到该 Loader 对象中,就如同使用了 ActionScript 中的 Loader 对象来加载文件一样。在这种情况下,getImageReference() 方法返回自动创建的 Loader。由于此 Loader 对象与调用代码位于同一安全沙箱中,因此访问此对象不需要任何安全检查。

但是,当引用 Loader 对象的 content 属性来访问加载的媒体时,需要应用安全性规则。如果内容是图像,则需要实现 URL 策略文件;如果内容是 SWF 文件,则需要让 SWF 文件中的代码调用 allowDomain() 方法。

Adobe AIR

在应用程序沙箱内,将忽略文本字段中的 <img> 标签以防止仿冒攻击。此外,不允许在应用程序沙箱中运行的代码调用 Security allowDomain() 方法。

使用 RTMP 服务器传送的内容

Flash Media Server 使用实时媒体协议 (RTMP) 提供数据、音频和视频。您可以使用 NetConnection 类的 connect() 方法将 RTMP URL 作为参数传递来加载此媒体。Flash Media Server 可以根据所请求文件的域来限制连接并防止内容被下载。有关详细信息,请参阅 www.adobe.com/go/learn_fms_docs_cn 上提供的在线 Flash Media Server 文档。

要使用 BitmapData.draw()SoundMixer.computeSpectrum() 方法从 RTMP 流提取运行时图形和声音数据,必须拥有对服务器的访问权限。使用服务器端 ActionScript Client.videoSampleAccessClient.audioSampleAccess 属性允许访问 Flash Media Server 上的特定目录。有关详细信息,请参阅 Server-Side ActionScript Language Reference