AS3-学习笔记-flashdevelop平台-搭建-配置,Flash调用Js或者相反之Js调Flash的demo。

jackxiang 2009-7-9 15:45 | |
背景:在Flash里直接在浏览器关闭时实现上报数据(Get;/Post;),发现有些浏览器不支持,调用Js实现也有这样的一个问题,记录在:
http://jackxiang.com/post/6084/

chrome浏览器支持onbeforeunload事件吗?
Chrome Safari 在调用 document.write、document.open、document.close 方法以及 "javascipt:" 伪协议时,不会触发 onbeforeunload 事件。

http://w3help.org/zh-cn/causes/BX2047


于是我就自己也试了一把这个Js调用Flash,Flash再调用Js的一个过程,记录如下:
这一篇文章是最好的实践方法,尤其是对Js调用Flash里的函数不同浏览器的不同方法:
http://www.imququ.com/post/39.html
再就是在使用FlashDevelop时新建时默认要用ActionScript AS3 Project,默认的AS3才行。

核心:http://www.imququ.com/post/39.html
结果,除了IE之外,其他浏览器都不会工作,会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现:在非IE浏览器里,flash提供的方法是加在embed上的,我们要得到object下的embed对象,调用embed上的方法才会成功!

1)Html代码如下,index.html:



2)Flash的代码如下,Main.as:




http://www.qilei.org/200810/flashdevelop-build-up/

试着安装了一下:
Tools -> Programe Settings 设置AS3context 下的 flex sdk 的地址为 上面你保存的地址路径
特别注意:
AS3 Classpath: Library\AS3\intrinsic   (这项得注意)
Flex_SDK_Location : D:\sdks\sdks



flashdevelop trace结果在哪儿??
o(∩_∩)o  两种情况哦:
第一种在是一般情况下,是因为 flashplayer或者flex builder没有使用debug版本,这种情况下,只需下载一个debug版本,在flashdevelop中设置,Tools ->program settings->FlashViewer->Extermal Player Path设置flashdebug版本的路径。
flex builder的话,一般不存在这种问题,他在自己的安装目录里自带了debug版本。
(下载地址如下:http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_ax_debug.exe ,
安装完以后,在IE中打开flash,在右键菜单中,若看到“调试器”则安装成功。


第二种情况,我们使用了debug版本的flashplayer,并且在flashdevelop中设置了FlashViewer的路径,但是还不出trace,并且flex builder也出现了相同问题,不出trace。那么问题在哪呢?
在运行出来的flash player点击右键,选择调试器,看看选项是否在本地主机上,如果不是(选择了其他机器,这就是问题所在),那么就改到本地主机上,这样,trace就可以正常输出了。
第三个应该是桌面版本
Download the Windows Flash Player 10.2 Projector content debugger (EXE, 6.36MB)
  到底是用IE还是firefox可以在window-> preference ->General->Web Browser 里选择合适的浏览。
我安装了chrome firefox ie,但选择里面没有chrome。但要用chrome来调试swf,也需要安装 for Netscape-compatible browsers 这个插件就行了。

FlashDevelop配置下载:


参考:http://bvu.iteye.com/blog/310653

第一个是IE的插件,
Download the Windows Flash Player 10.2 ActiveX control content debugger (for IE) (EXE, 2.99MB)
第二个是firefox的插件,
Download the Windows Flash Player 10.2 Plugin content debugger (for Netscape-compatible browsers) (EXE, 2.95MB)
安装了以上2个插件后,便可以用IE和firefox调试了。
FlashPlayer Debuger:
http://www.adobe.com/support/flashplayer/downloads.html

单步调试程序:
有一个叫做fdbPlugin的插件可以在flashdevelop里实现单步调试。
http://www.flashdevelop.org/community/viewtopic.php?f=4&t=2958
DownLoad:
http://orange.zero.jp/zbn39616.pine/download/download.html


配置动画:http://flash7783.iteye.com/blog/731456

调试程序:




JS与FLASH相互调用:http://wenku.baidu.com/view/83c4203d5727a5e9856a618f.html
http://wenku.baidu.com/view/2e27e220aaea998fcc220ef8.html


更多参考:http://blog.sina.com.cn/s/blog_8a18c33d010127y1.html

实践如下之Flash调用Js或者相反之Js调Flash的demo:
以下来自:http://reedgu.blog.163.com/blog/static/16229804120115735440787/

flash使用的actionscript跟javascript是非常相通的,下面描述如何互相调用函数:
1:javascript调用flash中的函数
在flash的脚本中增加
代码:import flash.external.ExternalInterface;
假定要调用的函数是hello,as代码如下
代码:function hello(){
   return "hello";
}
ExternalInterface.addCallback("hello", this, hello);
//第一个参数为导出函数名,第三个参数为as的函数名
这样就可以在js中调用as的hello函数了
2:flash调用js的函数
ExternalInterface.call("hello2", "jacky");
//第一个参数是js的函数名,后面的是js函数的参数
3:如何互相调用

html代码如下:
代码:<object type="application/x-shockwave-flash" data="test.swf" width="525" height="390" name="test">
                        <param name="allowScriptAccess" value="sameDomain" />
                        <param name="movie" value="test.swf" />
                        <param name="quality" value="high" />
                        <param name="scale" value="noScale" />
                        <param name="wmode" value="transparent" />
                        
</object>

function callFromFlash() {
    var a=thisMovie("test").hello();
    alert(a);
}

function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}

最近开发网站时遇到一个问题,如何与FLASH里的AS脚本进行交互?

需要在Flash里读取网页JavaScript里的值,用于控制两个Flash协同显示内容。

最后终于在Flash找到了ExternalInterface类,要求环境:AS 1.0,Flash Player 8.0以上

一、在网页中通过JavaScript调用Flash里的ActionScript:
可以通过ExternalInterface的addCallback方法,在Flash里注册一个可以供网页上的JavaScript或ActiveX调用的方法,具体代码如下:
程序代码

import flash.external.*;
var methodName:String = "PlayBB";
var instance:Object = null;
var method:Function = playB;
var ws:Boolean = ExternalInterface.addCallback(methodName, instance, method);

在JavaScript中调用时,需要为Flash所在的Object标签设置一个ID,并且设置allowScriptAccess属性,示例代码如下:
程序代码
import flash.external.*;
var methodName:String = "PlayBB";
var instance:Object = null;
var method:Function = playB;
var ws:Boolean = ExternalInterface.addCallback(methodName, instance, method);

在JavaScript中调用时,需要为Flash所在的Object标签设置一个ID,并且设置allowScriptAccess属性,示例代码如下:
程序代码

<object id="topFlash" name="topFlash" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="686" height="101">
     <param name="movie" value="_top.swf" />
     <param name="quality" value="high" />
     <param name="allowScriptAccess" value="always" />
     <embed allowScriptAccess="always" src="_top.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="686" height="101"></embed>
</object>

网页中的JavaScript具体的调用示例:
程序代码

function thisMovie(movieName) {
     if (navigator.appName.indexOf("Microsoft") != -1) {
         return window[movieName]
     }
     else {
         return document[movieName]
     }
}
("topFlash").PlayBB();



二、在Flash的ActionScript中调用网页里的JavaScript:
直接使用ExternalInterface的Call方法就可以了,示例代码如下:
程序代码

import flash.external.*;
var obj:Object = ExternalInterface.Call("JavaScript方法", "参数");

参数可以是任何As中的类型,在调用时Flash会自动封装,多参数使用,分隔。

使用externalInterface.addCallback()容易犯的两个错误:
ExternalInterface类是实现Javascript与ActionScript之间通信的编程接口,其中addCallback()方法使用最广泛,该方法将ActionScript方法注册为可从容器调用。如果浏览器不支持调用或无权访问的安全沙箱,将引发错误,大家可以参考帮助解决这些常见问题。本文讲述的实际应用中使用addCallback()方法容易犯的其它两个错误。

1. 错误:对象不支持此属性或方法。这是因为ActionScript方法还没注册成功就在容器中调用。最简单的解决方法是在注册ActionScript方法后,使用call()方法调用JS函数来检验注册状态,再在该函数体中调用ActionScript方法。

在本实例中,如果使用<body onload=”selectCatalog(1)”>就会出现上述错误。如果在注册addCallback()方法后,调用isReady()函数。因为这两句ActionScript是顺序执行的,所以再在该Javascript函数中调用selectCatalog(1)函数就没有问题了。

2. 错误:在IE成功中调用addCallback(),而在Firefox中却没有反应。这是因为它们对swf对象的引用语法不一样,IE中用window[movieName],而Firefox中使用document[movieName],需要判断一下浏览器的类型再分别处理,或者用document.getElementById(“movieName”)。

在本实例中,如果使用Main.getSongList(data)就会出现上述错误,我们使用thisMovie()函数解决了这一问题。


解决FlashDevelop调试不输出trace信息:
刚一安装FD就碰到一个超严重的问题,trace不出。安装和配置时我可是按说明一步步来的,debug版的flash player也安装了。可是NND就是不输出trace信息。到群里面提问也是莫名奇妙。不过还好我天生聪明,找了两小时总算解决了。(啦啦啦……)
下面是方法:
1.打开FD(flashDevelop简称)
2.在菜单栏找 Tools->Program Settings
3.在Plugins框里面找到FlashViewer,然后在右边的External Player Path设置flash player的路径(*注意,这个路径是调版的flash player的路径,在flash cs*的安装目录中找到Players文件夹,然后在Debug文件里面就能找到debug版的flash player)
4.问题解决,可以trace啦!!!

把以下测试代码放上去看看。



package
{
  import flash.display.Sprite;
  
  /**
   * ...
   * @author Pelephone
   */
  public class Main extends Sprite
  {  
    public function Main():void
    {
      trace("HelloWorld!");
      trace("HelloWorld!");
      trace("求求你,HelloWorld!");
      trace("他妈的,快给我HelloWorld!");
      trace("再不HelloWorld我就把你卸载了!");
      trace("再不HelloWorld我就砸了你!");
      
    }    
  }
}

来源:http://www.cnblogs.com/pelephone/archive/2009/04/15/flashdevelop-debug-trace.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1829/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-3-5 17:22
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]