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 相关文章推荐
关于window.pageYOffset和document.documentElement.scrollTop
Apr 05 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
js写的方法实现上传图片之后查看大图
Mar 05 Javascript
Node.js与PHP、Python的字符处理性能对比
Jul 06 Javascript
Jquery动态替换div内容及动态展示的方法
Jan 23 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
Jun 13 Javascript
详解vue axios中文文档
Sep 12 Javascript
详解基于vue-router的动态权限控制实现方案
Sep 28 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
JS继承实现方法及优缺点详解
Sep 02 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
php二维数组排序详解
2013/11/06 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
移动节点的jquery代码
2014/01/13 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
利用python批量检查网站的可用性
2016/09/09 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
什么造成了Java里面的异常
2016/04/24 面试题
介绍一下write命令
2014/08/10 面试题
初中三年学生的学习自我评价
2013/11/13 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
副董事长岗位职责
2014/04/02 职场文书
婚前协议书怎么写
2014/04/15 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
门面房租房协议书
2014/08/20 职场文书
2014年协会工作总结
2014/11/22 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
高中数学教学反思范文
2016/02/18 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python