包 | flash.system |
类 | public class LoaderContext |
继承 | LoaderContext Object |
子类 | JPEGLoaderContext |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
load()
和 loadBytes()
方法的 context
参数。
使用 Loader.load()
方法加载 SWF 文件时,需要做出两个决定:应将所加载的 SWF 文件放置到哪个安全域中,以及应放置到该安全域中的哪个应用程序域中?有关这些选择的更多详细信息,请参阅 applicationDomain
和 securityDomain
属性。
使用 Loader.loadBytes()
方法加载 SWF 文件时,与使用 Loader.load()
时一样,也要选择应用程序域,但不必指定安全域,这是因为 Loader.loadBytes()
始终将其加载的 SWF 文件放置到执行加载的 SWF 文件的安全域。
如果是加载图像(JPEG、GIF 或 PNG)而不是 SWF 文件,则无需指定安全域或应用程序域,这是因为这些概念只对 SWF 有意义。此时您只需做出一个决定:是否需要以编程方式访问所加载图像的像素?如果需要,请参阅 checkPolicyFile
属性。如果要在加载图像时应用解块,请使用 JPEGLoaderContext 类替代 LoaderContext 类。
相关 API 元素
flash.display.Loader.loadBytes()
flash.system.ApplicationDomain
flash.system.JPEGLoaderContext
flash.system.LoaderContext.applicationDomain
flash.system.LoaderContext.checkPolicyFile
flash.system.LoaderContext.securityDomain
flash.system.SecurityDomain
flash.system.ImageDecodingPolicy
属性 | 由以下参数定义 | ||
---|---|---|---|
allowCodeImport : Boolean
指定是否可以使用 Loader 对象将包含可执行代码的内容(例如 SWF 文件)导入到调用方安全沙箱。 | LoaderContext | ||
allowLoadBytesCodeExecution : Boolean
已由 allowCodeImport 替换的旧属性仍支持兼容性。 | LoaderContext | ||
applicationDomain : ApplicationDomain = null
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。 | LoaderContext | ||
checkPolicyFile : Boolean = false
指定在开始加载对象本身之前,应用程序是否应该尝试从所加载对象的服务器下载 URL 策略文件。 | LoaderContext | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
imageDecodingPolicy : String
指定是否在使用图像数据或加载图像数据时解码位图图像数据。 | LoaderContext | ||
parameters : Object
一个对象,包含要传递至内容的 LoaderInfo 对象的参数。 | LoaderContext | ||
requestedContentParent : DisplayObjectContainer
Loader 尝试向其添加所加载内容的父级。 | LoaderContext | ||
securityDomain : SecurityDomain = null
指定用于 Loader.load() 操作的安全域。 | LoaderContext |
方法 | 由以下参数定义 | ||
---|---|---|---|
LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
创建带有指定设置的新 LoaderContext 对象。 | LoaderContext | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object |
allowCodeImport | 属性 |
public var allowCodeImport:Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.1, AIR 2.0 |
指定是否可以使用 Loader
对象将包含可执行代码的内容(例如 SWF 文件)导入到调用方安全沙箱。有两个导入操作受影响:Loader.loadBytes()
方法和使用 LoaderContext.securityDomain = SecurityDomain.currentDomain
的 Loader.load()
方法。(AIR 应用程序沙箱中不支持后一种操作。)将 allowCodeImport
属性设置为 false
后,这些导入操作仅限安全操作,例如加载图像。使用 Loader.load()
方法加载的正常、非导入 SWF 文件不受此属性的值的影响。
当您要将图像内容导入到沙箱中时,此属性很有用(例如,当您要复制或处理来自不同的域的图像),但在只需要一个图像又不希望承担接收 SWF 文件的安全性风险时,此属性将很有用。由于 SWF 文件可能包含 ActionScript 代码,因此导入 SWF 文件操作比导入图像文件操作的风险大。
在位于应用程序安全沙箱的 AIR 内容中,默认值为 false
。在非应用程序内容(包含 Flash Player 中的所有内容)中,默认值为 true
。
Flash Player 10.1 和 AIR 2.0 中添加了 allowCodeImport
属性。但是,只有 Flash 运行时支持该属性时,SWF 文件和所有版本的 AIR 应用程序才能使用该属性。
相关 API 元素
allowLoadBytesCodeExecution | 属性 |
allowLoadBytesCodeExecution:Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Lite 4 |
已由 allowCodeImport
替换的旧属性仍支持兼容性。之前,唯一受 allowLoadBytesCodeExecution
影响的操作是 Loader.loadBytes()
方法,但是对于 Flash Player 10.1 和 AIR 2.0,使用 LoaderContext.securityDomain = SecurityDomain.currentDomain
的 Loader.load()
的导入加载操作也受影响。(AIR 应用程序沙箱中不支持后一种操作。)此双重效果使属性名称 allowLoadBytesCodeExecution
极其特定,因此现在 allowCodeImport
是首选属性名称。设置 allowCodeImport
或 allowLoadBytesCodeExecution
将影响这两者的值。
指定是否可以使用 Loader
对象将包含可执行代码的内容(例如 SWF 文件)导入到调用方安全沙箱。将此属性设置为 false
后,这些导入操作仅限安全操作,例如加载图像。
在位于应用程序安全沙箱的 AIR 内容中,默认值为 false
。在非应用程序内容中,默认值为 true
。
实现
public function get allowLoadBytesCodeExecution():Boolean
public function set allowLoadBytesCodeExecution(value:Boolean):void
相关 API 元素
applicationDomain | 属性 |
public var applicationDomain:ApplicationDomain = null
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
指定用于 Loader.load()
或 Loader.loadBytes()
方法的应用程序域。只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。
每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。如果是从其他域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。
在 LoaderContext.applicationDomain
中,您只可以传递您自己的安全域中的应用程序域。如果试图传递任何其他安全域中的应用程序域,则会引发 SecurityError
异常。
有四种 ApplicationDomain
属性可供您选择使用:
- 加载器的 ApplicationDomain 的子级。默认值。可以使用语法
new ApplicationDomain(ApplicationDomain.currentDomain)
明确表示这种选择。这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编写new MyClassDefinedInParent()
来使用。但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用ApplicationDomain.getDefinition()
来检索它们。这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用ApplicationDomain.getDefinition()
方法来检索子级的冲突定义,否则将不使用此定义。 - 加载器自己的 ApplicationDomain。使用
ApplicationDomain.currentDomain
时请使用此应用程序域。加载完成后,父级和子级可以直接使用对方的类。如果子级试图定义的类与父级已定义的类同名,则使用父类并忽略子类。 - 系统 ApplicationDomain 的子级。使用
new ApplicationDomain(null)
时请使用此应用程序域。这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。一方查看另一方的类的唯一方式是调用ApplicationDomain.getDefinition()
方法。 - 其他 ApplicationDomain 的子级。有时可能会有更复杂的 ApplicationDomain 层次结构。可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。例如,
new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)
将 SWF 文件加载到当前域父级的父级的新子级中。
加载完成后,为调用 ApplicationDomain.getDefinition()
,任一方(加载方或被加载方)都可能需要找到它自己的 ApplicationDomain 或另一方的 ApplicationDomain。任一方都可以通过使用 ApplicationDomain.currentDomain
来检索对它自己的应用程序域的引用。执行加载的 SWF 文件可以通过 Loader.contentLoaderInfo.applicationDomain
来检索对被加载的 SWF 文件的 ApplicationDomain 的引用。如果被加载的 SWF 文件知道自己的加载方式,则它可以找到执行加载的 SWF 文件的 ApplicationDomain 对象。例如,如果子级是以默认方式被加载的,则它可以通过使用 ApplicationDomain.currentDomain.parentDomain
找到执行加载的 SWF 文件的应用程序域。
有关详细信息,请参阅《ActionScript 3.0 开发人员指南》中“客户端系统环境”一章的“ApplicationDomain 类”部分。
相关 API 元素
checkPolicyFile | 属性 |
public var checkPolicyFile:Boolean = false
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
指定在开始加载对象本身之前,应用程序是否应该尝试从所加载对象的服务器下载 URL 策略文件。此标志适用于 Loader.load()
方法,但不适用于 Loader.loadBytes()
方法。
如果您从执行调用的 SWF 文件所在的域之外加载图像(JPEG、GIF 或 PNG),并且您预计将需要从 ActionScript 访问该图像的内容,请将此标志设置为 true
。访问图像内容的示例包括引用 Loader.content
属性以获得 Bitmap 对象,以及调用 BitmapData.draw()
方法以获得所加载图像像素的副本。如果您在加载时没有指定 checkPolicyFile
就尝试执行这些操作之一,您可能会得到一个 SecurityError
异常,这是因为尚未下载所需的策略文件。
在 LoaderContext.checkPolicyFile
设置为 true
的情况下调用 Loader.load()
方法时,应用程序直到成功下载了相关的 URL 策略文件或发现不存在此类策略文件时才开始下载 URLRequest.url
中的指定对象。Flash Player 或 AIR 首先考虑已经下载的策略文件,然后尝试下载调用 Security.loadPolicyFile()
方法过程中指定的任何待下载策略文件,然后尝试从与 URLRequest.url
对应的默认位置(即 URLRequest.url
所在服务器上的 /crossdomain.xml
)下载策略文件。在所有情况下,给定的策略文件必须位于 URLRequest.url
(根据策略文件的位置而定),且策略文件必须通过一个或多个 <allow-access-from>
标签允许进行访问。
如果将 checkPolicyFile
设置为 true
,则 Loader.load()
方法中指定的主下载将在完全处理该策略文件之后开始下载。因此,只要您需要的策略文件存在,一旦您收到来自 Loader 对象的 contentLoaderInfo
属性的任何 ProgressEvent.PROGRESS
或 Event.COMPLETE
事件,就说明该策略文件下载已完成,您就可以安全地开始执行需要该策略文件的操作。
如果您将 checkPolicyFile
设置为 true
,并且未找到相关的策略文件,则除非您尝试执行的操作引发了 SecurityError
异常,否则您将不会收到任何错误表示。但是,一旦 LoaderInfo 对象调度 ProgressEvent.PROGRESS
或 Event.COMPLETE
事件,您就可以通过检查 LoaderInfo.childAllowsParent
属性的值来测试是否找到了相关的策略文件。
如果不需要对正在加载的图像进行像素级的访问,则不应将 checkPolicyFile
属性设置为 true
。在这种情况下不必再检查是否存在策略文件,因为这样会延迟下载的开始时间,并且可能会不必要地占用网络带宽。
如果是使用 Loader.load()
方法下载 SWF 文件,也尽量不要将 checkPolicyFile
设置为 true
。这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain()
方法控制的,因此在加载 SWF 文件时 checkPolicyFile
不起任何作用。在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 或 AIR 无法判断主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行。)
如果是从可能使用服务器端 HTTP 重定向的 URL 下载对象,则使用 checkPolicyFile
时要小心。始终从 URLRequest.url
中指定的相应初始 URL 检索策略文件。如果由于 HTTP 重定向而导致最终对象来自其他 URL,则最初下载的策略文件可能不适用于该对象的最终 URL,而最终 URL 对于安全性决策非常重要。如果发现处于这种情况,可以在收到 ProgressEvent.PROGRESS
或 Event.COMPLETE
事件后检查 LoaderInfo.url
的值,它会告诉您该对象的最终 URL。接着,用一个基于该对象的最终 URL 的策略文件 URL 调用 Security.loadPolicyFile()
方法。然后轮询 LoaderInfo.childAllowsParent
的值,直到它变为 true
。
不需要为运行于应用程序沙箱中的 AIR 内容设置此属性。AIR 应用程序沙箱中的内容调用 BitmapData.draw()
方法时可以使用任何已加载的图像内容作为源。
相关 API 元素
imageDecodingPolicy | 属性 |
public var imageDecodingPolicy:String
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2.6, Flash Player 11 |
指定是否在使用图像数据或加载图像数据时解码位图图像数据。
在默认策略 ImageDecodingPolicy.ON_DEMAND
下,如果因显示或其他原因需要这些数据,则运行时将解码图像数据。此策略保持以前版本运行时所使用的解码行为。
在 ImageDecodingPolicy.ON_LOAD
策略下,运行时将在图像加载后(调度 complete
事件之前)立即对其进行解码。在加载时而不是根据需要解码图像,可以改进动画和用户界面的性能。您可以在采用快速连续的方式显示几个加载的图像时观察到这种改进。快速显示图像的一些示例包括滚动列表或覆盖流控制。在另一方面,任意使用 onLoad
策略可增加应用程序的内存使用峰值。解码的数据应一次性位于内存中,而非采用 onDemand
策略。
在两种策略下,运行时在图像解码后均采用相同的缓存和刷新行为。运行时随时可以刷新解码的数据,并在下次需要时重新解码图像。
设置图像解码策略(例如,ON_LOAD
):
var loaderContext:LoaderContext = new LoaderContext(); loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD var loader:Loader = new Loader(); loader.load(new URLRequest("http://www.adobe.com/myimage.png"), loaderContext);
相关 API 元素
parameters | 属性 |
public var parameters:Object
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.2, AIR 2.6 |
一个对象,包含要传递至内容的 LoaderInfo 对象的参数。
通常,通过分析请求 URL 来获得 contentLoaderInfo.parameters
属性的值。如果设置了 parameters
变量,则 contentLoaderInfo.parameters
从 LoaderContext 对象而不是从请求 URL 中获取其值。与 URL 类似,parameters
变量仅接受包含名称-值字符串对的对象。如果对象不包含名称-值字符串对,则会引发 IllegalOperationError
。
此 API 的目的是使加载 SWF 文件能够将其参数转发给已加载的 SWF 文件。使用 loadBytes()
方法时,此功能特别有用,这是因为 LoadBytes
不提供通过 URL 传递参数的手段。只能将参数成功转发给其他 AS3 SWF 文件;尽管 AVM1Movie 的 AS3 loaderInfo.parameters 对象将是所转发的对象,AS1 或 AS2 SWF 文件也无法以可访问的形式接收参数。
例如,请考虑以下 URL:
http://yourdomain/users/jdoe/test01/child.swf?foo=bar;
以下代码使用 LoaderContext.parameters 属性复制传递到此 URL 的参数:
import flash.system.LoaderContext; import flash.display.Loader; var l:Loader = new Loader(); var lc:LoaderContext = new LoaderContext; lc.parameters = { "foo": "bar" }; l.load(new URLRequest("child.swf"), lc);
要验证参数是否正确传递,请在运行此代码之后使用以下跟踪语句:
trace(loaderInfo.parameters.foo);
如果内容成功加载,则此跟踪会输出“bar”。
requestedContentParent | 属性 |
public var requestedContentParent:DisplayObjectContainer
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 10.2, AIR 2.6 |
Loader 尝试向其添加所加载内容的父级。
在完全加载内容后,Loader 对象通常成为该内容的父对象。如果设置了 requestedContentParent
,则它所指定的对象将成为父对象,除非发生运行时错误使得该分配无法完成。也可以在发生 complete
事件后执行此重定父对象操作,而无须使用此属性。不过,使用 LoaderContext.requestedContentParent
指定父对象可消除额外的事件。
LoaderContext.requestedContentParent
在已加载内容中的第一帧脚本执行之前、构造函数已经运行之后设置所需的父对象。如果 requestedContentParent
为 null(默认值),则 Loader 对象成为内容的父对象。
如果已加载的内容是 AVM1Movie 对象,或者如果在 requestedContentParent
对象上调用 addChild()
时引发错误,则发生下列操作:
- Loader 对象成为已加载内容的父对象。
- 运行时调度
AsyncErrorEvent
。
如果请求的父对象和加载的内容位于不同的安全沙箱中,并且如果请求的父对象无权访问加载的内容,则发生下列操作:
- Loader 成为已加载内容的父对象。
- 运行时调度
SecurityErrorEvent
。
以下代码使用 requestedContentParent
将加载的内容放入 Sprite 对象:
import flash.system.LoaderContext; import flash.display.Loader; import flash.display.Sprite; var lc:LoaderContext = new LoaderContext(); var l:Loader = new Loader(); var s:Sprite = new Sprite(); lc.requestedContentParent = s; addChild(s); l.load(new URLRequest("child.swf"), lc);
运行此代码时,舞台上将显示子 SWF 文件。这一事实确认了添加到舞台的 Sprite 对象是加载的 child.swf 文件的父级。
securityDomain | 属性 |
public var securityDomain:SecurityDomain = null
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
指定用于 Loader.load()
操作的安全域。只应在加载 SWF 文件(而不是图像)时使用此属性。
只有在被加载的 SWF 文件与执行加载的 SWF 文件可能来自不同的域(不同的服务器)时,选择安全域才有意义。从您自己的域加载 SWF 文件时,始终会将它放置到您的安全域中。但是,在从其他域加载 SWF 文件时,您有两种选择:您可以允许将被加载的 SWF 文件放置到其“自然的”安全域中,此安全域与执行加载的 SWF 文件的安全域不同;这是默认设置。另一种选择是通过将 myLoaderContext.securityDomain
设置为与 SecurityDomain.currentDomain
相同,指出您希望将被加载的 SWF 文件放置到执行加载的 SWF 文件所在的安全域中。这称作导入加载,就安全性而言,它等同于将被加载的 SWF 文件复制到您自己的服务器,然后从该服务器加载它。为使导入加载成功完成,被加载的 SWF 文件的服务器必须具有一个策略文件,并且该策略文件必须信任执行加载的 SWF 文件的域。
您只能在 LoaderContext.securityDomain
中传递您自己的安全域。如果试图传递任何其他安全域,则会引发 SecurityError
异常。
AIR 应用程序安全沙箱中的内容无法将其他沙箱中的内容加载到其 SecurityDomain 中。
有关详细信息,请参阅《ActionScript 3.0 开发人员指南》中的“安全性”一章。
相关 API 元素
LoaderContext | () | 构造函数 |
public function LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
创建带有指定设置的新 LoaderContext 对象。有关这些设置的完整详细信息,请参阅对该类属性的说明。
参数checkPolicyFile:Boolean (default = false ) — 指定在加载对象之前是否应检查有无 URL 策略文件。
| |
applicationDomain:ApplicationDomain (default = null ) — 指定要用于 Loader 对象的 ApplicationDomain 对象。
| |
securityDomain:SecurityDomain (default = null ) — 指定要用于 Loader 对象的 SecurityDomain 对象。
注意:AIR 应用程序安全沙箱中的内容无法将其他沙箱中的内容加载到其 SecurityDomain 中。 |
相关 API 元素
Tue Jun 12 2018, 11:04 AM Z