JS访问SWF的函数用法实例


Posted in Javascript onJuly 01, 2015

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

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

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

flash.external.ExternalInterface.call("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,来输出

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

输出结果并不是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程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 创建对象
Jul 17 Javascript
this和执行上下文实现代码
Jul 01 Javascript
一些常用且实用的原生JavaScript函数
Sep 08 Javascript
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
js对象转json数组的简单实现案例
Feb 28 Javascript
JS实现倒计时和文字滚动的效果实例
Oct 29 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
JS监听事件的叠加和移除功能
Nov 19 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 Javascript
vue绑定数字类型 value为数字的实例
Aug 31 Javascript
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
JS随机调用指定函数的方法
Jul 01 #Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 #Javascript
JavaScript获得指定对象大小的方法
Jul 01 #Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
Jul 01 #Javascript
JavaScript判断数组是否包含指定元素的方法
Jul 01 #Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 #Javascript
使用RequireJS优化JavaScript引用代码的方法
Jul 01 #Javascript
You might like
php中in_array函数用法探究
2014/11/25 PHP
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
AngularJS 所有版本下载地址
2016/09/14 Javascript
javascript的几种写法总结
2016/09/30 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Django异步任务线程池实现原理
2019/12/17 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
知识就是力量演讲稿
2014/09/13 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
向女朋友道歉的话
2015/01/20 职场文书
人口与计划生育责任书
2015/05/09 职场文书
遗嘱格式范本
2015/08/07 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python