我正在尝试使用ExternalInterface从我的javascript执行AS3功能。似乎在IE中工作正常,但firefox总是返回javascript错误方法undefined。
我多年来一直在Google上搜索,并消除了以下可能性:
1)有些人说你需要在你的对象标签里面加一个embed标签,所以加了一个 - 没有运气。
2)很多人说你需要在调用javascript之前确保你的flash已加载。好吧,我的电话是在按下页面上的链接后。我总是先使用闪存应用程序,最后只按下链接。
3)然后我认为这可能是一个安全问题,所以添加了以下内容:
try {
ExternalInterface.addCallback("test", testing);
trace("added callback");
}
catch (error:SecurityError) {
trace("Security Error:"+error.message);
}
catch (error:Error) {
trace("Error:"+error.message);
}
但是它打印出了#34;添加了回调" :(
其他人有任何想法我还能尝试什么吗?我正在运行最新的Firefox和FlashPlayer 10。
此致
奥利
答案 0 :(得分:3)
想出来。你需要为IE使用object标签,为FF使用embed标签。还没有测试过其他浏览器,但希望embed标签也能用于它们。
帮助其他人解决同样的问题。这是一个适合我的HTML页面:)
此致
奥利
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
html, body { height:100%; background-color: #ffffff;}
body { margin:0; padding:0; overflow:hidden; }
#flashContent { width:100%; height:100%; }
</style>
</head>
<script>
function testIt(){
var flashContainer;
if(navigator.appName.indexOf("Microsoft") != -1){
flashContainer = document.getElementById("test");
}else{
flashContainer = document.getElementById("test-embedded");
}
flashContainer.test("js says hello");
}
</script>
<body>
<a href="#" onclick="testIt();">Press here</a>
<div id="flashContent">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="test" align="middle" width="550" height="400">
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="play" value="true" />
<param name="loop" value="true" />
<param name="wmode" value="transparent" />
<param name="scale" value="showall" />
<param name="menu" value="true" />
<param name="devicefont" value="false" />
<param name="salign" value="" />
<param name="allowScriptAccess" value="sameDomain" />
<embed src='test.swf' height='400' width='550' id='test-embedded' PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></embed>
</object>
</body>
</html>
答案 1 :(得分:2)
如果你的flash在Firefox中运行正常,我们可以放心地认为HTML包装器或尝试调用该函数的JavaScript代码有问题。发布这些内容会有很大帮助。
但是,一般来说,IE将使用<object>
标记,其他人都将使用<embed>
标记。我认为最好的想法是使用jQuery进行flash嵌入和调用,这里是我碰巧使用的简单HTML代码,适用于IE,Firefox和Chrome:
<object id="GAMENAME" classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0'>
<param name="allowScriptAccess" value="always">
<param name="movie" value="game.swf">
<embed id="GAMENAME" name="GAMENAME" src="game.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"
allowScriptAccess="always">
</embed>
</object>
我有一个实用程序函数来访问flash对象:
function getGame()
{
if (window.document[gameName])
{
return window.document[gameName];
}
if (navigator.appName.indexOf('Microsoft Internet') == -1)
{
if (document.embeds && document.embeds[gameName])
{
return document.embeds[gameName];
}
else
{
return document.getElementById(gameName);
}
}
}
是的,它需要将全局变量gameName
设置为为flash对象指定的名称。在我们的例子中,它必须是"GAMENAME"
才能与上面的HTML相对应。我提到这不是我考虑的生产代码吗?
然后调用我使用的Flash对象:
getGame().test()
这里的JavaScript可能不是完全合理的或者代表最佳实践,但它确实指出了在<object>
与<embed>
存在的情况下找到嵌入式Flash对象时遇到的问题。多个浏览器。