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 相关文章推荐
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
May 03 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
Jan 31 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
js实现显示当前状态的导航效果代码
Aug 28 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
Vue.js表单控件实践
Oct 27 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
JS使用正则实现去掉字符串左右空格的方法
Dec 27 Javascript
微信小程序实现星级评分和展示
Jul 05 Javascript
Javascript的this详解
Mar 23 Javascript
layui使用数据表格实现购物车功能
Jul 26 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 Javascript
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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
wxPython窗口中文乱码解决方法
2014/10/11 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
python os模块在系统管理中的应用
2020/06/22 Python
体育教育专业毕业生自荐信
2013/11/15 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
股份合作协议书
2014/04/12 职场文书
承诺书格式范文
2014/06/03 职场文书
北京奥运会主题口号
2014/06/13 职场文书
2014年教师节寄语
2014/08/11 职场文书
灵魂歌王观后感
2015/06/17 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python