﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-黑咖啡-随笔分类-Flex</title><link>http://www.blogjava.net/kyleYang/category/43356.html</link><description>孩儿立志出乡关，学不成名誓不还。
风华正茂乾坤地，人生无处不青山。
光阴如同流水去，珍惜时光最宝贵。
鹏程万里靠自己，飞黄腾达青少年。
</description><language>zh-cn</language><lastBuildDate>Mon, 08 Mar 2010 13:44:53 GMT</lastBuildDate><pubDate>Mon, 08 Mar 2010 13:44:53 GMT</pubDate><ttl>60</ttl><item><title>Flex与JavaScript的交互：调用JavaScipt或者被JavaScript调用</title><link>http://www.blogjava.net/kyleYang/archive/2010/03/05/314581.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Fri, 05 Mar 2010 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/03/05/314581.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/314581.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/03/05/314581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/314581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/314581.html</trackback:ping><description><![CDATA[
		<div class="postbody">一、在JavaScript中调用Flex方法<br />在Flex中可以用ExternalInterface来调用Flex的方法，途径是<br /><font color="#ff0000">1.通过在Flex应用可调用方法列表中添加指定的公用方法。</font><font color="#ff0000">在Flex应用中通过调用addCallback()可以把一个方法添加到此列表中。addCallback将一个ActionScript的方法注册为一个JavaScript和VBScript可以调用的方法。<br /></font>addCallback()函数的定义如下：<br />addCallback(function_name:String, closure:Function):void<br />function_name参数就是在Html页面中脚本调用的方法名。closure参数是要调用的本地方法，这个参数可以是一个方法也可以是对象实例。<br /><br />举个例子：<br />&lt;mx:Script&gt;<br />    import flash.external.*;<br />    public function myFunc():Number {<br />        return 42;<br />    }<br />    public function initApp():void {<br />        ExternalInterface.addCallback("myFlexFunction",myFunc);<br />    }<br />&lt;/mx:Script&gt;<br /><br />2.<font color="#ff0000">那么在Html页面中，先获得SWF对象的引用，也就是用&lt;object .../&gt;声明的Swf的Id属性</font>，比如说是MyFlexApp。然后就可以用以下方式调用Flex中的方法。<br />&lt;SCRIPT language='JavaScript' charset='utf-8'&gt;<br />    function callApp() {<br /><font color="#ff0000">        var x = MyFlexApp.myFlexFunction();</font><br />        alert(x);<br />    }<br />&lt;/SCRIPT&gt;<br />&lt;button onclick="callApp()"&gt;Call App&lt;/button&gt;<br /><br /><br /><br />二、在Flex中调用 JavaScript<br />你可以调用Html页面中的JavaScript，通过与JavaScript的交互，可以改变Style，调用远程方法。还可以将数据传递给Html页面，处理后再返回给Flex，完成这样的功能主要有两种方法：ExternalInterface()和navigateToUrl()。<br />在Flex中调用JavaScript最简单的方法是使用ExternalInterface()，可以使用此API调用任意JavaScript，传递参数，获得返回值，如果调用失败，Flex抛出一个异常。<br />ExternalInterface封装了对浏览器支持的检查，可以用available属性来查看。<br />ExternalInterface的使用非常简单，语法如下：<br />flash.external.ExternalInterface.call(function_name: String[, arg1, ...]):Object;<br />参数function_name是要调用的JavaScript的函数名，后面的参数是JavaScript需要的参数。<br />举个例子说明如何调用JavaScript函数<br />Flex应用中，添加如下方法：<br />&lt;mx:Script&gt;<br />&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<br />&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&gt;<br />    &lt;mx:Script&gt;<br />        import flash.external.*;<br />    <br />        public function callWrapper():void {<br />            var f:String = "changeDocumentTitle";<br />            var m:String = ExternalInterface.call(f,"New Title");<br />            trace(m); <br />        }<br />    &lt;/mx:Script&gt;<br />    &lt;mx:Button label="Change Document Title" click="callWrapper()"/&gt;<br />&lt;/mx:Application&gt;<br />Html页面中有如下函数定义：<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />    function changeDocumentTitle(a) {<br />        window.document.title=a;<br />        return "successful";<br />    }<br />&lt;/SCRIPT&gt;</div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/314581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-03-05 11:38 <a href="http://www.blogjava.net/kyleYang/archive/2010/03/05/314581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex事件讲解</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/31/307919.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 31 Dec 2009 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/31/307919.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/307919.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/31/307919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/307919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/307919.html</trackback:ping><description><![CDATA[
		<p>关于flex事件的讲解</p>
		<p>一．引</p>
		<p>很多新人对Flex的事件机制都不太熟悉，在使用过程中难免会出现各种问题，这是一个非常普遍的问题，为了更快更好的帮助大家，将介绍一下Flex中事件的各种机制和用法。</p>
		<p>Flex的精髓之一就是事件和绑定机制，了解之后，能帮助大家更灵活的设计程序，也对新手上路有一定的帮助。</p>
		<p>讲解可能不太系统，也不全面，有很多没有深入。如果高手看到后有疑问，欢迎指正。当然各位也可以提出自己的看法，或者经验分享，谢谢。</p>
		<p>二．事件机制介绍</p>
		<p>1.      什么是事件机制</p>
		<p>事件可以看作是一种触发机制，当满足了一定的条件后，会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件中都有click事件，这个事件就是一个MouseEvent的实例，当点击鼠标后，系统会自动抛出一个名称为click的MouseEvent事件（这种方法我们将在后面介绍到）。如果此时在click上注册一个方法，那么触发该事件时就会执行这个方法。</p>
		<p>大致示意图<br /> <br />image001.png (14.50 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />该示意图对应的Flex主应用的mxml代码</p>
		<p>
				<br />[复制到剪贴板]<br />CODE:<br />&lt;mx:Script&gt;<br />          &lt;![CDATA[<br />                import mx.controls.Alert;        <br />                private function clickHandler(e:MouseEvent){<br />                      Alert.show(e.currentTarget.toString());<br />                }<br />          ]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:Button id="testBtn" click="clickHandler(event)" label="测试"&gt;<br />&lt;/mx:Button&gt;</p>
		<p>
				<br />在我们写代码时，编辑器的代码补全提示列表中，有很多不同的图标，如图<br /> <br />image003.png (4.90 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>那些带有闪电的就是事件，三个小块的就是样式，空心圆圈的是属性，实心圆点的是公有方法，还有一个是效果。</p>
		<p>我们能在这个列表中看到的事件，我把它称之为事件注册通道。（官方仍然称它为事件，但是它又和普通的事件含义不同。关于事件注册通道会再下面讲述到）</p>
		<p>2.      事件注册通道</p>
		<p>上面说到了，这些通道是只能在mxml的代码提示中可以看到的，他的作用就是给mxml组件提供 事件触发时所执行的方法的注册通道，而且能在代码提示中可见，这样给组件提供了很大的抽象的好处，我们可以很清楚的告诉组件的使用者，组件里包含哪些事件给你调用。<br />为什么把他区别对待？除了代码提示外，他还有一些实现上的不同。</p>
		<p>Button的click事件是继承自核心类InteractiveObject，遗憾我们看不到他的源码，但是说明了“事件注册通道”是可以继承的。</p>
		<p>我们会在自定义事件中讲述到如何声明“事件注册通道”。</p>
		<p>3.      事件触发方法</p>
		<p>注册通道中如果填入了函数，那么就代表触发该事件时，会执行这个方法。</p>
		<p>click="clickHandler(event)"</p>
		<p>我们看到这个方法有一个event对象作为参数传入，新人可能会问到，这个event对象哪里来的？我也没声明这个变量啊。他实际上是注册通道传给他的，默认变量名就是event。我们如果想在事件触发时传其他的参数，可以通过自定的事件对象来实现。</p>
		<p>这个对象就是这个组件分发的事件对象，即name为“click”的MouseEvent的一个实例。</p>
		<p>这个event对象包含了触发该事件时的各种信息，比如触发对象是哪个，触发时鼠标点在哪里等等，不同的event类会包含不同的属性，比如KeyboardEvent包含了键盘点击了哪个键。</p>
		<p>我们也可以通过自定义一个事件类，来传递我们自己想要的各种信息。（这在后面将介绍到）</p>
		<p>4.      事件分发（重点了）</p>
		<p>最终继承自EventDispatcher的对象都会含有dispatchEvent这个方法，他有一个参数，事件对象。</p>
		<p>之前说到的事件注册通道，他只是一个通道，实际上事件是由这个方法来分发出去的，通道只是一个管道而已。</p>
		<p>他的作用就是分发一个事件对象，他的分发是没有目的的，一种广播形式的，Flex的事件监听线程会接收到各种各样的事件（我们称之为捕获事件，这在后面会介绍到），那么哪种才是你要的事件，标识就通过name来区分。</p>
		<p>1）事件对象<br />在分发事件时，将会分发一个事件对象出去。不管是那个事件类，都是继承自flash.events.Event对象的，他包含一些比较重要的属性，name和bubbles。<br />Name是这个对象在被捕捉到时的凭证。<br />Bubbles是个布尔值，决定了该对象是否会向上传递。什么意思呢？画个图就明白了。<br />比如说，当button组件分发click事件对象时，设置的bubbles为false，那么他的分发是这样的</p>
		<p>示意代码<br />dispatchEvent(new MouseEvent( “click” , false ));<br /> <br />image005.png (20.82 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />事件对象无法跨越组件本身，当然，除了之前讲到的注册通道（这样就很形象了吧）</p>
		<p>因此，如果没有注册通道，在Flex主应用中，就无法捕获到这个button组件分发出的事件。</p>
		<p>如果我们将Bubbles设为true，他看起来就是这样<br />dispatchEvent(new MouseEvent( “click” , true ));<br /> <br />image007.png (25.61 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />可以看到，这个事件可以跨过组件本身，到达Flex主应用里。不止这样，在帮助手册中明确说到，如果在传递过程中间一直没有被捕获的话，这个事件会逐层上传，直到最终的stage，那时如果还没被捕获，这个事件就会被销毁掉。 </p>
		<p>这样一来，即使我们没有click的事件通道，只要我们在Flex主应用中添加事件监听器（addEventListener）那么我们就可以获得到这个分发出的click事件了。</p>
		<p>那么，注册通道不是没用了吗？不是，之前说到过，注册通道是现式的，可见的，因此如果你的组件要给其他人使用，那么就非常一目了然，而不必知道你源码中究竟分发了什么事件。但是，不要监听和注册同一个事件，这样会重复执行的。（后面将讲到）</p>
		<p>5.      事件监听</p>
		<p>在分发中，我们讲到，如果不是通过注册通道来调用触发事件，那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件，就是通过事件的name值。</p>
		<p>比如:<br />&lt;mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp<br />      creati<br />&gt; <br />&lt;mx:Script&gt;<br />                &lt;![CDATA[<br />private function init(){<br />                    testBtn.addEventListener(“click”, clickHandler);<br />}</p>
		<p>
				<br />Flex的事件中都提供了一些静态常量，让我们调用，避免我们打错了。因此这句话可以这么写</p>
		<p>testBtn.addEventListener(MouseEvent.CLICK,clickHandler);</p>
		<p>
				<br />我们看到，监听的回调方法中没有传递参数，是的，这和通道的写法有些不同，这里的回调方法（即clickHandler）只是个引用，并不是代表方法的执行，他的含义是，告诉eventLinstener，如果捕捉到click事件，那么就去找clickHandler，并执行它，event对象参数在执行时动态的传递。（如果熟悉ajax的朋友这里应该很容易懂了）</p>
		<p>他作用起来就是这样<br /> <br />image009.png (40.46 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />如果你又注册了click的事件通道，那么这两个都会生效，显然这是多余的。</p>
		<p>      6.  关于异步和执行顺序</p>
		<p>可以看到，事件的分发，和事件捕获的回调（clickHandler）并不是同步的，因为在dispatchEvent之后，该线程不会停下来，等待listener捕捉，而是继续做自己的事。</p>
		<p>当你分发了click事件后，仍然会继续执行click之后的操作，Lintenser是一个独立的线程，他至始至终都在工作，当他捕捉到你add的事件后，则会去调用回调的函数。分发任何事件都是这样。</p>
		<p>异步示意图<br /> <br />image011.png (6.01 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />上图可以看出，回调方法执行的顺序甚至还不如dispatchEvent之后的方法。如果接下来的方法依赖于事件回调，那么把接下来的方法写到回调方法中去<br /> <br />image013.png (6.54 K)</p>
		<p>2007-11-23 15:28:46</p>
		<p>
				<br />三．绑定机制</p>
		<p>      在我们了解了事件机制后，那么理解绑定就不难了。绑定其实也是事件机制的运用</p>
		<p>      1.  什么是绑定<br />绑定的原理就是事件，在被绑定的对象上增加了改变事件的监听，一旦某个被绑定对象改变后，就会分发一个“propertyChange”事件（默认的，也可以改变成自己定义的事件），在其他组件中，会有propertyChange的事件监听，当捕捉到该事件后，则会去更新组件的属性并显示。</p>
		<p>绑定的作用在于，将Flex中的变量、类、方法等与组件的值进行绑定。例如，一个变量如果被绑定后，那么引用该变量的组件的相关属性也会发生改变。我们用一个实例来表示</p>
		<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp<br />      &gt;<br />      &lt;mx:Script&gt;<br />          &lt;![CDATA[<br />                import mx.controls.Alert;            <br />                [Bindable]<br />                private var isSelected:Boolean;<br />                private function clickHandler(e:MouseEvent){<br />                //Alert.show(e.currentTarget.toString());<br />isSelected=isSelected?false:true; //这句话的意思是如果isSelected为true，改变它为false，如果它为false，改变它为true；<br />                      Alert.show(isSelected.toString());<br />                }<br />          ]]&gt;<br />      &lt;/mx:Script&gt;<br />      &lt;mx:Button id="testBtn"  click="clickHandler(event)" label="测试" /&gt;<br />      &lt;mx:CheckBox x="60" selected="{isSelected}" /&gt;<br />&lt;/mx:Application&gt;</p>
		<p>上述程序的效果就是，当点击button时，button不是直接改变checkbox的选中状态，而是改变isSelected这个变量，由于isSelected是被绑定了的，那么会关联的改变CheckBox的选中状态。</p>
		<p>这样看起来有些多此一举，完全可以直接改变checkbox的selected属性，我只是为了演示一下效果。如果说你的checkbox是动态构造的上百个，你不会去一个个的改变他吧。</p>
		<p>因此，我们多数会将一个数据源进行绑定声明，这样引用了这个数据源的控件，比如datagrid，在数据源发生了改变时，即使你不重新设置dataProvider，列表的数据也会刷新。当然，还有很多应用等待你去尝试。</p>
		<p>如果这个代码中取消了[Bindable]的声明，会怎么样？isSelected不会改变了吗？</p>
		<p>isSelected会改变，我们alert出来的结果也会显示结果改变了，但是checkbox的选择状态不会改变，因为当一个组件由创建到最终显示出来时是经过很多方法的，比如addChild，commitProperties，updateDisplayList等，updataDisplayList则是类似刷新显示效果一样的方法。</p>
		<p>仅仅改变属性，而不去更新显示效果那么组件不会因为属性的改变而发生任何变化。<br />  <br />绑定的原理也是利用的事件分发。更复杂的绑定有待你去自己发现了</p>
		<p> </p>
		<p>四.  自定义事件的分发</p>
		<p>      这部分就不长篇大论了，因为各位应该已经掌握了事件的原理，因此贴出演示源码，并进行些简单的解释。</p>
		<p>      1.  自定义事件 components/MyEventTest.as<br />      package components<br />{<br />      import mx.events.FlexEvent;<br />      public class MyEventTest extends FlexEvent<br />      {<br />          public static const ONCHANGE:String = "onChange";<br />          public var eventInfo:String; //自定义的事件信息<br />          public function  MyEventTest(s:String){<br />                super(s); //如果在构造时不设bubbles，默认是false，也就是不能传递的。<br />                eventInfo="这个事件是:"+s;<br />          }<br />      }<br />}</p>
		<p>          2.        自定义组件 components/ComponentForEvent.as<br />package components<br />{<br />      import flash.events.EventDispatcher;<br />      //这个就是声明事件注册通道的方法了。Type是该事件的类<br />      [Event(name="onChange", type="components.MyEventTest")]<br />      public class ComponentForEvent extends EventDispatcher<br />      {<br />          private var name:String;<br />          public function changeName(newName:String){<br />                this.name=newName;<br />                dispatchEvent(new MyEventTest(MyEventTest.ONCHANGE) );<br />          }<br />      }<br />}</p>
		<p>3.        App.mxml<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="absolute" xmlns:comp<br />&gt; <br />&lt;mx:Script&gt;<br />&lt;![CDATA[<br />import mx.controls.Alert;<br />private function  changeName(){<br />                    cfe.changeName("新名称");<br />}<br />                ]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:Button id="testBtn"  click=" changeName ()" label="测试" /&gt;<br />&lt;components:ComponentForEvent<br />id="cfe"  /&gt;<br />&lt;/mx:Application&gt;</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/307919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-31 15:53 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/31/307919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页系统回到桌面应用时代己来临</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/31/307914.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 31 Dec 2009 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/31/307914.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/307914.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/31/307914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/307914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/307914.html</trackback:ping><description><![CDATA[
		<p>AIR(全名Adobe Integrated Runtime，前身Apollo)的来意 </p>
		<p>这几年企业应用系统慢慢己从窗口桌面转移到网页平台上，人们开始习惯在浏览器上购买商品、转帐、缴费、甚至公司的入口网站也都是从网页进入使用，如请假、签到、人资系统甚至物流管理等。 </p>
		<p>网页开发人员也不例外，动态网页不管是用什么语言来撰写（如：ASP.NET、PHP、JSP、ColdFusion等），你会发现到，现在这些语言似乎成了基本配备，殊不知Web 2.0的应用理念排山倒海而来，也让Ajax的技术使用掘起，RIA(Rich Internet Applications)的应用也更加扩大；伴随着使用上的要求，浏览器上的功能变得越来越复杂，开发者也越来越头痛，一方面要学习许多技术，一方面又要能符合顾客所需，如何让开发者不用再重新学习，只善用本身既有技能，也能满足顾客口味，客户端也能够兼顾到网页及窗口程序的优点，如此想法，AIR油然而生。 </p>
		<p>什么是AIR? </p>
		<p>AIR(全名Adobe Integrated Runtime)，前身是Apollo，美商Adobe公司在开发此项目时所命名的一个代号名称，它是专为网络桌面系统应用的一个执行环境(RunTime)，竞争产品如同微软的WPF，AIR能真正跨平台在Windows/Mac/Linux操作系统上执行，目前为Alpha 1阶段(Linux版还没释出)，很适合应用在网络多媒体内容上，如把PDF、Flash/Flex、HTML、Ajax全部结合在一个程序上，加上善用操作系统上的环境资源，就能快速开发出RIA应用，并且原有的网页开发者不需要重新学习新的语言。 </p>
		<p>你会需要AIR吗？ </p>
		<p>我们需要区分几种类型来分析、思考，AIR是否对你有需要，以下列出３种类型族群。 </p>
		<p>使用者(End user) </p>
		<p>你常使用计算机，你己发现到，现在的系统大多都会让你在浏览器(常见是IE/FireFox)上完成，不管是查询最新上映电影、网络订车票、网络报税、在线购物，或企业的入口网站要查询库存、销售报表等，甚至采购订单，几乎在浏览器上就能一手包办，不过你也发现到几个恼人的事，例如：你使用的过程中，不小心要回上一步，浏览器的认定却是上一页，刚刚输入的动作就几乎要重来，亦或者网络刚好中断，而你的交易正执行到一半，等待网络可以重新连上后，之前所输入的内容也是要再来一遍，另外，网络上的画面真的都跟使用者一样，所见即所得吗？不一定，因为正当你要把最关键的网络信息打印下来时，却也发现，边缘的信息怎么被截断了。<br />以上，都是屡见不鲜的案例，这样的节骨眼，利用AIR所提供的环境程序，就可以协助你，当离线时还能保持功能正常运作，当打印时也能常保完整(因为PDF能够有一致的文件结构)，你也不需要有充份的时间去学如何操作系统，因为RIA的接口与互动，己足够让你省下不少摸索时间。</p>
		<p>
				<br />设计者/开发者(Designer/Developer) </p>
		<p>视觉设计者通常强在美术天份的表达，舒适性的画面总是在他们的巧手上完成，然而一般在设计网页与窗口的表现，过程中是需要很多加以调整，如：尺寸大小、档案格式等，AIR的系统环境里，你可以专注在原来网页设计的技巧，其它靠着Flash的引擎，就能发挥与网页同质的效果。<br />开发者亦是，他们最不喜欢花时间去学习新的语言，你可以善用己熟悉的HTML、CSS、Ajax、Flash、Flex等，就能够开发出桌面窗口程序，并且支持实时联机/离线、档案拖拉等功能，甚至还可与二个不同的窗口程序沟通，整个工作流程更具简便。</p>
		<p>
				<br />企业业主/老板</p>
		<p>花钱的是老板，要利润的也是老板，大多数人的想法是不用花费任何一毛钱最好，要告诉老板们的是，AIR执行环境是不用任何费用，没错，「就是免费」，公司所养的开发人员也不用为了教育费用重新来过，只需花一点技巧，让他们知道怎么导入企业应用，怎么把现有网页转换成AIR程序即可，当然，若采用Adobe的解决方案，花小额，采用最适合的工具，如Flex Builder、Flash等，更容易创造出公司未来的生财服务，还是一句话，「值得」。</p>
		<p>AIR技术卖点 </p>
		<p>用相同Web技术就能制作出窗口系统，并且强调的是RIA系统，AIR它不是原生于操作系统内，而是附加安装后可以让你执行的环境，也因此，不建议你用AIR做一个类似PhotoShop软件，甚至是Premiere很仰赖系统资源的软件，但是你却能做出如Kuler色彩管理工具或其它结合网络应用的程序，想象一下，所有网页能够执行的内容，都可以搬到桌面窗口应用，再者，加上档案拖曳功能，实时联机与离线作业，可把PDF、SWF、HTML集于一身，支持跨平台安装与执行，这就是AIR的技术卖点。 </p>
		<p>Adobe针对AIR的使用技术，区分了二种技术类型，一为「应用程序」，二为「文件」。以下就以这二类型来说清楚讲明白。 </p>
		<p>一、应用程序类型 </p>
		<p>以一针见血来说，其实就是利用Flash与HTML来建立与布署AIR程序。 </p>
		<p>AIR己有把Flash Player核心放进来，这是AIR的核心之一，所以它支持ECMAScript为基础的ActionScript 3语言，现在Flash Player也贡献在开放性程序代码的Tamarin项目，未来在Firefox浏览器版本上也能看到。(更多Tamarin专案详情，请见网站：<a href="http://www.mozilla.org/projects/tamarin/">http://www.mozilla.org/projects/tamarin/</a>)<br /> <br />非但如此，AIR不仅在既有的Flash Player APIs可以用，可做的事情更加扩大，主要包含如下： </p>
		<p>AIR引擎可实时解析ActionScript语法，以致有更好的效能表现。 <br />完整的网络堆栈，所以支持HTTP、RTMP、2位及XML Sockets。 <br />完整性的图形向量着色功能，加上还有绘图APIs，让你可以自由设计手绘功能。 <br />多媒体支持，包含Bitmaps(位图)、向量图、影像、声音等。(这在传统的Ajax技术无法办到)。  <br />不能忘记的是Flex框架(Framework)，所有Flex 2的功能，你都可以在AIR身上全力发挥。 </p>
		<p>只要是HTML的功能，在AIR也都能施展，这其中包括了，HTML、JavaScript、CSS、XHTML、DOM(Document Object Model)。因此，你可以不需使用Flash，同样可以写出AIR程序，而且用的是HTML、JavaScript等，这项对传统网页开发者来说无疑是如鱼得水，可以这么做的原因也是在于用了开放性的WebKit引擎，此引擎在许多浏览器上可以找到，如Mac OS的Safari浏览器、Linux相关系统的KHTML等。 </p>
		<p>在这里我们应该要晓得背后的动机是什么，为什么要采用WebKit，知道主要原因将有助于了解日后发展状况。 </p>
		<p>首当其冲因为Webkit是开放性项目，Adobe知道一个HTML引擎的长期开发及维护是相当不容易，Webkit有全球众多的开发者及社群在维护着，尤其许多使用者分布在Apple及Nokia领域的Power User，使得Adobe可以专心在其它如除错、延伸功能等，并且有效回报内容给Webkit组织，获得不断精进。 <br />其次是Adobe在决定用Webkit时，希望Web开发人员可以熟悉Webkit引擎的解析状况，好比，同个HTML码在Firefox执行可能是没问题的，但在IE就会错误百出。 <br />很多人都希望AIR的执行环境程序能够越小越好，而WebKit引擎的程序代码是经过组织性的讨论与严谨撰写下而完成，目前以Flash与HTML引擎加上之后的档案大小大约在5MB多左右(远比.NET Framework小太多倍)。 <br />WebKit是被计划可以执行在手持装置上，这与Adobe长期的策略不谋而合，现己证实能执行在Nokia及Apple的手机上。 <br />二、文件类型 </p>
		<p>文件类型在AIR的应用是希望可以用在动态电子文件中，也就是说每个字段内容都是可以用互动方式产生，在这里PDF及HTML就是主角。<br />以目前来说Alpha1还没把PDF功能整合进来，但是值得一提的是，AIR程序里的PDF文件是可以嵌在Flash里或HTML里，甚至是同时混搭(Mash-up)在Flash、HTML中。同样的，HTML也是可以做相同工作，把PDF与SWF都放在一块。如图1所示。 </p>
		<p>
				<br />图1：PDF可任意嵌在HTML或SWF环境里。 </p>
		<p>所以，我们先来综整一下，AIR的语言模型可以怎么形成：<br />图2所示，你可以用 </p>
		<p>纯粹使用Flash技术，此包含了Flex。 <br />你可以使用Flash为底层，再嵌入HTML内容。 <br />你可以单纯只使用HTML或JavaScript。 <br />你可以使用HTML或JavaScript再嵌入Flash内容。 <br />以上所有语言的混搭都可以结合PDF文件内容。 </p>
		<p>
				<br />图2：适合开发AIR程序的语言 </p>
		<p>  </p>
		<p>描述语言的整合 </p>
		<p>由于WebKit与Flash Player引擎二者同时包含在AIR执行环境里，所以Adobe也将他们能发挥的功能整合在一块，这对开发者上将会更加便利，举例来说，HTML内容被包含在Flash里，事实上将是经由Flash来负责着色，这意味你可以任何在Flash里做位图，像是模糊(Blur)、旋转(Rotate)、变型(Transform)等。 </p>
		<p>另外使开发人员感到兴奋的一件事就是，ActionScript可以与JavaScript做双向沟通，如下： </p>
		<p>容许JavaScript程序代码去呼叫ActionScript APIs <br />容许ActionScript程序代码去呼叫JavaScript APIs <br />ActionScript程序代码可以直接操作DOM <br />能藉由JavaScript与ActionScript来做事件注册  <br />AIR支援哪些APIs ? </p>
		<p>除了原有的Flash Player及WebKit引擎所提供的APIs之外，AIR附加了新的重要APIs功能，皆可由ActionScript或JavaScript来呼叫，如下： </p>
		<p>完整的档案输入/输出功能 <br />完整的窗口控制 <br />完整的目录控制 <br />网络联机/离线侦测 <br />数据快取与同步(便于让你开发离线作业的功能) <br />系统通知功能(此需视操作系统的机制而定) <br />程序自动更新功能 <br />以上所有APIs功能都可以直接在执行环境上或AIR框架中完成。 </p>
		<p>桌面系统整合能力 </p>
		<p>如同前言，摆脱以往浏览器之所不能，又能让使用者像是在用原来桌面应用程序，更重要是让人去验验Flash接口的互动能力，这就是AIR的桌面整合特色。目前包括了： </p>
		<p>正常程序的安装与移除 <br />可把安装完毕的程序直接放在桌面快捷方式或程序集 <br />程序拖曳的操作，如：操作系统与AIR程序间的拖曳，AIR程序间的拖曳。 <br />一般程序与AIR程序的沟通。 <br />支持剪贴簿功能 <br />系统通知功能 <br />自订图示 <br />可将AIR程序在背景中执行 <br />一旦安装完成，AIR程序如同一般安装后的程序感觉都一样，每一支都是独立的，你可以来回用Tab键切换。使用者不需知道这程序的背后机制是怎么来，只管其操作方法。但其接口的互动感觉确是可以让人深刻体会。 </p>
		<p>AIR相关工具组 </p>
		<p>网页程序现在应用为什么会这么普遍，其中之一也是因为网页开发者根本不需要知道使用者用的是什么操作系统，就可以把他们写好的程序马上给客户使用，不管是Windows或Linux、Solaris、或手机，祗要是网页程序能够被浏览器读取，就几乎都可以使用。 </p>
		<p>对AIR也是同样道理，不仅是可以提供跨平台的网页桌面应用能力外，它也是可以在打包成软件的情况下，让你在其它操作系统上执行。 </p>
		<p>事实上，AIR目前不局限只能在Flex Builder上开发，你可以用NotePad(笔记本)，或是任何可以写HTML、JavaScript的编辑工具，就可以打造出AIR的应用程序。 </p>
		<p>当然，工欲善其事，必先利其器。若你要有视觉性的开发工具，Flex Builder不失为值得使用的IDE工具，你可以到Adobe官方网站下载试用，记得必须要下载Flex Builder 2.0.1加上AIR Extensions for Flex Builder 2.0.1，才能管理整个AIR程序项目。 </p>
		<p>另外，Adobe官方刚释放一些AIR的重要工具，各位可以去下载把玩，试试便知道精彩神奇的内容在哪里。 </p>
		<p>开始前你必须要知道的 </p>
		<p>AIR RunTime<br />这是主要运行AIR程序的执行环境，如同微软的.NET Framework一样，任何开发好的AIR程序都要有这执行环境才能使用。 </p>
		<p>AIR SDK<br />SDK包含了AIR Frameworks、命令列程序、链接库、基本设定档等内容。所以可以让你做测试、除错或利用其它文字、视觉编辑工具写好后，直接打包成AIR程序。 </p>
		<p>在SDK里有二个重要的命令列工具是： </p>
		<p>ADL(AIR Debugger Launcher)<br />主要是用在不需要先前经过安装，就可以直接测试并执行AIR程序。 <br />ADT(AIR Developer Tool)<br />这就是封装成AIR安装程序，扩展名是.air，当你打包成air档后，你就可以布署在任何的系统上(目前Alpha1祗提供Windows及Macintosh二种平台，正式版会有Linux平台，官方说明未来也会有手机运行版本)。 <br />以上，所有下载网址都在<a href="http://labs.adobe.com/downloads/air.html">http://labs.adobe.com/downloads/air.html</a>。 </p>
		<p>小结： </p>
		<p>多数的朋友听到AIR的应用后，常询问一个问题，那就是AIR会不会就是取代浏览器上的应用？并且未来直接再把AIR的程序再放回浏览器上使用？<br />这问题我与Adobe资深开发人员关系产品经理讨论过，AIR是为了解决浏览器上应用的不足，并且他是用相同的技术、语言、链接库来完成桌面上的应用，并且AIR还在发展阶段，后续将上市的功能也都会顾及到使用者在长期以来得不到的解决方案，然而开发者什么时候会用AIR技术在桌面平台上？这也会视需求量而定，不过既然都使用Web技术，所以你可以很快就转换成AIR版本，还可以同时有二个版本存在，这给你的客户或未来所有使用者有了更好的选择。 </p>
		<p>作者简介： </p>
		<p>刘仲滨 <br />国立交通大学电机信息学院数字图书组硕士，研究 Adobe/macromedia相关产品多年，为国内企业暨华人社群大力推展 RIA互动多媒体应用暨解决方案，著作有相关Adobe/Macromedia网页书籍、多篇杂志专栏，同时为大型研讨会讲师，技术顾问，及RiS平台(<a href="http://j2eemx.com">http://j2eemx.com</a>)资深社群主持人。 </p>
		<p>文章来源于 mon的博客:http://monw3c.blogbus.com/logs/7971758.html</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/307914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-31 15:04 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/31/307914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex与后台交互的4种方法 HTTPService、URLLoader、WebService详解</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/31/307913.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 31 Dec 2009 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/31/307913.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/307913.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/31/307913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/307913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/307913.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>Flex与后台交互的4种方法 HTTPService、URLLoader、WebService详解  </strong>
		</p>
		<p>HTTPService</p>
		<p>
				<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="absolute" initialize="initializeHandler(event)"&gt;<br />&lt;mx:Script&gt;<br />&lt;![CDATA[<br />private function initializeHandler(event:Event):void {<br />countriesService.send();<br />}<br />private function changeHandler(event:Event):void {<br />statesService.send();<br />}<br />]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;!-- 载入纯静态的xml数据 --&gt;<br />&lt;mx:HTTPService id="countriesService" url="<a href="http://www.rightactionscript.com/states/xml/countries.xml">http://www.rightactionscript.com/states/xml/countries.xml</a>" /&gt;<br />&lt;!-- 载入由php生成的xml数据 --&gt;<br />&lt;mx:HTTPService id="statesService" url="<a href="http://www.rightactionscript.com/states/xml/states.php">http://www.rightactionscript.com/states/xml/states.php</a>"&gt;<br />&lt;!-- 以下标签就是要发送到服务端的数据了,可以这样理解:有一个名为country的变量,它的值为花括号{}里的内容 --&gt;<br />&lt;mx:request&gt;<br />&lt;country&gt;{country.value}&lt;/country&gt;<br />&lt;/mx:request&gt;<br />&lt;/mx:HTTPService&gt;<br />&lt;mx:VBox&gt;<br />&lt;!-- 此控件的数据由第一个&lt;mx:HTTPService/&gt;控件接收的内容提供,并且由这个ComboBox控制着第二个ComboBox所要显示的内容 --&gt;<br />&lt;mx:ComboBox id="country" dataProvider="{countriesService.lastResult.countries.country}"<br />change="changeHandler(event)" /&gt;<br />&lt;!-- 下面的ComboBox已经绑定了{statesService.lastResult.states.state},随它的数据改变而改变 --&gt;<br />&lt;mx:ComboBox dataProvider="{statesService.lastResult.states.state}" /&gt;<br />&lt;/mx:VBox&gt;<br />&lt;/mx:Application&gt;</p>
		<p>
				<br />URLLoader</p>
		<p>
				<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="absolute" initialize="initializeHandler(event)"&gt;<br />&lt;mx:Script&gt;<br />&lt;![CDATA[<br />private var _countriesService:URLLoader;<br />private var _statesService:URLLoader;<br />private function initializeHandler(event:Event):void {<br />_countriesService = new URLLoader();<br />_countriesService.addEventListener(Event.COMPLETE, countriesCompleteHandler);<br />_countriesService.load(new URLRequest("<a href="http://www.rightactionscript.com/states/xml/countries.xml">http://www.rightactionscript.com/states/xml/countries.xml</a>"));<br />_statesService = new URLLoader();<br />_statesService.addEventListener(Event.COMPLETE, statesCompleteHandler);<br />XML.ignoreWhitespace = true;<br />}<br />private function countriesCompleteHandler(event:Event):void {<br />var xml:XML = new XML(_countriesService.data);<br />country.dataProvider = xml.children();<br />}<br />private function statesCompleteHandler(event:Event):void {<br />var xml:XML = new XML(_statesService.data);<br />state.dataProvider = xml.children();<br />}<br />private function changeHandler(event:Event):void {<br />var request:URLRequest = new URLRequest("<a href="http://www.rightactionscript.com/states/xml/states.php">http://www.rightactionscript.com/states/xml/states.php</a>");<br />var parameters:URLVariables = new URLVariables();<br />parameters.country = country.value;<br />request.data = parameters;<br />_statesService.load(request);<br />}<br />]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:VBox&gt;<br />&lt;mx:ComboBox id="country" change="changeHandler(event)" /&gt;<br />&lt;mx:ComboBox id="state" /&gt;<br />&lt;/mx:VBox&gt;<br />&lt;/mx:Application&gt;</p>
		<p> </p>
		<p>
				<br />WebService 方法一</p>
		<p>
				<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="absolute" initialize="initializeHandler(event)"&gt;<br />&lt;mx:Script&gt;<br />&lt;![CDATA[<br />private function initializeHandler(event:Event):void {<br />statesService.getCountries();<br />}<br />private function changeHandler(event:Event):void {<br />statesService.getStates(country.value);<br />}<br />]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:WebService id="statesService"<br />wsdl="<a href="http://www.rightactionscript.com/states/webservice/StatesService.php?wsdl">http://www.rightactionscript.com/states/webservice/StatesService.php?wsdl</a>"&gt;<br />&lt;mx:operation name="getCountries" /&gt;<br />&lt;mx:operation name="getStates" /&gt;<br />&lt;/mx:WebService&gt;<br />&lt;mx:VBox&gt;<br />&lt;mx:ComboBox id="country"<br />dataProvider="{statesService.getCountries.lastResult}" change="changeHandler(event)" /&gt;<br />&lt;mx:ComboBox dataProvider="{statesService.getStates.lastResult}" /&gt;<br />&lt;/mx:VBox&gt;<br />&lt;/mx:Application&gt;</p>
		<p>
				<br />WebService 方法二</p>
		<p>
				<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="absolute" initialize="initializeHandler(event)"&gt;<br />&lt;mx:Script&gt;<br />&lt;![CDATA[<br />private function initializeHandler(event:Event):void {<br />statesService.getCountries.send( );<br />}<br />private function changeHandler(event:Event):void {<br />statesService.getStates.send( );<br />}<br />]]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:WebService id="statesService" wsdl="<a href="http://www.rightactionscript.com/states/webservice/StatesService.php?wsdl">http://www.rightactionscript.com/states/webservice/StatesService.php?wsdl</a>"&gt;<br />&lt;mx:operation name="getCountries" /&gt;<br />&lt;mx:operation name="getStates"&gt;<br />&lt;mx:request&gt;<br />&lt;country&gt;{country.value}&lt;/country&gt;<br />&lt;/mx:request&gt;<br />&lt;/mx:operation&gt;<br />&lt;/mx:WebService&gt;<br />&lt;mx:VBox&gt;<br />&lt;mx:ComboBox id="country"<br />dataProvider="{statesService.getCountries.lastResult}" change="changeHandler(event)" /&gt;<br />&lt;mx:ComboBox dataProvider="{statesService.getStates.lastResult}" /&gt;<br />&lt;/mx:VBox&gt;<br />&lt;/mx:Application&gt; </p>
		<p>原文：<a href="http://bbs.airia.cn/FLEX/thread-2738-1-1.aspx">http://bbs.airia.cn/FLEX/thread-2738-1-1.aspx</a></p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/307913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-31 14:48 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/31/307913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex程序与html通信方法大全</title><link>http://www.blogjava.net/kyleYang/archive/2009/12/31/307884.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Thu, 31 Dec 2009 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2009/12/31/307884.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/307884.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2009/12/31/307884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/307884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/307884.html</trackback:ping><description><![CDATA[
		<p>Flex通常作为一个web项目的一部分嵌入到一个web页中，因此Flex程序和web页面的通信就变得非常重要。 </p>
		<div>1）  Flex提供了多种方法实现<span>Flex程序和封装页面的交互，主要有：flashVars属性，查询字符串参数，navigateToURL()方法，以及flash.external.ExternalInterface类。</span></div>
		<div>
				<span>2）<span style="FONT: 7pt 'Times New Roman'">    <span style="FONT-SIZE: x-small; FONT-FAMILY: Arial"><font size="1">Flex程序</font></span>  </span></span>获取环境信息：<span>Application.application.url获取封装页面的URL，以及使用<span>@ContextRoot()</span><span>；</span> 以及可以通国 flash.system.Capacities获取到有关系统的一些信息，比如版本、语言、操作系统等；</span></div>
		<div>
				<span>3）<span style="FONT: 7pt 'Times New Roman'">    </span></span>flashVars用来从外部封装页面向<span>Flex程序传送数据：</span></div>
		<div>
				<span>         在封装页面传入参数值：AC_FL_RunContent(flashVars, “para1=value1&amp;…&amp;paran=valuen”)或者</span>
		</div>
		<div style="MARGIN-LEFT: 42pt">&lt;Object&gt;</div>
		<div style="MARGIN-LEFT: 42pt">
				<span>    &lt;param name=”movie” value=”wrapper.swf? para1=value1 /&gt;</span>
		</div>
		<div style="MARGIN-LEFT: 42pt">
				<span>    &lt;embed src=”wrapper.swf?para1=value1/&gt;</span>
		</div>
		<div>
				<span>                  &lt;/Object&gt;</span>
		</div>
		<div>
				<span>                 然后flex</span> 程序里通过<span> Application.application.parameters.para1获取参数值；</span></div>
		<div>
				<span>4）<span style="FONT: 7pt 'Times New Roman'">    </span></span>ExternalInterface提供方法使<span>Flex程序和外部的封装页面可以相互调用对方的方法，外部接口类要受到域安全性设置（allowScriptAccess, allowNetworking）的约束。</span></div>
		<div style="MARGIN-LEFT: 42pt">先判断<span>ExternalInterface是否可用：</span></div>
		<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: 21pt">ExternalInterface.available;</div>
		<div style="MARGIN-LEFT: 42pt">flex调用<span>js：</span></div>
		<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 42pt">ExternalInterface.call(funName, funPara1, …, funParaN)；</div>
		<div style="MARGIN-LEFT: 42pt">js调用<span>flex：</span></div>
		<div style="MARGIN-LEFT: 63pt">首先<span>flex里面用ExternalInterface.addCallback(“jsFunName”,asFun),将AS里面定义的函数赋予一个js里面调用的函数的名字jsFunName；</span></div>
		<div style="MARGIN-LEFT: 63pt">然后在<span>js里面用mySwf.jsFunName()调用flex里面提供的函数asFun；</span></div>
		<div style="MARGIN-LEFT: 42pt">ExternalInterface安全性：</div>
		<div style="MARGIN-LEFT: 63pt">一般来说<span>js和flex的访问局限于同一个域之内。</span></div>
		<div style="MARGIN-LEFT: 63pt">可以设置<span>&lt;Object&gt;和&lt;Embed&gt;的allowScriptAccess=”value”(value取值:never, always, sameDomain默认)来设置flex访问js的权限。</span></div>
		<div style="MARGIN-LEFT: 63pt">至于<span>js对于flex方法的访问只有flex里面通过addCallback的js才可以访问，对于跨域，可以试用allowDomain()函数设置。</span></div>
		<div>
				<span>5）<span style="FONT: 7pt 'Times New Roman'">    </span></span>navigateToURL() 可以用来打开一个新的浏览器窗口，也可以用来flex和js之间的通信。比如<span>:</span></div>
		<div>
				<span>         打开一个新窗口：</span>
		</div>
		<div style="MARGIN-LEFT: 42pt">var <a href="http://writeblog.csdn.net/Editor/FCKeditor/editor/URLRequest"><font color="#006699">url:URLRequest</font></a> = new URLRequest(<a href="http://blog.csdn.net/"><font color="#006699">http://blog.csdn.net</font></a> );</div>
		<div style="MARGIN-LEFT: 42pt">navigateToURL(url, _blank);</div>
		<div style="MARGIN-LEFT: 42pt">这个函数也可以用来执行<span>js，例如：</span></div>
		<div style="MARGIN-LEFT: 42pt">var <a href="http://writeblog.csdn.net/Editor/FCKeditor/editor/URLRequest"><font color="#006699">url:URLRequest</font></a> = new URLRequest(“javascript:window.close()”); 或者：</div>
		<div style="MARGIN-LEFT: 42pt">var urlLURLRequest = new URLRequest(“javascript:myFun(para1…paran)”)</div>
		<div style="MARGIN-LEFT: 42pt">myFun()函数是html页面的script部分定义的，函数参数一定要有引号！</div>
		<div style="MARGIN-LEFT: 42pt">navigateToURL(url, _self);</div>
		<div style="MARGIN-LEFT: 42pt">也可以用来发送<span>email：</span></div>
		<div style="MARGIN-LEFT: 42pt">var urlURLRequest = new URLRequest(<a href="mailto:zoushun@hotmail.com"><font color="#006699">mailto:zoushun@hotmail.com</font></a> );</div>
		<div style="MARGIN-LEFT: 42pt">navigateToURL(url, _blank);<br />摘自：<a href="http://blog.csdn.net/arshoon/archive/2008/06/11/2533982.aspx">http://blog.csdn.net/arshoon/archive/2008/06/11/2533982.aspx</a></div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/307884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2009-12-31 11:05 <a href="http://www.blogjava.net/kyleYang/archive/2009/12/31/307884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>