本文实例讲述了JS访问SWF的函数用法。分享给大家供大家参考。具体分析如下:
关于Flash和JS相互调用的例子已经说很多了,这不是难题,当然,调用错误这也不是Flash和JS的错误,我们今天就来彻底解决IE,FF和Chrome之间的不兼容问题!
我们知道,Flash中,如果访问外部JS函数,只需
如果要JS访问Flash中的函数,需要用addCallBack注册一个回调函数,让JS去调用(AS2例子)
import flash.external.*; var methodName:String = \"SetImgPath\"; //JS需要调用的函数名字 var instance:Object = null; var method:Function = extractstr; //Flash中实际的函数名字,参数忽略,但是你调用的时候要记得有参数的要加上 var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method); trace(wasSuccessful+\"-callback\")
我们可以trace一下,这个时候如果是true,表示注册成功
OK,下面web中试用一下:
<div style=\"margin-left:50px; margin-bottom:50px\"><input type=\"text\" id=\"mytxt\" border=\"1\" value=\"这是测试框,调用页面JS演示\" style=\"width:200px\"/></div>
<div id=\"flashContent\">
<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"515\" height=\"320\" id=\"123\" align=\"middle\">
<param name=\"movie\" value=\"123.swf\" />
<param name=\"quality\" value=\"high\" />
<param name=\"bgcolor\" value=\"#000000\" />
<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\" />
<!--[if !IE]>-->
<object type=\"application/x-shockwave-flash\" data=\"123.swf\" width=\"515\" height=\"320\"><!--下面针对非IE内核浏览器-->
<param name=\"movie\" value=\"123.swf\" />
<param name=\"quality\" value=\"high\" />
<param name=\"bgcolor\" value=\"#000000\" />
<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\" />
<!--<![endif]-->
<a href=\"upload/2011/1/201101281000491420.gif\" alt=\"获得 Adobe Flash Player\" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
OK,我们在Web中加一个button来调用这个flashcall:<input type=\"button\" onclick=\"flashcall(\'./image/1.jpg\')\" value=\"JS调用SWF\">
测试一下:
IE6,7,8,9一切正常
FF:失败
Chrome:失败
失败原因:SetImgPath不是函数,(is not a function /not defined)
这就很奇怪了,我们可以用一个alert,来输出
输出结果并不是Null,说明已经找到了我们的Flash,但是为啥FF和Chrome就总是找不到函数呢?
逛了各大论坛,比较一致的说法是addCallback必须要是flash加载完毕才能注册成功,好吧,我们加一个settimeout函数,判断是否加载成功,我们改一下上面的flashcall:
function flashcall(str){
try{
thisMovie(\"123\").SetImgPath(str);//注意,123是上面的ID,而SetImgPath是我们Flash中的注册的回调函数
}cache(e){
settimeout(\"flashcall(str)\",100 );
}
}
恩,我们用个settimeout,每隔100毫秒去调用一次,如果异常就持续调用,直到成功为止!
遗憾的是,始终不成功,程序进入死循环!
通过查阅各种资料,终于找到了原因:
FF中浏览器只认识embed标记,所以如果你用getElementById获 flash的时候,需要给embed做ID标记,而IE是认识object标记的 ,所以你需要在object上的ID做上你的标记
明白了吗?原来在FF和Chrome中,Flash必须用embed才能识别出他的ID,用Object标签是无法识别ID的,我用的Html是Flash自动生成的,都是Object标签,害我调试了一个下午,才明白原来问题出在这里。
知道原因了,就好处理了,改标签:
<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0\" width=\"515\" height=\"320\" id=\"123\" title=\"123\" align=\"middle\"> <param name=\"allowScriptAccess\" value=\"always\" /> <param name=\"movie\" value=\"123.swf\"> <param name=\"quality\" value=\"high\"> <param name=\"wmode\" value=\"transparent\" /> <embed src=\"123.swf\" name=\"123\" quality=\"high\" allowScriptAccess=\"always\" swLiveConnect=\"true\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" width=\"515\" height=\"320\"></embed> </object>
把嵌入Flash的标签改为上面的,一切OK!
希望本文所述对大家的javascript程序设计有所帮助。
本文地址:https://www.stayed.cn/item/16840
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我