我简单的ActionScript 我正在尝试使用Flash的ExternalInterface来设置回调,以便JavaScript可以在我的Flash对象上调用方法。在Safari,Firefox和IE中一切正常,但我无法让Chrome正常工作。当我在Chrome上尝试代码时,出现以下错误:
未捕获的TypeError:对象#< an HTMLObjectElement>没办法 '的setText'
以下是我正在使用的示例HTML(再次,在Safari,FF和IE中正常工作)
<html><body>
<div id="mycontent"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("http://invincible.dynalias.com:8080/HelloWorld.swf", "mycontent", "400", "420", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always'},{id:'hw',name:'hw'});
function getFlash(movieName) {
return ( navigator.appName.indexOf("Microsoft") != -1) ? window[movieName] : document.getElementById(movieName);
}
</script><p>
<input type="text" id="exampleText" /> <input type="button" value="Set Text" onclick="getFlash('hw').setText(document.getElementById('exampleText')
.value)" />
</body>
</html>
这是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;
}
}
}
答案 0 :(得分: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中
<script>
function flashInitialized()
{
alert("Initialized!"); // remove this obviously!
$('#Main')[0].activate(); // safe to call Flash now
}
</script>
您可以在本地计算机上找到它没有这个功能,但只要您将网络延迟添加到等式中,您就会后悔没有这样做。一个任意的计时器是一个坏主意,因为你仍然会在慢速连接上得到错误。此方法允许页面尽可能早地调用flash对象。
注意:使用jQuery的'on ready'模式不是问题的解决方案 - 虽然起初我把它误认为是。
$(function()
{
$('#animation')[0].SetTitle("Hello");
}
此外,swfobject的callbackFn
也不是解决方案,因为它只会告诉您何时插入标记而不是在加载SWF时。
答案 1 :(得分:3)
我遇到了ExternalInterface以及Firefox和Chrome的问题,发现Adobe Script没有足够快地编写Flash标签,所以当浏览器试图找到addCallback()函数时,它当时就不存在了。
简单地将我调用Flash的Javascript函数创建在window.setTimeout()调用中的addCallback()解决问题。延迟小于200 ms仍会导致问题发生。
我没有必要使用试图查找文档[FlashId]对象中是否存在“length”属性的解决方案。只需调用“FlashEmbed = document [FlashId]”就可以了。
答案 2 :(得分:3)
我遇到了同样的问题,在javascript和flash之间触发和接收侦听器事件。
解决方案是使用Adobe的AC_OETags.js文件作为嵌入脚本而不是JQuery flash。 (可以在客户端检测下的zip文件中找到,Adobe可能还有其他一些地方)
当Flash在浏览器中构建javascript回调时,基于竞争条件的麻烦。由于某种原因,直接嵌入不能正确处理这个问题。
<div>
<script>
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;
var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
AC_FL_RunContent(
"src", "tagflash",
"width", "200",
"height", "200",
"id", "myTagFlash",
"quality", "high",
"bgcolor", "#FFFFFF",
"name", "myTagFlash",
"allowScriptAccess","always",
"type", "application/x-shockwave-flash",
"pluginspage", "http://www.adobe.com/go/getflashplayer",
"flashvars", "templateData=theYear:2010&theTagNumber:123"
);
</script>
</div>
然后你可以这样做:(适用于IE,FF,Safari,Crome,++)
$("#tagFlash").gotoNewFrame();
答案 3 :(得分:0)
经过艰苦的努力,我终于决定使用Adobe的官方解决方案:
搜索ExternalInterfaceExample.as
。
答案 4 :(得分:0)
通过禁用Chrome内置Flash插件解决了该问题:
这不是一个解决方案,但会说明为什么会在Chrome上发生这种情况。 Chrome伴随着内置的Flash插件,当我们使用AS3的ExternalInterface时经常会出现问题,这很烦人。