我有一个简单的 html 文档,其中包含一个 flex 应用程序和一个并排的 iframe(使用 1x2 表)。
flex 应用程序中有一个按钮,单击该按钮时,通过使用 ExnternalInterface.call 方法调用 javascript 函数“doNavClick(url)”将 iframe 的“src”属性设置为 URL。
或者这就是想法。
当我在 html 中注释掉 iframe 对象声明时,对 doNavClick 的调用有效(我弹出一个警报进行测试)......但是当 iframe 声明存在时,它甚至没有收到调用。就好像 iframe 以某种方式破坏了呼叫调度机制。
有解决方法吗?
有问题的代码如下:
--- 主要.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
paddingLeft="0" paddingRight="0"
paddingTop="0" paddingBottom="0"
>
<mx:Script>
<![CDATA[
import flash.events.MouseEvent;
private function doNavClick(event:MouseEvent):void
{
if (ExternalInterface.available)
{
var url:String = "http://www.google.com"
ExternalInterface.call("doNavClick", url); // Problematic with iframes
}
else
{
mx.controls.Alert.show("External interface not available");
}
}
]]>
</mx:Script>
<mx:VBox width="100%" height="100%">
<mx:Button label="Google" click="doNavClick(event)"/>
</mx:VBox>
</mx:Application>
...以及包含 swf 应用程序的 html/JavaScript 代码:
--- index.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>My SWF Project</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("mySWFProj", "9.0.0");
</script>
<style>
html, body, div { height: 99%; }
</style>
</head>
<body>
<table border="1" width="100%" height="100%">
<tbody>
<tr>
<td style="width: 25%; height: 100%">
<div style="width: 100%; height: 100%">
<object id="mySWFProj" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%">
<param name="allowscriptaccess" value="always" />
<param name="allowfullscreen" value="true" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="mySWFProj.swf" width="100%" height="100%">
<param name="allowscriptaccess" value="always" />
<param name="allowfullscreen" value="true" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</td>
<td style="width: 75%; height: 100%">
<div style="width: 100%; height: 100%">
<!-- <iframe id="htmlFrame" width="100%" height="100%" src="http://www.amazon.com"> -->
</div>
</td>
</tr>
</tbody>
</table>
<script type="text/javascript">
function doNavClick(url)
{
alert(url);
//document.getElementById('htmlFrame').src = url;
}
</script>
</body>
</html>
此代码将简单地弹出一个带有 google url 的浏览器警报。如果取消注释 iframe 声明(id 为“htmlFrame”)并重新加载页面,则不会显示警报,事实上,JavaScript doNavClick(url) 永远不会被调用。
更新:有趣....当我检查 index.html 的 DOM(我为此使用 firebug)时,主体通常有两个子节点 - 表和脚本。当 iframe 声明存在时,脚本子项消失......这解释了为什么我的 ExternalInterface.call 永远不会去任何地方。为什么包含 iframe 会导致我的脚本对象被删除?
UPDATE2:将 doNavScript(url) 脚本移动到文档的“头部”可以解决此问题。就好像 iframe 声明阻止任何其他孩子成为身体的一部分......我并不是说这是实际发生的事情,只是这似乎是症状。