在 Flsah Player 9 有了2套运行AS脚本的虚拟机,早期版本(SWF版本为8.0或更早,AS脚本版本为1.0或2.0),这类SWF文件由AVM1来运行,
最新的SWF版本为9.0,AS脚本为3.0,这类SWF文件由效率更高的AVM2来执行。
由于两套AVM完全不同,如果新版SWF文件载入早期版本的SWF,那么早期的SWF他运行在AVM1,而且_lockroot为true,变量,事件都不能访问和监听。总之就是看得到,摸不着。所以开发的时候就要避免加载早期的SWF,来避免不可控制。

然而郁闷的是所有被载入的SWF都是9.0 AS3的版本,在全屏模式的切换下居然爆出被加载进来的是AVM1Movie(AVM1影片在AS3环境下的类型),然后在被载入SWF一切的对象访问、事件触发、gotoAndPlay 统统失效。而且在被载入的SWF自身的AS代码控制统统失效。表现为始终在循环播放。

遇到这样的问题,开发的产品不得不放弃全屏模式。等待Adobe修复这个BUG吧。

据进一步测试,这个问题出现在stage 有 resize 时会出现这个BUG。但尚未找到绕过补救的办法。
如果你是Flash、Flex开发者。在开发有全屏需求的项目时,务必确认这个BUG已经修复。

我在Flex 3 beta2 和Flash 9 en中编译出的SWF均出现这个BUG。

OS:Windows XP SP2 CHS
Flash Player Version:WIN 9,0,47,0 ActiveX
vmVersion:1.0 d597

下面的是一个BUG演示。

由一个主SWF循环加载2个子SWF,三个SWF均为AS3版本。

被加载的SWF是一个简单动画,当播放到最后一帧时由代码控制其停止并发起END事件。

主SWF监听子SWF发起的END事件,触发另一个一个加载。

主SWF的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
package {
	import flash.display.AVM1Movie;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageDisplayState;
	import flash.display.StageScaleMode;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.system.System
	import flash.system.Capabilities;
	public class LoaderDebug extends Sprite
	{
			var loader_1:Loader = new Loader();
			var loader_2:Loader = new Loader();
			var loader_1_info:TextField = new TextField();
			var loader_2_info:TextField = new TextField();
			var player_info:TextField = new TextField();
			var load_urls=new Array('swf.9.3_1.swf','swf.9.3_2.swf');
			var load_index=0;
			var last_loader:Loader=loader_1;
			var last_loader_info:TextField=loader_1_info;
 
		public function LoaderDebug()
		{
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			this.addChild(loader_1);
			this.addChild(loader_2);
			this.addChild(loader_1_info);
			this.addChild(loader_2_info);
			this.addChild(player_info);
 
			loader_1_info.width=loader_2_info.width=200;
			loader_1_info.y=loader_2_info.y=200;
			loader_2_info.x=loader_2.x=200;
			player_info.y=300;
			player_info.width=300;
			stage.addEventListener(MouseEvent.CLICK,this_CLICK);
			loader_1.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE);
			loader_2.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE);
 
 
			player_info.text='Flash Player Version:'+Capabilities.version+'\n'
			player_info.text+='vmVersion:'+System.vmVersion+'\n'
			player_info.text+='serverString:'+Capabilities.serverString
 
 
			loadClip();
 
		}
		function nextIndex(){
			load_index++;
			if(load_index>=load_urls.length)load_index=0;
 
		}
		function loader_END(event){  
 
			last_loader.unload();
			last_loader_info.text='';
			loadClip();
		}
		function loader_COMPLETE(event){
 
			var content=event.target.content;
			var content_loaderInfo:LoaderInfo=event.target;
			content.addEventListener('END',loader_END)
 
			if(content is AVM1Movie){
			var format:TextFormat= new TextFormat();
			format.color=0xFF0000;
			format.bold=true;
			last_loader_info.defaultTextFormat=format;
			}
 
 
			last_loader_info.text='content:'+content_loaderInfo.content+'\n';
			last_loader_info.text+='actionScriptVersion:'+content_loaderInfo.actionScriptVersion+'\n'
			last_loader_info.text+='swfVersion:'+content_loaderInfo.swfVersion+'\n';
 
 
		}
		function loadClip(){
 
			if(last_loader==loader_2){
				loader_1.load(new URLRequest(load_urls[load_index]));
				last_loader=loader_1;
				last_loader_info=loader_1_info;
 
			}else if(last_loader==loader_1){
 
				loader_2.load(new URLRequest(load_urls[load_index]));
				last_loader=loader_2;
				last_loader_info=loader_2_info;
			}
			nextIndex();
 
		}
		function this_CLICK(event){
 
			if(stage.displayState ==StageDisplayState.NORMAL){
				stage.displayState =StageDisplayState.FULL_SCREEN;
			}else{
				stage.displayState =StageDisplayState.NORMAL;
			}
		}
	}
}

被加载的SWF是个时间轴动画,最后一帧的代码:

1
2
3
 
stop(); 
dispatchEvent(new Event("END"));

演示地址:http://www.cbmland.com/demo/LoaderDebug/LoaderDebug.html
源文件分析:http://www.cbmland.com/demo/LoaderDebug/LoaderDebug.rar

这个BUG在独立的FlashPlayer没有发现,在XP SP2 CHS 下的 IE 6.0 和 FirFox1.009 均存在,Oprea和其他操作系统下请网友帮忙确认。

补充:

确认这个BUG可以看方块下面的文字。

content:[object AVM1Movie]
actionScriptVersion:3
swfVersion:9

如果文字变红,且content为[object AVM1Movie]时,就是BUG来了。这个时候载入的SWF都不能自己停止在最后一帧了,里面的AS脚本已经在失控状态。

很搞的是AS和SWF版本是3.0和9.0,这个和AVM1Movie是矛盾的,AS3.0怎么在AVM1Movie里运行?

您可能对以下文章会感兴趣