CNET中国旗舰网站

ZDNet China | CNET科技资讯网 | 政府采购 | 行业网站联盟





 
标题: [求助] 如何将flash与javascript混用?
zhang_daqian
高级会员
Rank: 2



UID 280439
精华 0
积分 870
帖子 51
威望 302
ZD币 89 元
阅读权限 50
注册 2007-12-25
状态 离线
  楼主
发表于 2008-5-7 13:59  资料  个人空间  短消息  加为好友 
开发者在线

如何将flash与javascript混用?

如何将flash与javascript混用?




顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
xiao_wei1
中级会员
Rank: 1



UID 280444
精华 0
积分 367
帖子 30
威望 116
ZD币 48 元
阅读权限 30
注册 2007-12-25
状态 离线
  沙发
发表于 2008-5-7 14:03  资料  个人空间  短消息  加为好友 
flash和javascript之间的交互 —— ExternalInterface
最近做一个应用,flash和javascript之间互有调用。最后一次写点Actionscript也是在flash 7的时候了,因此按照我的想法,只要用fscommand和getUrl("javasciprt:.......")这种形式,flash和javascript之间互相调用应该不是什么大问题。

没多久就开始觉着自己落后了,Flash 8早已经新增了ExternalInterface API专门处理flash与外部应用的交互,只要浏览器装有flash player,支持的范围应是更广。

ExternalInterface class能够运行的环境
Internet Explorer for Windows (5.0 and later)
Firefox 1.0 and later
Mozilla 1.7.5 and later
Netscape 8.0 and later
Safari 1.3 and later.
使用心得
ExternalInterface class仅仅只有两个方法:


addCallback(methodName:String, instance:Object, method:Function) : Boolean
Registers an ActionScript method as callable from the container.
call(methodName:String, [parameter1:Object]) : Object
Calls a function exposed by the Flash Player container, passing 0 or more arguments.
这两个方法的使用在手册有详细说明,使用范例可以从flash的安装路径例如C:\Program Files\Macromedia\Flash 8\Samples and Tutorials\Samples\ActionScript\ExternalAPI下面找到,没太大悬念。

碰到的问题
在IE浏览器下,将flash对象放在form标签之间,ExternalInterface class就会给你报javascript错,而firefox下完全正常,这简直是让人很郁闷的事情,折腾了一天才找到问题原因,可能是IE的Bug吧,这个在livedoc上有人反映过类似的问题。见下面的url:
http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002200.html

有人提出这样的解决办法,将下面这段javascript放在html里的flash之前:

PLAIN TEXTCODE:
<script type="text/javascript">
function ExternalInterfaceManager()
{
    this.registerMovie = function(movieName) {
        if(!window.fakeMovies) window.fakeMovies = new Array();
        window.fakeMovies[window.fakeMovies.length] = movieName;
    }
    this.initialize = function() {
        if(document.all)
        {
            if(window.fakeMovies)
            {
                for(i=0;i<window.fakeMovies.length;i++)
                {
                    window[window.fakeMovies] = new Object();
                }
                window.onload = initializeExternalInterface;
            }
        }

    }
}
function initializeExternalInterface() {
    for(i=0;i<window.fakeMovies.length;i++) {
        var movieName = window.fakeMovies;
        var fakeMovie = window[movieName];
        var realMovie = document.getElementById(movieName);

        for(var method in fakeMovie) {
            alert(arguments);
            realMovie[method] = function() {flashFunction = "<invoke name=\"" + method.toString() + "\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments, 0) + "</invoke>";this.CallFunction(flashFunction);}
        }

        window[movieName] = realMovie;
    }
}
var eim = new ExternalInterfaceManager();
eim.registerMovie("ShockwaveFlash1");
eim.registerMovie("ShockwaveFlash2");
eim.initialize();
</script>

这样就可以一定程度上解决ExternalInterface在form标签之间会报错的问题,是asp.net开发者的福音。

原理
下面是浏览器载入一个包含ExternalInterface调用的flash之后,flash player可能会用到的方法

PLAIN TEXTCODE:
function __flash__arrayToXML(obj) {
    var s = "<array>";
    for (var i=0; i<obj.length; i++) {
        s += "<property id=\"" + i + "\">" + __flash__toXML(obj) + "</property>";
    }
    return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
    var s = "<arguments>";
    for (var i=index; i<obj.length; i++) {
        s += __flash__toXML(obj);
    }
    return s+"</arguments>";
}
function __flash__objectToXML(obj) {
    var s = "<object>";
    for (var prop in obj) {
        s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
    }
    return s+"</object>";
}
function __flash__escapeXML(s) {
    return s.replace(/&/g, "&").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
   var type = typeof(value);
    if (type == "string") {
        return "<string>" + __flash__escapeXML(value) + "</string>";
    } else if (type == "undefined") {
        return "<undefined/>";
    } else if (type == "number") {
        return "<number>" + value + "</number>";
}

可以认为现在的ExternalInterface Class仅仅只是可用而已,不够成熟




顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
 


操作系统 数据库 中间件 应用软件 管理软件 Web应用 AJAX Linux Web2.0 RIA 开源 SOA OSS SEO Vista SharePoint Windows Server Windows 2003 Windows 2008 IIS 动态语言 Windows IE7 Oracle Oracle11g office SQLServer Firefox Solaris Ubuntut 微软Google 资讯 博客 技术看板 英雄 图片 QQ 腾讯QQ 珊瑚虫QQ 金山上市 站点图 AJAX BI BPM CRM DNS Android SQL Server 2008 EAI Enterprise 2.0 ETL ERP Flash GPL3 Java j2me JavaEE LAMP mashups NTFS ODBC ODF OOP Outsourcing RIA RSS SOA UML Web2.0 Workflow XAML XML ZFS 备份 并发控制 并行计算 动态语言 多核计算 虚拟技术 CRM 数据仓库 虚拟化 Apollo Apache BizTalk DB2 Eclipse Excel Expression Flex3 Fedora7 Forefront FreeBSD Hibernate IE 7 IIS JavaFX JBoss Linspire live Maxthon Mobile 6.0 Mozilla MySQL office OneCare OpenOffice Solaris Oracle Oracle 11g SQL Server Opera Outlook Photoshop PostgreSQL PowerBuilder PowerShell Rational RHEL ROR Salesforce Server Core Solaris SugarCRM TFS Tomcat Ubuntut Vista VMWare VPC VSTS WCF WebLogic WPF Xandros Xen KDE GNOME 火狐浏览器 Gmail 邮箱 Exchange server AJAX BI BPM EAI ETL ERP CRM DNS Flash Java JavaEE j2me LAMP NTFS ODBC ODF OOP Outsourcing RIA RSS SOA SEO Web2.0 mash up Workflow XAML XML GPL 3协议 ZFS 备份 并行计算 多核 数据仓库 搜索 并发控制 并行计算 动态语言 虚拟化 虚拟技术 Enterprise Web2.0 软件技术资讯 操作系统 Windows Server 2008 Windows Server 2008专题 系统安全 IIS 虚拟机 Windows Linux 嵌入式操作系统 Vista专区 数据库/数据仓库 MySQL & PostgreSQL & Sybase Oracle 10g / 9i / 11g SQL SERVER DB2 中间件/SOA QQ2009下载 QQ QQ群 QQ炫铃 QQ视频 QQ好友 木马病毒 QQ2007 江民 瑞星 金山毒霸 协作办公 ODF/OOXML SharePoint office web应用 浏览器 SaaS/S+S Microsoft技术 操作系统软件数据库软件中间件软件

软件频道2008年3月精华 软件频道2008年2月精华 软件频道2008年1月精华 软件频道12月精华 软件频道11月精华 软件频道10月精华 软件频道9月精华 软件频道8月精华 软件频道7月精华 软件频道6月精华 软件频道5月精华 软件频道4月精华 软件频道3月精华 软件频道2月精华 软件频道1月精华


当前时区 GMT+8, 现在时间是 2008-9-8 14:10

  Powered by Discuz! 5.5.0 © 2001-2007 Comsenz Inc.
Processed in 8.234045 second(s), 7 queries

清除 Cookies - 联系我们 - ZDNetChina中文社区 - 无图版