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 相关文章推荐
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
js封装可使用的构造函数继承用法分析
Jan 28 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
JavaScript实现url参数转成json形式
Sep 25 Javascript
JavaScript prototype属性详解
Oct 25 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
Dec 18 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
Mar 29 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
Vue OpenLayer测距功能的实现
Apr 20 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
javascript模拟评分控件实现方法
2015/05/13 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
python调用cmd命令行制作刷博器
2014/01/13 Python
Python下Fabric的简单部署方法
2015/07/14 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python中最大递归深度值的探讨
2019/03/05 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Python实现弹球小游戏
2020/08/01 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
优秀毕业生自荐信范文
2014/01/01 职场文书
销售会计岗位职责
2014/03/15 职场文书
学生会部长竞聘书
2014/03/31 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015年财政局工作总结
2015/05/21 职场文书
电影雨中的树观后感
2015/06/15 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
MySQL中in和exists区别详解
2021/06/03 MySQL
python单元测试之pytest的使用
2021/06/07 Python