我的简单ActionScript我试图使用Flash的ExternalInterface来设置回调,以便JavaScript可以调用我的Flash对象上的方法.在Safari,Firefox和IE中一切正常,但我无法让Chrome正常工作.当我在Chrome上试用代码时,出现以下错误:
未捕获的TypeError:Object#
没有方法'setText'
这是我正在使用的示例HTML(再次,在Safari,FF和IE中正常工作)
这是ActionScript ......
package { import flash.display.Sprite; import flash.text.TextField; import flash.external.ExternalInterface; import flash.system.Security; public class HelloWorld extends Sprite { private var textField:TextField = new TextField(); public function HelloWorld() { Security.allowDomain("*"); ExternalInterface.addCallback("setText", this.setText); textField.text = "Hello, world!"; addChild(textField); } public function setText(text:String):void { this.textField.text = text; } } }
Simon_Weaver.. 13
我同意Robson认为这是一种竞争条件,但它不是"编写Flash标签"而添加计时器不是一个好的解决方案 - 事实上它非常危险.
问题是SWF本身没有加载并且有机会初始化您的外部接口.对于Chrome中的小型SWF,时间可能比其他浏览器更敏感,但潜在的问题并非特定于Chrome.
你需要做的是:
在Actionscript中
从构造函数中调用此函数:
public function InitializeExternalInterface():void { if (ExternalInterface.available) { // register actionscript functions so they can be called by JS ExternalInterface.addCallback("activate", activate); Security.allowDomain("www.example.com"); // send message to parent page that SWF is loaded and interface active trace("External Interface Initialized..."); ExternalInterface.call("flashInitialized") } else { trace("ERROR: External Interface COULD NOT BE Initialized..."); } }
在您的HTML中
您可以在本地计算机上找到它没有这个的情况,但是只要您将网络延迟添加到等式中,您就会后悔没有这样做.一个任意的计时器是一个坏主意,因为你仍然会在慢速连接上得到错误.此方法允许页面尽可能早地调用flash对象.
注意:使用jQuery的'on ready'模式不是问题的解决方案 - 尽管起初我把它误认为是一个.
$(function() { $('#animation')[0].SetTitle("Hello"); }
此外,swfobject callbackFn
也不是解决方案,因为它只是告诉您何时插入标签而不是在加载SWF时.
我同意Robson认为这是一种竞争条件,但它不是"编写Flash标签"而添加计时器不是一个好的解决方案 - 事实上它非常危险.
问题是SWF本身没有加载并且有机会初始化您的外部接口.对于Chrome中的小型SWF,时间可能比其他浏览器更敏感,但潜在的问题并非特定于Chrome.
你需要做的是:
在Actionscript中
从构造函数中调用此函数:
public function InitializeExternalInterface():void { if (ExternalInterface.available) { // register actionscript functions so they can be called by JS ExternalInterface.addCallback("activate", activate); Security.allowDomain("www.example.com"); // send message to parent page that SWF is loaded and interface active trace("External Interface Initialized..."); ExternalInterface.call("flashInitialized") } else { trace("ERROR: External Interface COULD NOT BE Initialized..."); } }
在您的HTML中
您可以在本地计算机上找到它没有这个的情况,但是只要您将网络延迟添加到等式中,您就会后悔没有这样做.一个任意的计时器是一个坏主意,因为你仍然会在慢速连接上得到错误.此方法允许页面尽可能早地调用flash对象.
注意:使用jQuery的'on ready'模式不是问题的解决方案 - 尽管起初我把它误认为是一个.
$(function() { $('#animation')[0].SetTitle("Hello"); }
此外,swfobject callbackFn
也不是解决方案,因为它只是告诉您何时插入标签而不是在加载SWF时.