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 相关文章推荐
jQuery 源码分析笔记(7) Queue
Jun 19 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
May 16 Javascript
Javascript中3种实现继承的方法和代码实例
Aug 12 Javascript
jquery获取radio值(单选组radio)
Oct 16 Javascript
jquery实现浮动的侧栏实例
Jun 25 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
Apr 28 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
BootStrap便签页的简单应用
Jan 06 Javascript
微信小程序 合法域名校验出错详解及解决办法
Mar 09 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
Nov 24 Javascript
React降级配置及Ant Design配置详解
Dec 27 Javascript
详解关于html,css,js三者的加载顺序问题
Apr 10 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
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
php实现上传图片文件代码
2015/07/19 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
jQuery实现长文字部分显示代码
2013/05/13 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
wxpython布局的实现方法
2019/11/01 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
django queryset相加和筛选教程
2020/05/18 Python
Python 实现进度条的六种方式
2021/01/06 Python
小学网上祭英烈活动总结
2014/07/05 职场文书
调解书格式范本
2015/05/20 职场文书
学校食堂管理制度
2015/08/04 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
JavaScript实现登录窗体
2021/06/22 Javascript
如何优化vue打包文件过大
2022/04/13 Vue.js