2012-03-22 117 views
0

从来就间:通信JavaScript和Flash

ExternalInterface.addCallback('sendToActionScript', setKeyboardFocus); 
ExternalInterface.call("setFocus", 'pathfinder'); 

我的主类的init()函数内。

在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>pathFinder</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <style type="text/css" media="screen"> 
    html, body { height:100%; background-color: #333333;} 
    body { margin:0; padding:0; overflow:hidden; } 
    #flashContent { width:100%; height:100%; } 
    </style> 
<script type="text/javascript"> 



function getFlashMovie(movieName) { 
var isIE = navigator.appName.indexOf("Microsoft") != -1; 
return (isIE) ? window[movieName] : document[movieName]; 
} 



function callToActionscript(str) 
{ 

var fm = getFlashMovie("pathfinder"); 

fm.sendToActionScript(str); 
} 

function setFocus(id){ 

var f = document.getElementById(id); 
f.focus(); 
callToActionscript('test') 

} 


</script> 
</head> 
<body> 



    <div id="flashContent" align='center'> 
<table width="100%" height="100%" border="0" align="center" cellpadding="0" 
cellspacing="0"> 
<tr> 
    <td align="center" valign="middle" bgcolor="#333333"><table width="1050" border="0"  
cellpadding="0" cellspacing="0"> 

    <tr> 
     <td> 
    <div align="center"> 
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#versio 
n=6,0,0,0" 
WIDTH="1050" 
HEIGHT="600" 
id="pathfinder" 
ALIGN="middle"> 
<PARAM NAME=movie VALUE="pathFinder.swf"> 
<PARAM NAME=quality VALUE=high> 
<PARAM NAME=bgcolor VALUE=#333333> 
<EMBED src="pathFinder.swf" quality=high bgcolor=#333333 WIDTH="1050" HEIGHT="600" 
NAME="pathfinder" ALIGN="middle" TYPE="application/x-shockwave-flash" 
PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowScriptAccess="always"> 
</EMBED> </OBJECT></div></td></tr></td></tr></table> 

    </div> 
</body></html> 

在主舞台我有一个动态文本字段实例“test_txt”来检查函数被调用。

所以ExternalInterface的代码之后,我有:

private function setKeyboardFocus(str:String):void { 
stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown); 
stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp) 
test_txt.text = str 
} 

问题是闪光灯doesn't获得键盘焦点(永远不会添加的KeyboardEvent的情况下listeneres),该函数setKeyboardFocus永远不会被调用。

任何帮助?

+0

JavaScript函数的setFocus被称为 – 2012-03-22 18:37:08

+0

是否包含在FLA这一行/为文件? import flash.external.ExternalInterface; – diegoe 2012-03-22 18:41:27

+0

import flash.external.ExternalInterface;是的 – 2012-03-22 18:46:03

回答

1

根据我发现的一个消息来源,你需要在两个地方添加allowScriptAccess="always"

  1. 你在哪里,在<EMBED ... allowScriptAccess="always"> </EMBED>区块。
  2. 还需要<PARAM NAME="allowScriptAccess" VALUE="always" >与其他PARAM块
+0

我已经改变了DOCTYPE的过渡性,并添加了,不起作用 – 2012-03-22 19:19:23

+0

@MarceloNoronha如果你每次改变一个以上的东西,我不知道这是否奏效或不。 – 2012-03-22 19:21:17

+0

好的。我的代码就像我发布的代码,但是使用 2012-03-22 19:24:49

1

验证FM被分配给对象或嵌入部件。您应该可以使用Chrome或Firefox中的JavaScript调试工具来验证此功能。我认为这是你出错的地方。这是我见过的一个完全不标准的html包装器,但大多数情况下它看起来有顺序。有一件事情是错误的,即Object标签和信息将被应用于IE,Embed标签信息将应用于使用Netscape插件的浏览器(Firefox ......以及除IE之外的所有东西)。此外,我没有在Embed元素上看到一个id,我认为您还需要为这个ID提供一个ID,就像您对Object所做的一样,我不确定如果您使用相同的确切ID,是否会收到javascript错误,我可能会称之为pathFinderE或然后类似的东西修改此方法:

function getFlashMovie(movieName) { 
var isIE = navigator.appName.indexOf("Microsoft") != -1; 
return (isIE) ? window[movieName] : document[movieName + "E"]; 
} 
+0

我也试着去捕捉安全错误。 也许这可以帮助: http://help.adobe.com/pt_BR/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html#includeExamplesSummary It's在葡萄牙,但它可能有英文版。 – 2012-03-23 14:18:44