JS访问SWF的函数用法实例

   本文实例讲述了JS访问SWF的函数用法。分享给大家供大家参考。具体分析如下:

  关于Flash和JS相互调用的例子已经说很多了,这不是难题,当然,调用错误这也不是Flash和JS的错误,我们今天就来彻底解决IE,FF和Chrome之间的不兼容问题!

  我们知道,Flash中,如果访问外部JS函数,只需

   代码如下:

  flash.external.ExternalInterface.call("JS中的函数名");

  这一句即可

  如果要JS访问Flash中的函数,需要用addCallBack注册一个回调函数,让JS去调用(AS2例子)

  ?

1
2
3
4
5
6
7
8

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中试用一下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

<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:

  测试一下:

  IE6,7,8,9一切正常

  FF:失败

  Chrome:失败

  失败原因:SetImgPath不是函数,(is not a function /not defined)

  这就很奇怪了,我们可以用一个alert,来输出

  代码如下:

  thisMovie("123"):alert(thisMovie("123"));

  输出结果并不是Null,说明已经找到了我们的Flash,但是为啥FF和Chrome就总是找不到函数呢?

  逛了各大论坛,比较一致的说法是addCallback必须要是flash加载完毕才能注册成功,好吧,我们加一个settimeout函数,判断是否加载成功,我们改一下上面的flashcall:

  ?

1
2
3
4
5
6
7

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标签,害我调试了一个下午,才明白原来问题出在这里。

  知道原因了,就好处理了,改标签:

  ?

1
2
3
4
5
6
7

<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程序设计有所帮助。

时间: 2024-08-23 16:14:43

JS访问SWF的函数用法实例的相关文章

JS访问SWF的函数用法实例_javascript技巧

本文实例讲述了JS访问SWF的函数用法.分享给大家供大家参考.具体分析如下: 关于Flash和JS相互调用的例子已经说很多了,这不是难题,当然,调用错误这也不是Flash和JS的错误,我们今天就来彻底解决IE,FF和Chrome之间的不兼容问题! 我们知道,Flash中,如果访问外部JS函数,只需  复制代码 代码如下: flash.external.ExternalInterface.call("JS中的函数名");这一句即可 如果要JS访问Flash中的函数,需要用addCallB

js常用系统函数用法实例分析

 这篇文章主要介绍了js常用系统函数用法,实例分析了escape.parseInt.parseFloat.isNaN.isFinite等函数的用法,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了js常用系统函数用法.分享给大家供大家参考. 具体代码如下: 代码如下: <html> <head> </head> <body> <script type="text/javascript"> //1. escap

JavaScript中匿名函数用法实例

 这篇文章主要介绍了JavaScript中匿名函数用法,实例分析了javascript中匿名函数的功能.定义及具体用法,需要的朋友可以参考下     本文实例讲述了JavaScript中匿名函数用法.分享给大家供大家参考.具体分析如下: JS中可以不用给函数名称,而是在使用时直接通过function把函数体赋值给相关的事件或者变量. 下面的JS代码给按钮设定了一个onclick事件,使用了匿名函数 ? 1 2 3 4 5 6 7 8 9 <form action="#">

js indexOf split join函数用法

js indexof  split join函数用法 文章为你免费提供js indexof  split join函数用法,重点介绍了indexof与split函数的详细用法与举例说明哦. join var delimitedstring=myarray.join(delimiter); var mylist=new array("jpg","bmp","gif","ico","png"); var por

JS作为值的函数用法示例_javascript技巧

本文实例讲述了JS作为值的函数用法.分享给大家供大家参考,具体如下: function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument); } 这个函数接受两个参数,第一个函数应该是一个函数,第二个参数应该是要传递给该函数的一个值.该函数是通用的. 如: function add10(num){ return num+10; } var result = callSomeFunction(

php内嵌函数用法实例

 这篇文章主要介绍了php内嵌函数用法,实例分析了php内嵌函数的调用方法与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php内嵌函数用法.分享给大家供大家参考.具体分析如下: php中可以在函数内部内嵌一个函数,调用范围仅限于函数本身 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php function msg() { echo("<center><

php定义参数数量可变的函数用法实例

 这篇文章主要介绍了php定义参数数量可变的函数用法,实例分析了func_get_args的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php定义参数数量可变的函数用法.分享给大家供大家参考.具体分析如下: php中的的函数参数可以不固定,甚至不用定义参数,在函数内部使用func_get_args()函数获得参数列表,调用时可以为函数指定任意参数,非常方便 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php function addanyt

Symfony2函数用法实例分析_php实例

本文实例讲述了Symfony2函数用法.分享给大家供大家参考,具体如下: 1.调用其他对象的方法. 例: $grobal_func=$this->container->get('global_func'); //'global_func'函数所在的文件名 $lot_data=$global_func->getDataFromFile($parm1); //getDataFromFile函数名 2.数据库的预备查询 $conn = $this->em->getConnectio

php计算给定时间之前的函数用法实例_php技巧

本文实例讲述了php计算给定时间之前的函数用法.分享给大家供大家参考.具体如下: 这里给定一个时间,计算这个时间在多久前,比如:2天前,1年前 <?php function prettyDate($date){ $time = strtotime($date); $now = time(); $ago = $now - $time; if($ago < 60){ $when = round($ago); $s = ($when == 1)?"second":"se