我知道有很多关于这个问题的文章和论坛帖子,很多都没有工作,仍然没有答案。一些教程声称他们的代码有效,但其中一些没有下载页面,其中一些有下载页面,链接不起作用。此外,也许有一种新方法可以做到这一点,我发现的代码不再受支持。
这是我的代码:HTML和Javascript
<html>
<head><title>Javascript to SWF</title>
<script language="JavaScript">
function getFlashMovie(movieName) {
var isIE = navigator.appName.indexOf("Microsoft") != -1;
return (isIE) ? window[movieName] : document[movieName];
}
function callToActionscript()
{
getFlashMovie("jscallswf").setMouseXY();
}
callToActionscript();
</script>
</head>
<body style="background:red;">
<body>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="450" id="jscallswf" align="middle" data="jscallswf.swf" style="height: 250">
<param name="allowScriptAccess" value="sameDomain">
<param name="allowFullScreen" value="false">
<param name="movie" value="jscallswf.swf">
<param name="quality" value="High"><param name="bgcolor" value="#ffffff">
<embed src="jscallswf.swf" quality="High" bgcolor="#ffffff" width="400" name="jscallswf" align="middle" allowscriptaccess="sameDomain" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" style="height: 250">
</object>
</body>
</body>
</html>
AS3代码:
import flash.external.ExternalInterface;
ExternalInterface.addCallback("setMouseXY", rotateCam);
function rotateCam()
{
td.text = "NEWTEXT";
}
这是另一种Javascript方法:
<html>
<head><title>Javascript to SWF</title>
<style type="text/css">
#jscallswf {
margin:300px;
}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"> </script>
<script type="text/javascript" src="swfobject.js"></script>
<script language="JavaScript">
// JS Code
// Embedding through SWFObject rocks in comparison with Adobe's garbage:
var flashvars = {};
var params = {};
params.menu = "false";
params.salign = "t";
params.scale = "noscale";
params.wmode = "transparent";
params.allowScriptAccess = "always";
var attributes = {};
attributes.id = "jscallswf";
swfobject.embedSWF("jscallswf.swf", "flashDiv", "274", "246", "9.0.0", "", flashvars, params, attributes);
// Functions needed for calling Flex ExternalInterface
function thisMovie(movieName)
{
if (navigator.appName.indexOf("Microsoft") != -1)
{
return window[movieName];
}
else
{
return document[movieName];
}
}
function callFlashMethod()
{
thisMovie("jscallswf").setMouseXY();
}
$(document).ready(function(){
callFlashMethod();
});
</script>
</head>
<body style="background:red;">
<body>
<div id="flashDiv" style="margin:200px;"></div>
</body>
</body>
</html>
控制台中的两个返回错误“Uncaught TypeError:无法调用方法'setMouseXY'未定义”
答案 0 :(得分:2)
请尝试以下:
<强> Main.as 强>
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.external.ExternalInterface;
import flash.text.TextField;
/**
* <p>ExternalInterface example</p>
* <p><b>author:</b> Lukasz 'Severiaan' Grela</p>
* @author Lukasz 'Severiaan' Grela
*/
public class Main extends Sprite
{
protected var m_oOutput:TextField;
//---------------------------------------
//Group: CONSTRUCTOR
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
protected function ei_invokeFunction(p_sMethod:String, ...args):void
{
//info("ei_invokeFunction(p_sMethod:String=" + p_sMethod + ", ...args=[" + args + "]):void");
switch (p_sMethod)
{
case "func1":
func1.apply(this, args);
break;
case "func2":
func2.apply(this, args);
break;
}
}
protected function func1(num1:Number, num2:Number, num3:Number):void
{
m_oOutput.text = "func1(num1=" + num1 + ", num2=" + num2 + ", num3=" + num3 + ");";
}
protected function func2(str1:String, num2:Number, str3:String):void
{
m_oOutput.text = "func2(str1=" + str1 + ", num2=" + num2 + ", str3=" + str3 + ");";
}
protected function run():void
{
// entry point
m_oOutput = new TextField();
m_oOutput.x = m_oOutput.y = 5;
m_oOutput.width = 480;
m_oOutput.height = 320;
m_oOutput.multiline = true;
m_oOutput.wordWrap = true;
m_oOutput.border = true;
addChild(m_oOutput);
//prepare the ExternalInterface hook-up
if (ExternalInterface.available)
{
try {
ExternalInterface.addCallback("invokeFunction", ei_invokeFunction);
m_oOutput.text = "ExternalInterface is available."
}
catch (err:*)
{
m_oOutput.text = "ExternalInterface is not available. \nError:" + err;
}
}
else
{
m_oOutput.text = "ExternalInterface is not available.";
}
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.addEventListener(Event.RESIZE, onStageResized, false, 0, true);
run();
}
}
}
<强>的index.htm 强>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>external_interface_test</title>
<meta name="description" content="" />
<script src="js/swfobject.js"></script>
<script>
var flashvars = {
};
var params = {
menu: "false",
scale: "noScale",
allowFullscreen: "true",
allowScriptAccess: "always",
bgcolor: "",
wmode: "direct" // can cause issues with FP settings & webcam
};
var attributes = {
id:"core"
};
swfobject.embedSWF(
"externalinterfacetest.swf",
"altContent", "490", "330", "10.0.0",
"expressInstall.swf",
flashvars, params, attributes);
</script>
<script>
var $DEBUG = true;
//daft implementation only for testing - this should be replaced (the body of that function) with more accurate/reliable version
function getFlashMovie(movieName) {
var isIE = navigator.appName.indexOf("Microsoft") != -1;
return (isIE) ? window[movieName] : document[movieName];
}
/**
* Reference to the "core" SWF
*/
function getCore()
{
try
{
var movie = getFlashMovie("core");
}
catch(e)
{
if($DEBUG)
alert("getCore" + "\n" + e);
}
return movie;
}
//The "invokeFunction" is the registered callback method within SWF in query
/**
* wrapper for calling flash function
*/
function function1(num1, num2, num3)
{
try
{
getCore().invokeFunction("func1", num1, num2, num3);
}
catch(e)
{
if($DEBUG)
alert("func1" + "\n" + e);
}
}
/**
* wrapper for calling flash function
*/
function function2(str1, num2, str3)
{
try
{
getCore().invokeFunction("func2", str1, num2, str3);
}
catch(e)
{
if($DEBUG)
alert("func2" + "\n" + e);
}
}
</script>
<style>
html, body { height:100%; overflow:hidden; }
body { margin:0; }
</style>
</head>
<body>
<div id="altContent">
<h1>external_interface_test</h1>
<p><a href="http://www.adobe.com/go/getflashplayer">Get Adobe Flash player</a></p>
</div>
<div id="eiMenu">
<a href='#' onclick='javascript:function1(1, 2, 3);return false;'>Function 1</a>|
<a href='#' onclick="javascript:function2('a', 2, 'c');return false;">Function 2</a>
</div>
</body>
</html>
这是屏幕抓图:
您可以尝试运行此操作并让我知道您的输出,我已经在FF27上进行了测试