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时机延后一些,就可以解决这个问题。
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |