Flash的源码:
package { import flash.display.Sprite; import flash.external.ExternalInterface; import flash.system.Security; import flash.text.TextField; /** * Flash缓存造成的伪沙箱问题演示 * @author qhwa */ public class Main extends Sprite { public function Main():void { var tf:TextField = new TextField(); tf.text = 'flash ready'; tf.autoSize = 'left'; addChild(tf); //允许被所有其他沙箱中的js或flash调用 Security.allowDomain("*"); start(); } private function start():void { //在基于IE的多标签浏览器中,这里运行时可能出错 ExternalInterface.call("alert", "Hi, flash is ready!"); ExternalInterface.addCallback('drawCircle', drawCircle); } private function drawCircle():void { TextField(getChildAt(0)).appendText('\nDraw a circle'); graphics.beginFill(Math.random() * 0xFFFFFF, .5); graphics.drawCircle( Math.random() * stage.stageWidth, Math.random() * stage.stageHeight, 50); graphics.endFill(); } } }
似乎一旦swf是从缓存中读取的,allowScriptAccess这个配置就不起作用?为了验证是不是缓存引起的,我们每次为swf文件地址后面加上随机的数字,发现就不存在上面的问题了。可见这个问题确实是浏览器缓存造成的。
为swf文件动态加时间戳或随机数,通过防止缓存可以回避掉这个问题。不过这不是一个很好的方案,因为这会极大增加服务器的压力,并且导致页面加载速度一直都很慢。
不过好消息是,目前有个比这个更好的方案:延迟Flash的初始化功能。通过将Flash的ExternalInterface.addCallback时机延后一些,就可以解决这个问题。
出处:alibaba.com中国站
责任编辑:bluehearts
上一页 Flash在多标签浏览器中的问题 [1] 下一页 Flash在多标签浏览器中的问题 [3]
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|