Browse > Home > Archive: 二月 2008

| Subcribe via RSS

期待Sliverlight2

二月 25th, 2008 | No Comments , 258 views | Posted by flashlizi in Silverlight

前一段时间摸了一下sliverlight1.0,对它以XAML形式描述一个完整的WEB矢量内容非常有兴趣。其中笔刷功能非常有意思。不过粗看了一下API发现,1.0的功能实在是太弱:动画实现太烦,文本控制能力(有条件的支持中文)太弱,事件太少,操作XML太复杂等等。不过对于刚诞生的SL,还是可以理解的。

微软马上就要发布sliverlight2测试了,在First Look at Silverlight 2中看到一些可喜的改变:基于WPF的UI框架;加强及增加了TextBox, Slider, ScrollViewer, Calendar, DatePicker等丰富的控制组件;对HTTP, REST, WS*/SOAP, POX, RSS等的网络支持;包括一个基于.NET的丰富的功能类库,其中有针对XML, javascript, HTML DOM的支持。

不过Beta1版本体重已达4.3MB了,未免有点肥胖症。非常值得期待,尽管它比起flash来差距还是很大。

AS2:通过ExternalInterface使用正则表达式

二月 21st, 2008 | No Comments , 350 views | Posted by flashlizi in Flash8/AS2

AS2中没有正则表达式,虽然有人写过这样的正则类,不过有时候只需少量的正则应用,所以想换个解决方案。因为ExternalInterface的call方法可以调用外部容器中的方法,如果我们的flash是运行在浏览器里的话,那么是否能用javascript来为我们做正则匹配呢?

经过测试,这样的方法是可行的。先看下面的测试代码:

var str:String="www.myDomain.com";
//js代码: 创建和执行regExp方法
var js:String=function regExp(){var str="+str+";return str.replace(/myDomain/g,"RIAidea");}regExp();
//ExternalInterface在浏览器中用javascript的eval方法来执行上面的js代码,并获取返回值
var newstr:String=flash.external.ExternalInterface.call(eval,js).toString();
//在浏览器中弹出窗口显示刚才的返回值
flash.external.ExternalInterface.call(alert("+newstr+"));

把上面代码copy到主时间轴第一帧上,按F12在浏览器中预览(注意文件名不能为Untitled-X,原因请见我上篇文章)。可以看到浏览器会弹出一个窗口,内容为:www.RIAidea.com。这里主要是利用ExternalInterface在浏览器中用javascript的eval方法来执行上面定义包含regExp方法的js代码,并获取正则返回值。最后,再用EI在浏览器中弹出一个窗口,显示刚才获取的返回值。

最后要说明的是,这种偏方有局限性,只能用于浏览器中的flash程序,而且不宜调用复杂的JS方法,请在合适的地方使用。另外,AS3已支持正则,就不需要考虑这样做了,不过,开发flash的web应用的时候,有些地方还是可以使用这样的把外部方法写在AS中的方法的。

一个命名空间namespace应用演示

二月 20th, 2008 | No Comments , 301 views | Posted by flashlizi in Flash CS3/AS3

这是一个用命名空间来控制名称相同的方法的不同实现的例子。三个命名空间string、number、array下均有一个名为print的方法,它们分别实现打印字符串、数字、数组的具体方法。有时候用命名空间也是实现方法重载的一种不错的办法。

演示代码如下:

  1. package {
  2. import flash.display.Sprite;
  3. public class NameSpaceExam extends Sprite{
  4. //打印字符串的NS
  5. private namespace string;
  6. //打印数字的NS
  7. private namespace number;
  8. //打印数组的NS
  9. private namespace array;
  10. //构造函数
  11. public function NameSpaceExam() {
  12. var str:String = "www.riaidea.com";
  13. var num:Number = 200802201507;
  14. var arr:Array = ["flash cs3", "flex3.0", "sliverlight 1.0", 2008, true];
  15. trace(string::print(str));
  16. trace(number::print(num,","));
  17. trace(array::print(arr));
  18. }
  19. //打印字符串
  20. string function print(str:String):String {
  21. return "String: " + str;
  22. }
  23. //打印数字,3节分段计数形式
  24. number function print(num:Number,sep:String=","):String {
  25. var str:String=String(num);
  26. var new_str:String="";
  27. var len:int=str.length;
  28. while(len>3){
  29. var tmp:String=str.slice(len-3);
  30. str=str.substring(0,len-3);
  31. new_str=sep+tmp+new_str;
  32. len=str.length;
  33. }
  34. return "Number: "+str+new_str;
  35. }
  36. //打印数组,枚举每个数组元素
  37. array function print(arr:Array):String {
  38. var str:String = "Array: \r";
  39. for (var i:int = 0, l:int = arr.length; i < l; i++) {
  40. str += "["+i+"]-> "+arr[i].toString()+"\r";
  41. }
  42. return str;
  43. }
  44. }
  45. }

输出结果为:

  1. String: www.riaidea.com
  2. Number: 200,802,201,507
  3. Array:
  4. [0]-> flash cs3
  5. [1]-> flex3.0
  6. [2]-> sliverlight 1.0
  7. [3]-> 2008
  8. [4]-> true

网页中flash对象ID命名错误造成ExternalInterface失效

二月 20th, 2008 | No Comments , 222 views | Posted by flashlizi in Flash CS3/AS3

今天做个小测试的时候,在flash cs3中按F12预览,发现ExternalInterface在IE下失效,而Firefox却很正常。以前做过类似的都没出现过问题。

经过排查,终于发现罪魁祸首是id="Untitled-1",把id中的连字符号(hyphen)去掉就OK了。大家都知道flash默认文件名为:Untitled-X.swf,测试也就没去修改。这样看来IE中的命名对连字符号"-"也是敏感的,最好避免在命名中使用到它。

以前写的一个简便的ajax应用处理js框架Ajaxer

二月 19th, 2008 | No Comments , 215 views | Posted by flashlizi in Javascript

简介:针对ajax应用而开发的一个简单的js框架,功能也是最基本的。有常规的post和get处理方法,拥有onStart、onComplete、onTimeout、onException、onParseError等事件处理机制。如有需要再进行功能扩展吧。源文件及演示下载地址:Ajaxer,功能演示地址:进入

一般属性:
url:ajax对象请求的url地址。必需。
data:ajax对象请求时要发送的数据。可选。格式为值对,如:{name:"ajaxer",author:"alex.li"},默认为null。
timeout:请求超时时间,单位为毫秒。可选。默认为0,即不做超时设置。

其他属性(一般无需设置,有需求时可用):
method:请求方式,可以是“post”或“get”。
async:请求时是否异步,可以是true或false,默认为true。
dataType:请求返回的数据类型。默认为null,需要指定为xml时,可设置为“xml”。
cache:请求是否缓存。默认为false,即不缓存。如果改为true,则启动请求缓存。

方法:post(url,data,callback)
说明:使用post方式发送请求。
参数:
url:请求的url,必需。
data:请求时要发送的数据。可选。格式为值对,如:{name:"ajaxer",author:"alex.li"},默认为null。
callback:请求完成的回调函数。此函数接受一个参数,为请求返回的内容(文本或xml)。

get(url,data,callback)
说明:使用get方式发送请求。
参数:(同post参数说明)

事件:
onStart:请求开始触发。函数对象。
onComplete:请求完成触发。同post或get的callback参数。函数对象。
onTimeout:请求超时触发。函数对象。
onException:请求异常时触发。函数对象。
onParseError:解析返回的数据错误时触发。函数对象。

Actionscript4.0新特性预览

二月 17th, 2008 | No Comments , 428 views | Posted by flashlizi in News

Colin Moock最近发表了一份ECMAScript 4.0的最新特性而AS3还不支持的汇总说明。因为AS是基于ECMAScript的,所以将来的AS4理论上应该会支持ECMAScript 4.0的这些新特性,至少会部分支持。

这些新特性包括:
1、Record Type:记录类型,它可以快速定义一个对象的元素类型,比定义一个类更简洁。如AS3中有Point类,如果我们只需要一个简单的对象来记录一些点的坐标,用Point类就浪费了。于是我们就可以用type关键字来创建记录类型:type Point={x:Number,y:Number},这样我们就可以用new Point(10,20)来定义一个点了。它比AS3中的Point类轻巧而快速,而且是强类型,比如new Point("riaidea","true")就会报错。

2、Array Type:数组类型,同记录类型类似,它可以让你定义一个数组对象的元素类型。比如:type myArray=[int,String],那么第一个元素就只能是int类型,第二元素只能是String类型。

3、Union Types:复合类型,它能指定一个变量为多个类型。如:var content:(String|XML),其中变量content可以为String或XML类型。在方法中的参数定义也可以用复合类型。

4、Generic Functions:重载方法。很多朋友都问为什么AS3没有重载,AS4就会应该有了。

5、Iterators and Generators:迭代器和控制器。与python相似。

6、New Number Types:新数据类型。增加byte, double, decimal,而Number类型则会取消。

更详细的请看Moock的文章:http://moock.org/lectures/newInECMAScript4/
还有ECMAScript4的新标准:http://www.ecmascript.org/es4/spec/overview.pdf

IE7/Firefox阻止navigateToURL打开新窗口的解决方法

二月 13th, 2008 | No Comments , 504 views | Posted by flashlizi in Flash CS3/AS3

新年第一篇文章,首先给大家拜个晚年:)。今天上班终于想起要解决这个问题了。IE7和Firefox(我使用的版本是2.0.0.11)会阻止用navigateToURL方法打开新窗口,而AS2中的getURL方法则不会,让人很不爽。既然项目选择了AS3开发,就只能想办法来解决。

首先当然想到的是ExternalInterface了,测试发现还是会被blocked。后来想添加wmode会不会有所帮助,于是在页面中添加wmode属性为opaque,果然OK了。

现提供AS3中的getURL方法:

使用方法跟AS2中的getURL一样。另外,我只测试了IE6/7,Firefox2,并未对Safari等其他浏览器做测试。最后,最最重要的就是在html中把flash对象设置wmode属性为opaque或transparent。因为wmode属性默认为window,这表明此Flash应用程序与HTML层没有任何交互。