<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[ - 前端技术]]></title>
  <subtitle type="html"><![CDATA[追意|做爱做的事：高清设计，无码开发，诱惑的作品，傲人的体验。关注设计，专注flash。Flash开发工程师，Flash设计师，web设计开发工程师]]></subtitle>
  <id>http://www.jovey.net/blog/</id>
  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.jovey.net/blog/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-10-10T16:04:33+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[JSON 入门指南]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-10-10T16:04:33+08:00</updated>
	  <published>2008-10-10T16:04:33+08:00</published>
		  <summary type="html"><![CDATA[JSON 即 JavaScript Object Natation，它是一种轻量级的数据交换格式，非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式，并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。 <br/>尽管有许多宣传关于 XML 如何拥有跨平台，跨语言的优势，然而，除非应用于 Web Services，否则，在普通的 Web 应用中，开发者经常为 XML 的解析伤透了脑筋，无论是服务器端生成或处理 XML，还是客户端用 JavaScript 解析 XML，都常常导致复杂的代码，极低的开发效率。实际上，对于大多数 Web 应用来说，他们根本不需要复杂的 XML 来传输数据，XML 的扩展性很少具有优势，许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比，返回 HTML 片段大大降低了系统的复杂性，但同时缺少了一定的灵活性。 <br/><br/>现在， JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么，同 XML 或 HTML 片段相比，JSON 提供了更好的简单性和灵活性。<br/><strong><span style="font-size:14pt;line-height:100%;">JSON 数据格式解析 </span></strong><br/><br/>和 XML 一样，JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的，因此，JSON 的数据格式非常简单，您可以用 JSON 传输一个简单的 String，Number，Boolean，也可以传输一个数组，或者一个复杂的 Object 对象。 <br/><br/>String，Number 和 Boolean 用 JSON 表示非常简单。例如，用 JSON 表示一个简单的 String “ abc ”，其格式为：<br/><br/>&#34;abc&#34; <br/><br/><br/>除了字符 &#34;，\，/ 和一些控制符（\b，\f，\n，\r，\t）需要编码外，其他 Unicode 字符可以直接输出。<br/><br/>这与绝大多数编程语言的表示方法一致，例如：<br/><br/>12345（整数）<br/> -3.9e10（浮点数） <br/><br/><br/>Boolean 类型表示为 true 或 false 。此外，JavaScript 中的 null 被表示为 null，注意，true、false 和 null 都没有双引号，否则将被视为一个 String 。 <br/><br/>JSON 还可以表示一个数组对象，使用 [] 包含所有元素，每个元素用逗号分隔，元素可以是任意的 Value，例如，以下数组包含了一个 String，Number，Boolean 和一个 null：<br/><br/>[&#34;abc&#34;,12345,false,null] <br/><br/><br/>Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的，实际上此处的 Object 相当于 Java 中的 Map&lt;String, Object&gt;，而不是 Java 的 Class 。注意 Key 只能用 String 表示。 <br/><br/>例如，一个 Address 对象包含如下 Key-Value：<br/><br/>city:Beijing <br/> street:Chaoyang Road <br/> postcode:100025（整数） <br/><br/><br/>用 JSON 表示如下：<br/><br/>{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025} <br/><br/><br/>其中 Value 也可以是另一个 Object 或者数组，因此，复杂的 Object 可以嵌套表示，例如，一个 Person 对象包含 name 和 address 对象，可以表示如下：<br/><br/>{&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>} <br/><br/><br/><strong>JavaScript 处理 JSON 数据 </strong><br/><br/>上面介绍了如何用 JSON 表示数据，接下来，我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端，以及客户端如何使用 JavaScript 处理 JSON 格式的数据。 <br/><br/>我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户：<br/><br/>function handleJson() { <br/>&nbsp;&nbsp;var j={&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;document.write(j.name); <br/>&nbsp;&nbsp;document.write(j.address.city); <br/> } <br/><br/><br/>假定服务器返回的 JSON 数据是上文的：<br/><br/>{&#34;name&#34;:&#34;Michael&#34;,&#34;address&#34;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&#34;city&#34;:&#34;Beijing&#34;,&#34;street&#34;:&#34; Chaoyang Road &#34;,&#34;postcode&#34;:100025}<br/>} <br/><br/><br/>只需将其赋值给一个 JavaScript 变量，就可以立刻使用该变量并更新页面中的信息了，相比 XML 需要从 DOM 中读取各种节点而言，JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求，然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力，例如 Prototype（一个流行的 JavaScript 库：<a href="http://prototypejs.org" target="_blank" rel="external">http://prototypejs.org</a>）提供了 evalJSON() 方法，能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量：<br/><br/>new Ajax.Request(&#34;<a href="http://url" target="_blank" rel="external">http://url</a>&#34;, { <br/>&nbsp;&nbsp;method: &#34;get&#34;, <br/>&nbsp;&nbsp;onSuccess: function(transport) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;var json = transport.responseText.evalJSON(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: document.write(json.xxx); <br/>&nbsp;&nbsp;} <br/> }); <br/><br/><br/><strong>服务器端输出 JSON 格式数据 </strong><br/><br/>下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例，我们将演示将一个 Java 对象编码为 JSON 格式的文本。 <br/><br/>将 String 对象编码为 JSON 格式时，只需处理好特殊字符即可。另外，必须用 (&#34;) 而非 (&#39;) 表示字符串：<br/><br/> <br/> static String string2Json(String s) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(s.length()+20); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;s.length(); i++) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c = s.charAt(i); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (c) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\&#34;&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\\&#34;&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\\&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\\\&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;/&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\/&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\b&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\b&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\f&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\f&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\n&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\n&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\r&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\r&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case &#39;\t&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#34;\\t&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(c); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>将 Number 表示为 JSON 就容易得多，利用 Java 的多态，我们可以处理 Integer，Long，Float 等多种 Number 格式：<br/><br/> <br/> static String number2Json(Number number) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;return number.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示：<br/><br/> <br/> static String boolean2Json(Boolean bool) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;return bool.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>要将数组编码为 JSON 格式，可以通过循环将每一个元素编码出来：<br/><br/> <br/> static String array2Json(Object[] array) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (array.length==0) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;[]&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(array.length &lt;&lt; 4); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;[&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (Object o : array) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(toJson(o)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;,&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;// 将最后添加的 &#39;,&#39; 变为 &#39;]&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.setCharAt(sb.length()-1, &#39;]&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>最后，我们需要将 Map&lt;String, Object&gt; 编码为 JSON 格式，因为 JavaScript 的 Object 实际上对应的是 Java 的 Map&lt;String, Object&gt; 。该方法如下：<br/><br/> <br/> static String map2Json(Map&lt;String, Object&gt; map) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (map.isEmpty()) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;{}&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(map.size() &lt;&lt; 4); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;{&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;String&gt; keys = map.keySet(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (String key : keys) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object value = map.get(key); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(key); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;\&#34;&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;:&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(toJson(value)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&#39;,&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;// 将最后的 &#39;,&#39; 变为 &#39;}&#39;: <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.setCharAt(sb.length()-1, &#39;}&#39;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>为了统一处理任意的 Java 对象，我们编写一个入口方法 toJson(Object)，能够将任意的 Java 对象编码为 JSON 格式：<br/><br/> <br/> public static String toJson(Object o) { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o==null) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;null&#34;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof String) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string2Json((String)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Boolean) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return boolean2Json((Boolean)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Number) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number2Json((Number)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Map) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return map2Json((Map&lt;String, Object&gt;)o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Object[]) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array2Json((Object[])o); <br/>&nbsp;&nbsp;&nbsp;&nbsp;throw new RuntimeException(&#34;Unsupported type: &#34; + o.getClass().getName()); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>我们并未对 Java 对象作严格的检查。不被支持的对象（例如 List）将直接抛出 RuntimeException 。此外，为了保证输出的 JSON 是有效的，Map&lt;String, Object&gt; 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归，例如，精心构造一个循环引用的 Map，就可以检测到 StackOverflowException：<br/><br/> <br/> @Test(expected=StackOverflowError.class) <br/> public void testRecurrsiveMap2Json() { <br/>&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;map.put(&#34;key&#34;, map); <br/>&nbsp;&nbsp;&nbsp;&nbsp;JsonUtil.map2Json(map); <br/> } <br/>&nbsp;&nbsp;<br/><br/><br/>好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象，因此，递归引用的可能性很小。 <br/><br/>最后，通过 Servlet 或 MVC 框架输出 JSON 时，需要设置正确的 MIME 类型（application/json）和字符编码。假定服务器使用 UTF-8 编码，则可以使用以下代码输出编码后的 JSON 文本：<br/><br/> <br/> response.setContentType(&#34;application/json;charset=UTF-8&#34;); <br/> response.setCharacterEncoding(&#34;UTF-8&#34;); <br/> PrintWriter pw = response.getWriter(); <br/> pw.write(JsonUtil.toJson(obj)); <br/> pw.flush(); <br/>&nbsp;&nbsp;<br/><br/><br/>小结 <br/><br/>JSON 已经是 JavaScript 标准的一部分。目前，主流的浏览器对 JSON 支持都非常完善。应用 JSON，我们可以从 XML 的解析中摆脱出来，对那些应用 Ajax 的 Web 2.0 网站来说，JSON 确实是目前最灵活的轻量级方案。 <br/><br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=123" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=123</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[有关从 Flash 应用程序迁移到 ActionScript 3.0 的提示]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-09-02T17:13:30+08:00</updated>
	  <published>2008-09-02T17:13:30+08:00</published>
		  <summary type="html"><![CDATA[Adobe Flash CS3 Professional 引入了很多优秀的新功能, 包括 ActionScript 3.0 编程语言和 ActionScript 3.0 FLA 文件格式。 本文是我转向使用 ActionScript 3.0 的过程中注解和反思的总结。 我还提供了以下问题的解决方案: <br/><br/>关于影片剪辑处理的更改 <br/>关于下载数据、内容和元件的更改 <br/>关于 ActionScript 3.0 中构建对象类的更改 <br/>关于影片剪辑处理的更改以下注解解决如何处理影片剪辑的问题: <br/><br/>1. 显示对象与影片剪辑<br/>我在 ActionScript 3.0 注意到的第一个地方就是 MovieClip API。 在 ActionScript 3.0 中, MovieClip API 不再包含我经常使用的多数命令。 我发现有一个新的模型用于画面对象, 其中影片剪辑作为画面对象容器, 为便于控制保留了注册项列表。 MovieClip API 现在主要用于反转时间轴。<br/><br/>在 ActionScript 3.0 中, 可以使用 addChild 方法查看显示在舞台上的画面对象。 例如, 假设您要从“库”创建“组合框”组件的实例。 要查看显示在舞台上的实例, 您需要编写以下代码: <br/><br/>import fl.controls.ComboBox;<br/> <br/>var myCombo:ComboBox = new ComboBox();<br/>addChild(myCombo);2. 实例验证<br/>我发现了 ActionScript 3.0 类中处理实例方式的一些不同之处。 在创作期间置于舞台的实例自动将其实例名称与其影片剪辑容器关联, 名称在 ActionScript 3.0 类中可用。 像在 ActionScript 2.0 中一样在类中声明名称会触发编译器错误。 反过来, 我也发现当针对不存在的实例设置属性时, 编译器也会报告错误。<br/><br/>要验证未定义的实例, 请使用 getChildByName 方法, 如以下代码所示: <br/><br/>var myInstance = getChildByName(&#34;instanceNameInQuestion&#34;);<br/>if( myInstance!= null )<br/>{<br/>&nbsp;&nbsp; // Then do something...<br/>}3. 影片剪辑 (画面对象) 属性更改<br/>在 ActionScript 3.0 中, 下划线 (_) 已从属性名称中去掉。 在某些情况下, 为常用属性设计值的主要也已更新。<br/><br/>影片剪辑的 alpha 属性现在的设置范围为 0-1 而不是 0-100。 例如, 50% 不透明应设置为: <br/><br/>myInstance.alpha = 0.5;画面对象的 scaleX 和 scaleY 属性现在以类似方式设置。 例如, 150% 正常缩放应设置为: <br/><br/>myInstance.scaleX = 1.5;<br/>myInstance.scaleY = 1.5;4. this, _root, _parent, and _global<br/>this 别名可用于 ActionScript 3.0 中, 其行为与 ActionScript 的先前版本一样。 _global 路径在 ActionScript 3.0 中不存在。 _parent 可作为任何画面对象的父属性来访问。 _root 路径不再存在, 但使用舞台属性可以产生同样的结果。<br/><br/>5. 处理深度<br/>我很快发现, swapDepths 和 getNextHighestDepth 在 ActionScript 3.0 不复存在。 作为替代, 您要使用与影片剪辑容器关联的 DisplayObjectContainer 方法。 ActionScript 3.0 中的术语基于子对象列表中的画面对象“索引”, 而不是“深度”概念。<br/><br/>要将 myInstance 剪辑发送以堆序列的顶部, 请使用以下代码: <br/><br/>setChildIndex(myInstance, numChildren - 1);6. 使用 Drawing API<br/>与 MovieClip API 的其他更改一样, 动态 Drawing API 已移动到画面对象的图形属性。 除新位置外, 其使用过程相同 - 有几处明显的增强。<br/><br/>以下代码显示如何动态画出矩形, 然后将此矩形作为遮罩应用到其他实例。 遮罩对象没有时间轴, 因此作为子画面而不是影片剪辑来创建: <br/><br/>import flash.display.Sprite;<br/> <br/>// Cr&#101;ate mask<br/>var maskArea = new Sprite();<br/>maskArea.graphics.beginFill(0xFF0000);<br/>maskArea.graphics.drawRect(-29.5, -22.5, 59, 46);<br/>addChild(maskArea);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>// Apply mask<br/>myInstance.mask = maskArea;注: 在考查以前与 MovieClip 对象关联的常用任务时, 请尝试在浏览 ActionScript 3.0 对象时考查 DisplayObject 类。 有关深度控制和画面对象管理的更多信息, 请参见文档中关于 DisplayObjectContainer 类的说明。<br/><br/>关于下载数据、内容和元件的更改以下注解针对载入图像、服务器数据、元件和 URL 的载入: <br/><br/>7. 载入图像和 SWF<br/>图像和 SWF 文件的载入不再通过 loadMovie 命令或 MovieClipLoader 类进行。 而是使用 URLRequest 类和 Loader 类来完成此任务。<br/><br/>以下代码显示图像载入器脚本的骨架: <br/><br/>import flash.display.Loader;<br/>import flash.net.URLRequest;<br/> <br/>var request:URLRequest = new URLRequest(&#34;img/image1.jpg&#34;);<br/>var loader:Loader = new Loader();<br/>loader.load(request);<br/>addChild(loader);8. 载入服务器数据和 XML<br/>使用新的 ActionScript 3.0 XML 功能和新的 URLLoader 类, 我发现 XML 数据源的使用比以前容易得多。<br/><br/>以下示例显示如何载入 XML 文件并响应数据载入过程的完成: <br/><br/>import flash.display.URLLoader;<br/>import flash.net.URLRequest;<br/>import flash.events.Event;<br/> <br/>var loader = new URLLoader();<br/>loader.load(new URLRequest(&#34;conf/settings.xml&#34;));<br/> <br/>function onDataHandler(event:Event):void<br/>{<br/>&nbsp;&nbsp; if((event.target as URLLoader) != null )<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var settingsXML = new XML(loader.data);<br/>&nbsp;&nbsp; }<br/>}<br/>loader.addEventListener(Event.COMPLETE, onDataHandler);9. 显式载入元件<br/>attachMovie 命令和链接标识符在 ActionScript 3.0 中不复存在。 有两种方法从库载入元件。 两种方法都需要您为目标元件打开“链接”属性中的“为 ActionScript 导入”选项。 由于您不再添加标识符, 必须使用类名称处理所有内容。 如果要附加的元件没有自定义类, 请使用默认情况下插入的元件名称。 这种情况下, Flash 使用元件的名称为您创建一个骨架类。 在“链接”属性中设置类名称后, 您将必须确定类名称是显式已知还是动态提供。<br/><br/>当类名称与显示已知的元件关联时, 使用以下代码方案: <br/><br/>var myInstance = new MyClassName();<br/>addChild(myInstance);注: 所有实例均使用 ActionScript 3.0 中的新关键字创建。<br/><br/>10. 动态载入元件<br/>使用新关键字非常容易, 也是一种不错的脚本约定, 但仅适用于显示知道待实例化类的名称这种情况。 在构建模板时, 我发现我在尝试实例化一个类的位置, 该类的名称通过 XML 字符串动态提供或使用某种命名约定。 在这些情况下, 我使用为动态创建元件实例发现的第二种解决方案。<br/><br/>当类的名称不是显式已知时, 使用 UILoader 类, 如以下代码所示: <br/><br/>import fl.containers.UILoader;<br/> <br/>// Attach movie<br/>var myInstance = new UILoader();<br/>myInstance.scaleContent = false;<br/>myInstance.source = &#34;myClassName&#34;;;<br/>addChild(myInstance);11. 载入 URL<br/>getURL 命令在 ActionScript 3.0 中不复存在。 要调用 URL, 需要创建一个 URLRequest 实例, 然后调用 navigateToUrl 方法。 以下 try 声明显示 ActionScript 3.0 异常处理的错误处理类型; 它显示如何调用 URL: <br/><br/>import flash.net.*;<br/> <br/>var url = &#34;&#34;;<br/>var request:URLRequest = new URLRequest(url);<br/>try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp; navigateToURL(request);<br/>}<br/>catch (e:Error) {<br/>&nbsp;&nbsp; // Handle error...<br/>}关于 ActionScript 3.0 中构建对象类的更改以下注解针对 package 关键字、数据类型设置与类型检查、关于事件处理的更改, 可保证填充事件的对象属性: <br/><br/>12. package 关键字<br/>ActionScript 3.0 类的结构与 ActionScript 2.0 类区别不大。 也许, 最大的结构区别在于使用 package 关键字启动 ActionScript 3.0 文件。<br/><br/>如果类 (myClass) 保存到名为 myCode 的文件夹中, 则类文件的结构类似于: <br/><br/>package myCode<br/>{<br/>&nbsp;&nbsp; import flash.display.MovieClip;<br/> <br/>&nbsp;&nbsp; public class myClass extends MovieClip<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function myClass(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // write out class as usual from here...<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp; }<br/>}13. 数据类型确定与类型检查<br/>ActionScript 3.0 包含一些新的运算符, 可用于数据类型确定、类型检查和类型转换。 当我使用事件或扫描画面对象以查找特定类型时, 我发现这些运算符非常有用。<br/><br/>要在编译器认为实例不是影片剪辑而将其转换为影片剪辑, 请使用 as 关键字, 如下所示: <br/><br/>(loader.content as MovieClip).play();要检查对象是否为特定类型的类, 请使用 is 关键字, 如下所示: <br/><br/>if( myInstance is myClass )<br/>{<br/>&nbsp;&nbsp; // do something...<br/>}注: is 运算符替代 ActionScript 以前版本中的 instanceof 运算符。<br/><br/>14. 关于事件处理的更改<br/>在 ActionScript 3.0 中, 事件有了新的发展。 格式对比以前的版本有很大的区别, 但语法变化很小。 在对象实例中封装事件句柄函数不再被认为是最佳实践。<br/><br/>以下代码显示如何将鼠标句柄指派给按钮: <br/><br/>import flash.events.MouseEvent;<br/>function clickHandler(event:MouseEvent):void<br/>{<br/>&nbsp;&nbsp; // Handle event here...<br/>}<br/>addEventListener(MouseEvent.CLICK, clickHandler);15. 确保事件的目标属性已填充<br/>我发现, 在 ActionScript 3.0 中创建自定义控件非常容易。 但是, 在通过自定义控件侦听事件时遇到了问题。 在开发应用程序时, 我经常在一个事件句柄函数中处理来自多个组件的事件。 我还经常将事件对象的目标属性作为一种引用方式, 向回引用播放事件的对象。 我遇到的问题起因于事件对象的目标属性作为空值到达事件句柄函数。 由于我无法向回引用原始对象, 我设置动态环境非常困难。<br/><br/>通过 Flash 用户界面组件代码适当深入挖掘后, 我发现还其他参数与 addEventListener 命令关联。 我发布了目标属性为空的原因: 事件系统在将目标引用发送到我的事件句柄时删除了此引用。 解决此问题的方法就是通过调整显示在 addEventListener 命令末尾的可选参数来更改不适当的设置组。<br/><br/>我将以下代码放入自定义按钮控件, 以确保事件的目标属性保持填充状态: <br/><br/>import flash.events.MouseEvent;<br/>function clickHandler(event:MouseEvent):void<br/>{<br/>&nbsp;&nbsp; // Do something on click...<br/>}<br/>addEventListener(MouseEvent.CLICK,clickHandler,false,0,true);请注意, 最后一个参数设置为 true。 这就是导致事件系统将引用留给事件目标的设置。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=121" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=121</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Google 与 Yahoo 即将对 Flash 提供搜索]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-07-01T16:24:48+08:00</updated>
	  <published>2008-07-01T16:24:48+08:00</published>
		  <summary type="html"><![CDATA[Adobe，Google 以及 Yahoo 即将联合对网站中的 Flash 内容提供搜索，Google 和 Yahoo 都在开发相应的 Flash 索引技术，该技术不需要网站所有者做任何额外的工作。 <br/> <br/><br/>　　以前，搜索引擎仅仅是对 Flash 站点中的静态文字和链接进行索引，无法抓取 Flash 的内容，就象阅读书的目录索引，而不是书本身。Flash 高级产品经理 Justin Everett-Church 说。现在，Google 和 Yahoo 将能对整本书进行阅读，就是说，他们将使用 Web 爬虫程序对 Flash 站点中的所有内容进行索引并输出到搜索结果，以前，因为 Flash 内容无法被搜索引擎抓取而备受 Web 设计者以及网站所有者批评。<br/><br/>　　Ogilvy 广告公司的 Bill Hunt 说，一些大公司，如珠宝商 Tiffany &amp; Co 将因此受益，Tiffany &amp; Co 拥有一个非常华丽的 Flash 购物站，到目前位置，大多数站点内容，如，产品页，对搜索引擎来说是不可视的，也不会出现在 Google 的搜索结果中。一个典型的例子是，在 Google 中搜索 &#34;Tiffany gold ring&#34;，排在前面的是 overstockjeweler.com 而不是 Tiffany 自己的网站。<br/><br/>　　对那些希望用 Flash 建设网站又不愿牺牲搜索排名的公司，这更是一个好消息，如果 Google 和 Yahoo 保守承诺，将 Flash 搜索做起来，将改观 Flash 最大的缺陷。<br/><br/>　　Everett-Church 说，Google 已经开始对他们的搜索结果进行调整，而 Yahoo 的开发稍微滞后一些。这两家公司都在认真地寻求这一目标，但 Google 在这方面又胜过 Yahoo 一筹，虽然不是很大的落后，但 Yahoo 已经没有多少地盘可以拱手相让了。<br/><br/><br/>本文国际来源：<a href="http://venturebeat.com/2008/06/30/new-deal-makes-invisible-flash-content-visible-to-search/" target="_blank" rel="external">http://venturebeat.com/2008/06/30/new-deal-makes-invisible-flash-content-visible-to-search/</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=119" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=119</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[网页文件批量上传的解決方案 ]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-04-07T11:51:19+08:00</updated>
	  <published>2008-04-07T11:51:19+08:00</published>
		  <summary type="html"><![CDATA[曾经设计和使用网页功能來上传文件的人都知道，传统的网页上传方式非常不友善！<br/>一次只能选择一个文件、上传时没有进度提示、服务器有文件限定时得上传完才知道....，真是罄竹难书。<br/>相册、博客和影音等服服务太盛行），许多的解決方案陆续推出了。包括：<br/><br/><span style="color:Orange"><strong>Windows FTP上传技术</strong></span><br/>通过FTP技术，将原本逐一上传的功能转为和系统的资源管理器（Windows平台限定）結合，让网友可以快速选取文件，然后批次上传。知名的Coppermine开源相册系统（<a href="http://oss.org.cn/modules/article/view.article.php/32/c5/" target="_blank" rel="external">http://oss.org.cn/modules/article/view.article.php/32/c5/</a>）就是采用这种解決方案。它的优点也就是缺点，因为和资源管理器结合，用户可以方便选取、上传，但相反的，在上传时的服务机制就完全失去弹性，与web结合性太差。<br/><br/><span style="color:Orange"><strong>改用桌面软件或插件方式设计</strong></span>不少大型的服务网站采用这种方式，也就是将上传功能写成一个独立的应用程序或整合到其他程序裡面。像是Google 推出的 PICASA 相册，网友除了用 PICASA 软件来管理自己的照片外，也可以直接用其中的上传功能將照片传到网络相册里。這個缺点不用说大家也知道，那就是只有他家的软件和网站能用。<br/><br/><span style="color:Orange"><strong>整合 Flash object 的上传方式</strong></span><br/>这就是我們要推荐的方式（flickr采用的方式之一）。分析要达到大量上传的目的，有二個重要因素：一是文件的选择要够方便；二是传送的状态要能即时显示。為了达到第一个要求，必須让选取文件的动作跳脫原本的浏览器规范（一次一个），所以用 Flash object 来开启文件选择提示框。其次，因为 Flash object 在上传，会依据他所传出的数据包来推算上传状況，虽然不是以主机实际收到的数据包为准，但在网络正常的情況下，二者的代表意义是相同的。<br/>因此，以Flash object上传的方式是最好的作法。因为 Flash 的普遍性高，在跨操作系统的考量下，比 Windows 上传精灵更理想；再者，Flash 上传的程序很简单、文件也很小，並不需要像设计软件一样，搞得很复杂；最后，也是最重要的，它可以让网页设计师轻松整合到自己的网站里，与网站流程完全整合在一起。<br/>基于上述的理由，我们强烈建议大家可以玩玩这个免费开源的程序。然后帮自己的网站加上批量上传的功能吧～～<br/><br/>源码下载：<a href="http://sourceforge.net/projects/jsmultiupload/" target="_blank" rel="external">http://sourceforge.net/projects/jsmultiupload/</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=114" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=114</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[flash动态载入图片，缩放后产生锯齿的平滑处理。。]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2008-01-04T16:19:39+08:00</updated>
	  <published>2008-01-04T16:19:39+08:00</published>
		  <summary type="html"><![CDATA[大家实际应用中，经常会用到动态载入图片，为了更好的显示图片，也经常要对图片做缩放操作。但在flash中，动态载入的图片，经过缩放后一般都会产生锯齿，十分难看，而flash as中又没有直接可以对图片去锯齿的参数据。所以在实际的操作中，可能要拐个弯，借助BitmapData类来平滑处理图片，下面是我随意写的对载入图片作平滑处理的一段代码：<br/><br/>先创建一个临时mc，用于载入图片。图片载入完成后，隐藏临时层并通过BitmapData重新绘制载入的图片，设置平滑参数，并对绘制的图片做缩放。。<br/><br/>import mx.utils.Delegate;//<br/>import flash.display.BitmapData;//<br/><br/>_root.cr&#101;ateEmptyMovieClip(&#34;imgMc&#34;,1);<br/>imgMc.cr&#101;ateEmptyMovieClip(&#34;temp&#34;,1);<br/><br/>var mclListener=new Object();<br/>mclListener.onLoadInit=Delegate.cr&#101;ate(this,function(target_mc){<br/>&#160;&#160;&#160;&#160;target_mc._visible=false;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;var w=target_mc._width;<br/>&#160;&#160;&#160;&#160;var h=target_mc._height;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;var bmp=new BitmapData(w,h,true,0);<br/>&#160;&#160;&#160;&#160;bmp.draw(target_mc);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;target_mc._parent.attachBitmap(bmp,2,&#34;auto&#34;,true);//设置平滑<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;target_mc._parent._width=400;<br/>&#160;&#160;&#160;&#160;target_mc._parent._height=400/w*h;<br/>});<br/>var MCL=new MovieClipLoader();<br/>MCL.addListener(mclListener);<br/>MCL.loadClip(&#34;<a href="http://www.jovey.net/blog/upload/slideshow/1.jpg" target="_blank" rel="external">http://www.jovey.net/blog/upload/slideshow/1.jpg</a>&#34;,imgMc.temp);<br/><br/>有空写个平滑处理的类，估计用起来会比较顺手些。。不知道as3里面有没有好有解决方法。。。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=108" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=108</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Delegate 类的用法]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2007-12-28T12:04:34+08:00</updated>
	  <published>2007-12-28T12:04:34+08:00</published>
		  <summary type="html"><![CDATA[之前做过的一些项目的程序中，一直会遇到类中方法的调用范围的一些问题，<br/>如以下这段代码是当flash改变大小时执行一个layOut函数：<br/>class mymovie extends MovieClip {<br/>&#160;&#160;&#160;&#160;function mymovie() {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var myListener:Object = new Object();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;myListener.onResize =function () {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;layOut();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;this1:&#34;+this);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Stage.addListener(myListener);<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;private function layOut(){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;this2:&#34;+this);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;};<br/>}<br/>trace结果：[object,object],第二个未执行。<br/>但使用时会发现，onResize函数中并不能调用layOut函数，应该它调用的是myListener范围内的layOut。所以我之前的用了一个比较傻方法，给myListener定义一个动态属性thisObj指向类mymovie。如：<br/>class mymovie extends MovieClip {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:Orange">var thisObj;</span><br/>&#160;&#160;&#160;&#160;function mymovie() {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var myListener:Object = new Object();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myListener.thisObj=this;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;myListener.onResize =function () {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:Orange">this.thisObj.layOut();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;this1:&#34;+this.thisObj);</span><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Stage.addListener(myListener);<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;private function layOut(){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;this2:&#34;+this);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;};<br/>}<br/>这样做虽然可以执行了，但是如果程序大一点，用的地方多一点，就会发现程序代码非常乱，最后还是会分不清thisObj是指向谁的。<br/>其实在早之前就知道Delegate可以解决作用范围的问题，但是旧的项目一直懒得去改，正好这段时间有新的项目，而且旧的也要改版，所以准备用Delegate类来解决。用了一下，效果还是不错的。（听说在as3里，已经不需要使用它，因为 AS3 对于函数操作会自动进行 Delegate，相当于系统或者编译器帮我们调用了Delegate）。<br/>代码如下：<br/><span style="color:Orange">import mx.utils.Delegate;</span><br/>class mymovie extends MovieClip {<br/>&#160;&#160;&#160;&#160;function mymovie() {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var myListener:Object = new Object();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:Orange">myListener.onResize =Delegate.cr&#101;ate(this,function () {</span><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;layOut();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;coverthis1:&#34;+this);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Stage.addListener(myListener);<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;private function layOut(){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;coverthis2:&#34;+this);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;};<br/>}<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=107" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=107</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[体验淘宝UED招聘［前端开发工程师］题目]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2007-09-26T18:28:09+08:00</updated>
	  <published>2007-09-26T18:28:09+08:00</published>
		  <summary type="html"><![CDATA[<span style="color:Maroon">2007-09-28补充：今天google关键字“淘宝UED”，发现这日志紧跟在淘宝UED官网后面，看来博客PR的功劳不小啊。。</span><br/>最近淘宝在蓝色上面做了招聘广告后，淘宝UED招聘网站也火了一把，我也不能免俗，上去体验了一下前端开发工程师的题目(主要是flash as)，随便写也不知道对不对，呵呵。<br/>================它的题目是这样的===============<br/>第一道：<br/>小贤是一条可爱的小狗(Dog)，它的叫声很好听(wow)，每次看到主人的时候就会乖乖叫一声(yelp)。<br/><br/>从这段描述可以得到以下对象：<br/><br/>function Dog() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.wow = function() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#39;Wow&#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.yelp = function() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.wow();<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/><br/>小芒和小贤一样，原来也是一条可爱的小狗，可是突然有一天疯了(MadDog)，一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。<br/><br/>请根据描述，按示例的形式用代码来实现（提示关键字: 继承，原型，setInterval）。<br/><br/><span style="color:Teal">我的：<br/>这题的题目一直没看懂，以两个对象，要求写类，不知道是扩展一个疯叫的方法，还是派生一个疯狗的类，或是生成一个狗的实例，让他疯叫。。<br/>Dog.prototype.MadDog=function(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;var _vid=setInterval(this,&#34;yelp&#34;,500);<br/>}</span><br/><br/>第二道：<br/>使用纯CSS实现未知尺寸的图片(高宽都小于200px)在200px的正方形容器中同时水平和垂直居中。 <br/><br/><span style="color:Teal">我的：<br/>#block{<br/>&nbsp;&nbsp;&nbsp;&nbsp; width:200px;<br/>&nbsp;&nbsp;&nbsp;&nbsp; height:200px;<br/>&nbsp;&nbsp;&nbsp;&nbsp; background-image:url(<a href="http://www.jovey.net/blog/logo_88x31.gif" target="_blank" rel="external">http://www.jovey.net/blog/logo_88x31.gif</a>);<br/>&nbsp;&nbsp;&nbsp;&nbsp; background-position:center center;<br/>&nbsp;&nbsp;&nbsp;&nbsp; background-repeat:no-repeat;<br/>}<br/>&lt;div id=&#34;block&#34;&gt;&lt;/div&gt;</span><br/><br/>第三道：<br/>请给Array本地对象增加一个原型方法，它的用途是删除数组条目中重复的条目(可能有多个)，返回值是一个仅包含被删除的重复条目的新数组。<br/><br/><span style="color:Teal">我的：<br/>Array.prototype.delMul=function(){<br/>&#160;&#160;&#160;&#160;var tempArr=new Array();<br/>&#160;&#160;&#160;&#160;var myArr=this;<br/>&#160;&#160;&#160;&#160;myArr.sort();<br/>&#160;&#160;&#160;&#160;var si=0;//start point<br/>&#160;&#160;&#160;&#160;while(si&lt;this.length){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(myArr[si]==myArr[si+1]){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tempArr.push(myArr[si+1]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;myArr.splice(si+1,1);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}else{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;si++;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;return tempArr;<br/>}<br/>var myArr=[&#34;a&#34;,&#34;b&#34;,&#34;c&#34;,&#34;d&#34;,&#34;e&#34;,&#34;a&#34;,&#34;f&#34;,&#34;g&#34;,&#34;a&#34;];<br/>trace(myArr.delMul());<br/>trace(myArr);</span>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=102" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=102</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[CSS Hack汇总快查]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2007-05-28T10:46:32+08:00</updated>
	  <published>2007-05-28T10:46:32+08:00</published>
		  <summary type="html"><![CDATA[不错的文章，在蓝色上看到的<br/>原文：<a href="http://andymao.com/andy/post/76.html" target="_blank" rel="external">http://andymao.com/andy/post/76.html</a><br/>蓝色地址：<a href="http://www.blueidea.com/tech/web/2007/4733.asp" target="_blank" rel="external">http://www.blueidea.com/tech/web/2007/4733.asp</a><br/><br/><strong>屏蔽IE浏览器（也就是IE下不显示）</strong><br/><br/>*:lang(zh) sel&#101;ct {font:12px&nbsp;&nbsp;!important;} /*FF,OP可见*/<br/>sel&#101;ct:empty {font:12px&nbsp;&nbsp;!important;} /*safari可见*/<br/>这里sel&#101;ct是选择符，根据情况更换。第二句是MAC上safari浏览器独有的。<br/><strong>仅IE7识别</strong><br/><br/>*+html&nbsp;&nbsp;{…}<br/>当面临需要只针对IE7做样式的时候就可以采用这个HACK。<br/><strong>IE6及IE6以下识别</strong><br/><br/>* html&nbsp;&nbsp;{…}<br/>这个地方要特别注意很多地主都写了是IE6的HACK其实IE5.x同样可以识别这个HACK。其它浏览器不识别。<br/>html/**/ &gt;body&nbsp;&nbsp;sel&#101;ct {……}<br/>这句与上一句的作用相同。<br/><strong>仅IE6不识别</strong><br/><br/>sel&#101;ct { display /*IE6不识别*/:none;}<br/>这里主要是通过CSS注释分开一个属性与值，流释在冒号前。<br/><strong>仅IE6与IE5不识别</strong><br/><br/>sel&#101;ct/**/ { display /*IE6,IE5不识别*/:none;}<br/>这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。<br/><strong>仅IE5不识别</strong><br/><br/>sel&#101;ct/*IE5不识别*/ { display:none;}<br/>这一句是在上一句中去掉了属性区的注释。只有IE5不识别<br/>盒模型解决方法<br/><br/>selct {width:IE5.x宽度; voice-family :&#34;\&#34;}\&#34;&#34;; voice-family:inherit; width:正确宽度;}<br/>盒模型的清除方法不是通过!important来处理的。这点要明确。<br/>清除浮动<br/><br/>sel&#101;ct:after {content:&#34;.&#34;; display:block; height:0; clear:both; visibility:hidden;}<br/>在Firefox中，当子级都为浮动时，那么父级的高度就无法完全的包住整个子级，那么这时用这个清除浮动的HACK来对父级做一次定义，那么就可以解决这个问题 。<br/><strong>截字省略号</strong><br/><br/>sel&#101;ct { -o-text-overflow:ellipsis; text-overflow:ellipsis; white-space:nowrap; overflow:hidden; }<br/>这个是在越出长度后会自行的截掉多出部分的文字，并以省略号结尾，很好的一个技术。只是目前Firefox并不支持。<br/><strong>只有Opera识别</strong><br/><br/>@media all and (min-width: 0px){ sel&#101;ct {……}&nbsp;&nbsp;}<br/>针对Opera浏览器做单独的设定。<br/>以上都是写CSS中的一些HACK，这些都是用来解决局部的兼容性问题，如果希望把兼容性的内容也分离出来，不妨试一下下面的几种过滤器。这些过滤器有的是写在CSS中通过过滤器导入特别的样式，也有的是写在HTML中的通过条件来链接或是导入需要的补丁样式。<br/><br/><strong>IE5.x的过滤器，只有IE5.x可见</strong><br/><br/><br/>@media tty {<br/>i{content:&#34;\&#34;;/*&#34; &#34;*/}} @import &#39;ie5win.css&#39;; /*&#34;;}<br/>}/* */<br/><strong>IE5/MAC的过滤器，一般用不着</strong><br/><br/>[Copy to clipboard] [ - ]CODE:<br/>/*\*//*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;@import &#34;ie5mac.css&#34;;<br/>/**/<br/><strong>IE的if条件Hack</strong><br/><br/>&lt;!--[if IE]&gt; Only IE &lt;![endif]--&gt;<br/>所有的IE可识别<br/>&lt;!--[if IE 5.0]&gt; Only IE 5.0 &lt;![endif]--&gt;<br/>只有IE5.0可以识别<br/>&lt;!--[if gt IE 5.0]&gt; Only IE 5.0+ &lt;![endif]--&gt;<br/>IE5.0包换IE5.5都可以识别<br/>&lt;!--[if lt IE 6]&gt; Only IE 6- &lt;![endif]--&gt;<br/>仅IE6可识别<br/>&lt;!--[if gte IE 6]&gt; Only IE 6/+ &lt;![endif]--&gt;<br/>IE6以及IE6以下的IE5.x都可识别<br/>&lt;!--[if lte IE 7]&gt; Only IE 7/- &lt;![endif]--&gt;<br/>仅IE7可识别<br/>以上内容可能并不全面，欢迎大家能和我一起把这些技巧都汇总起来，为以后工作的查询提供一个方便，同时在这里感谢那些研究出这些HACK的作者们。<br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=93" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=93</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[在PHP中使用正则表达式]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2006-05-22T09:55:26+08:00</updated>
	  <published>2006-05-22T09:55:26+08:00</published>
		  <summary type="html"><![CDATA[1 前言<br/>&nbsp;&nbsp;&nbsp;&nbsp;PHP被大量的应用于Web的后台CGI开发，通常是在用户数据数据之后得出某种结果，但是如果用户输入的数据不正确，就会出现问题，比如说某人的生日是&#34;2月30日&#34;！那应该怎么样来检验暑假是否正确呢？ 在PHP中加入了正则表达式的支持，让我们可以十分方便的进行数据匹配。 <br/><br/>2 什么是正则表达式：<br/>&nbsp;&nbsp;&nbsp;&nbsp;简单的说，正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹，例如：Perl或PHP脚本语言。此外，JavaScript这种客户端的脚本语言也提供了对正则表达式的支持，现在正则表达式已经成为了一个通用的概念和工具，被各类技术人员所广泛使用。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在某个Linux网站上面有这样的话：&#34;如果你问一下Linux爱好者最喜欢什么，他可能会回答正则表达式；如果你问他最害怕什么，除了繁琐的安装配置外他肯定会说正则表达式。&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;正如上面说的，正则表达式看起来非常复杂，让人害怕，大多数的PHP初学者都会跳过这里，继续下面的学习，但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能，不学实在太可惜了…… <br/><br/>3 正则表达式的基本语法：<br/>&nbsp;&nbsp;&nbsp;&nbsp;一个正则表达式，分为三个部分：分隔符，表达式和修饰符。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;分隔符可以是除了特殊字符以外的任何字符（比如&#34;/ !&#34;等等），常用的分隔符是&#34;/&#34;。表达式由一些特殊字符（特殊字符详见下面）和非特殊的字符串组成，比如&#34;[a-z0-9_-]+@[a-z0-9_-.]+&#34;可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子： <br/>/hello.+?hello/is <br/>&nbsp;&nbsp;&nbsp;&nbsp;上面的正则表达式&#34;/&#34;就是分隔符，两个&#34;/&#34;之间的就是表达式，第二个&#34;/&#34;后面的字符串&#34;is&#34;就是修饰符。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在表达式中如果含有分隔符，那么就需要使用转义符号&#34;&#34;，比如&#34;/hello.+?/hello/is&#34;。转义符号除了用于分隔符外还可以执行特殊字符，全部由字母构成的特殊字符都需要&#34;&#34;来转义，比如&#34;d&#34;代表全体数字。<br/><br/>4 正则表达式的特殊字符：<br/>&nbsp;&nbsp;&nbsp;&nbsp;正则表达式中的特殊字符分为元字符、定位字符等等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;元字符是正则表达式中一类有特殊意义的字符，用来描述其前导字符（即元字符前面的字符）在被匹配的对象中出现的方式。元字符本身是一个个单一的字符，但是不同或者相同的元字符组合起来可以构成大的元字符。 <br/>元字符： <br/>&nbsp;&nbsp;&nbsp;&nbsp;大括号：大括号用来精确指定匹配元字符出现的次数，例如&#34;/pre{1,5}/&#34;表示匹配的对象可以是&#34;pre&#34;、&#34;pree&#34;、&#34;preeeee&#34;这样在&#34;pr&#34;后面出现1个到5个&#34;e&#34;的字符串。或者&#34;/pre{,5}/&#34;代表pre出现0此到5次之间。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;加号：&#34;+&#34;字符用来匹配元字符前的字符出现一次或者多次。例如&#34;/ac+/&#34;表示被匹配的对象可以是&#34;act&#34;、&#34;account&#34;、&#34;acccc&#34;等在&#34;a&#34;后面出现一个或者多个&#34;c&#34;的字符串。&#34;+&#34;相当于&#34;{1,}&#34;。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;星号：&#34;*&#34;字符用来匹配元字符前的字符出现零次或者多次。例如&#34;/ac*/&#34;表示被匹配的对象可以是&#34;app&#34;、&#34;acp&#34;、&#34;accp&#34;等在&#34;a&#34;后面出现零个或者多个&#34;c&#34;的字符串。&#34;*&#34;相当于&#34;{0,}&#34;。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;问号：&#34;?&#34;字符用来匹配元字符前的字符出现零次或者1次。例如&#34;/ac?/&#34;表示匹配的对象可以是&#34;a&#34;、&#34;acp&#34;、&#34;acwp&#34;这样在&#34;a&#34;后面出现零个或者1个&#34;c&#34;的字符串。&#34;?&#34;在正则表达式中还有一个非常重要的作用，即&#34;贪婪模式&#34;。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 还有两个很重要的特殊字符就是&#34;[ ]&#34;。他们可以匹配&#34;[]&#34;之中出现过的字符，比如&#34;/[az]/&#34;可以匹配单个字符&#34;a&#34;或者&#34;z&#34;；如果把上面的表达式改成这样&#34;/[a-z]/&#34;，就可以匹配任何单个小写字母，比如&#34;a&#34;、&#34;b&#34;等等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;如果在&#34;[]&#34;中出现了&#34;^&#34;，代表本表达式不匹配&#34;[]&#34;内出现的字符，比如&#34;/[^a-z]/&#34;不匹配任何小写字母！并且正则表达式给出了几种&#34;[]&#34;的默认值： <br/>[:alpha:]：匹配任何字母 <br/>[:alnum:]：匹配任何字母和数字 <br/>[:digit:]：匹配任何数字 <br/>[:space:]：匹配空格符 <br/>[:upper:]：匹配任何大写字母 <br/>[:lower:]：匹配任何小写字母 <br/>[:punct:]：匹配任何标点符号 <br/>[:xdigit:]：匹配任何16进制数字 <br/><br/>另外下面这些特殊字符在转义符号&#34;&#34;转义后代表的含义如下： <br/>s：匹配单个的空格符 <br/>S：用于匹配除单个空格符之外的所有字符。 <br/>d：用于匹配从0到9的数字，相当于&#34;/[0-9]/&#34;。 <br/>w：用于匹配字母，数字或下划线字符，相当于&#34;/[a-zA-Z0-9_]/&#34;。 <br/>W：用于匹配所有与w不匹配的字符，相当于&#34;/[^a-zA-Z0-9_]/&#34;。 <br/>D：用于匹配任何非10进制的数字字符。 <br/>.：用于匹配除换行符之外的所有字符，如果经过修饰符&#34;s&#34;的修饰，&#34;.&#34;可以代表任意字符。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如&#34;/d0000/&#34;利用上面的正则表达式可以匹配万以上，十万一下的整数字符串。 <br/><br/>定位字符： <br/>&nbsp;&nbsp;&nbsp;&nbsp;定位字符是正则表达式中又一类非常重要的字符，它的主要作用是用于对字符在匹配对象中的位置进行描述。 <br/>^：表示匹配的模式出现在匹配对象的开头（和在&#34;[]&#34;里面不同） <br/>$：表示匹配的模式出现在匹配对象的末尾 <br/>空格：表示匹配的模式出现在开始和结尾的两个边界之一 <br/>&#34;/^he/&#34;：可以匹配以&#34;he&#34;字符开头的字符串，比如hello、height等等； <br/>&#34;/he$/&#34;：可以匹配以&#34;he&#34;字符结尾的字符串即she等； <br/>&#34;/ he/&#34;：空格开头，和^的作用一样，匹配以he开头的字符串； <br/>&#34;/he /&#34;：空格结束，和$的作用一样，匹配以he结尾的字符串； <br/>&#34;/^he$/&#34;：表示只和字符串&#34;he&#34;匹配。 <br/><br/>括号： <br/>&nbsp;&nbsp;&nbsp;&nbsp;正则表达式除了可以用户匹配，还可以用括号&#34;()&#34;来记录需要的信息，储存起来，给后面的表达式读取。比如： <br/>/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/ <br/>就是记录邮件地址的用户名，和邮件地址的服务器地址（形式为username@server.com之类的），在后面如果想要读取记录下来的字符串，只是需要用&#34;转义符＋记录的次序&#34;来读取。比如&#34;1&#34;就相当于第一个&#34;[a-zA-Z0-9_-]+&#34;，&#34;2&#34;相当于第二个([a-zA-Z0-9_-]+)，&#34;3&#34;就是第三个(.[a-zA-Z0-9_-])。但是在PHP中，&#34;&#34;是一个特殊的字符，需要转义，所以&#34;&#34;到了PHP的表达式中就应该写成&#34;1&#34;。 <br/>其他特殊符号： <br/>&#34;|&#34;：或符号&#34;|&#34;和PHP里面的或一样，不过是一个&#34;|&#34;，而不是PHP的两个&#34;||&#34;！意思就是可以是某个字符或者另一个字符串，比如&#34;/abcd|dcba/&#34;可能匹配&#34;abcd&#34;或者&#34;dcba&#34;。<br/><br/>5 贪婪模式：<br/>前面在元字符中提到过&#34;?&#34;还有一个重要的作用，即&#34;贪婪模式&#34;，什么是&#34;贪婪模式&#34;呢？ <br/>比如我们要匹配以字母&#34;a&#34;开头字母&#34;b&#34;结尾的字符串，但是需要匹配的字符串在&#34;a&#34;后面含有很多个&#34;b&#34;，比如&#34;a bbbbbbbbbbbbbbbbb&#34;，那正则表达式是会匹配第一个&#34;b&#34;还是最后一个&#34;b&#34;呢？如果你使用了贪婪模式，那么会匹配到最后一个&#34;b&#34;，反之只是匹配到第一个&#34;b&#34;。 <br/>使用贪婪模式的表达式如下： <br/>/a.+?b/ <br/>/a.+b/U <br/>不使用贪婪模式的如下： <br/>/a.+b/ <br/>上面使用了一个修饰符U，详见下面的部分。<br/>6 修饰符：<br/>&nbsp;&nbsp;&nbsp;&nbsp;在正则表达式里面的修饰符可以改变正则的很多特性，使得正则表达式更加适合你的需要（注意：修饰符对于大小写是敏感的，这意味着&#34;e&#34;并不等于&#34;E&#34;）。正则表达式里面的修饰符如下： <br/>i ：如果在修饰符中加上&#34;i&#34;，则正则将会取消大小写敏感性，即&#34;a&#34;和&#34;A&#34; 是一样的。 <br/>m：默认的正则开始&#34;^&#34;和结束&#34;$&#34;只是对于正则字符串如果在修饰符中加上&#34;m&#34;，那么开始和结束将会指字符串的每一行：每一行的开头就是&#34;^&#34;，结尾就是&#34;$&#34;。 <br/>s：如果在修饰符中加入&#34;s&#34;，那么默认的&#34;.&#34;代表除了换行符以外的任何字符将会变成任意字符，也就是包括换行符！ <br/>x：如果加上该修饰符，表达式中的空白字符将会被忽略，除非它已经被转义。 <br/>e：本修饰符仅仅对于replacement有用，代表在replacement中作为PHP代码。 <br/>A：如果使用这个修饰符，那么表达式必须是匹配的字符串中的开头部分。比如说&#34;/a/A&#34;匹配&#34;abcd&#34;。 <br/>E：与&#34;m&#34;相反，如果使用这个修饰符，那么&#34;$&#34;将匹配绝对字符串的结尾，而不是换行符前面，默认就打开了这个模式。 <br/>U：和问号的作用差不多，用于设置&#34;贪婪模式&#34;。<br/><br/>7 PCRE相关的正则表达式函数：<br/>PHP的Perl兼容正则表达式提供的多个函数，分为模式匹配，替换和匹配数目等等： <br/>1、preg_match ： <br/>函数格式：int preg_match(string pattern, string subject, array [matches]); <br/>这个函数会在string中使用pattern表达式来匹配，如果给定了[regs]，就会将string记录到[regs][0]中，[regs][1]代表使用括号&#34;（）&#34;记录下来的第一个字符串，[regs][2]代表记录下来的第二个字符串，以此类推。preg如果在string中找到了匹配的pattern，就会返回&#34;true&#34;，否则返回&#34;false&#34;。 <br/><br/>2、preg_replace ： <br/>函数格式：mixed preg_replace(mixed pattern, mixed replacement, mixed subject); <br/>这个函数会使用将string中符合表达式pattern的字符串全部替换为表达式replacement。如果replacement中需要包含pattern的部分字符，则可以使用&#34;()&#34;来记录，在replacement中只是需要用&#34;1&#34;来读取。 <br/><br/>3、preg_split ： <br/>函数格式：array preg_split(string pattern, string subject, int [limit]); <br/>这个函数和函数split一样，区别仅在与split可以使用简单正则表达式来分割匹配的字符串，而preg_split使用完全的Perl兼容正则表达式。第三个参数limit代表允许返回多少个符合条件的值。 <br/><br/>4、preg_grep ： <br/>函数格式：array preg_grep(string patern , array input); <br/>这个函数和preg_match功能基本上，不过preg_grep可以将给定的数组input中的所有元素匹配，返回一个新的数组。 <br/><br/>下面举一个例子，比如我们要检查Email地址的格式是否正确：<br/>&lt;?php <br/>function emailIsRight($email) { <br/>if (preg_match(&#34;^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$&#34;,$email)) { <br/>return 1; <br/>} <br/>return 0; <br/>} <br/>if(emailIsRight(&#39;y10k@963.net&#39;)) echo &#39;正确<br/>&#39;; <br/>if(!emailIsRight(&#39;y10k@fffff&#39;)) echo &#39;不正确<br/>&#39;; <br/>?&gt; <br/><br/>上面的程序会输出&#34;正确不正确&#34;。<br/><br/>8.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别： <br/>虽然叫做“Perl兼容正则表达式”，但是和Perl的正则表达式相比，PHP的还是由一些不同，比如修饰符“G”在Perl里面代表全部匹配，但是在PHP中没有加入对这个修饰符的支持。 <br/>还有就是和ereg系列函数的区别，ereg也是PHP中提供的正则表达式函数，不过和preg相比，要弱上很多。 <br/><br/>1、ereg里面是不需要也不能使用分隔符和修饰符的，所以ereg的功能比preg要弱上不少。 <br/>2、关于&#34;.&#34;：点在正则里面一般是除了换行符以外的全部字符，但是在ereg里面的&#34;.&#34;是任意字符，即包括换行符！如果在preg里面希望&#34;.&#34;能够包括换行符，可以在修饰符中加上&#34;s&#34;。 <br/>3、ereg默认使用贪婪模式，并且不能修改，这个给很多替换和匹配带来麻烦。 <br/>4、速度：这个或许是很多人关心的问题，会不会preg功能强大是以速度来换取的？不用担心，preg的速度要远远比ereg快，笔者做了一个程序测试： <br/><br/>time test: <br/><br/>&lt;?php<br/>echo &#34;Preg_replace used time:&#34;; <br/>$start = time(); <br/>for($i=1;$i&lt;=100000;$i++) { <br/>$str = &#34;ssssssssssssssssssssssssssss&#34;; <br/>preg_replace(&#34;/s/&#34;,&#34;&#34;,$str); <br/>} <br/>$ended = time()-$start; <br/>echo $ended; <br/>echo &#34; <br/>ereg_replace used time:&#34;; <br/>$start = time(); <br/>for($i=1;$i&lt;=100000;$i++) { <br/>$str = &#34;ssssssssssssssssssssssssssss&#34;; <br/>ereg_replace(&#34;s&#34;,&#34;&#34;,$str); <br/>} <br/>$ended = time()-$start; <br/>echo $ended; <br/>echo &#34; <br/>str_replace used time:&#34;; <br/>$start = time(); <br/>for($i=1;$i&lt;=100000;$i++) { <br/>$str = &#34;sssssssssssssssssssssssssssss&#34;; <br/>str_replace(&#34;s&#34;,&#34;&#34;,$str); <br/>} <br/>$ended = time()-$start; <br/>echo $ended; <br/>?&gt; <br/>结果： <br/>Preg_replace used time:5 <br/>ereg_replace used time:15 <br/>str_replace used time:2 <br/>str_replace因为不需要匹配所以速度非常快，而preg_replace的速度比ereg_replace要快上不少。 <br/><br/>9.关于PHP3.0对于preg的支持：<br/>&nbsp;&nbsp;&nbsp;&nbsp;在PHP 4.0中默认加入了preg支持，但是在3.0中确没有。如果在3.0中希望使用preg函数，必须加载php3_pcre.dll文件，只要在php.ini的extension部分设置加入&#34;extension = php3_pcre.dll&#34;然后从新启动PHP就可以了！ <br/>&nbsp;&nbsp;&nbsp;&nbsp;其实正则表达式还常用于UbbCode的实现，很多PHP论坛都使用了这个方法（比如zForum zphp.com或者vB vbullent.com），但是具体的代码比较长。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=49" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=49</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[adobe之Ajax开发（Spry framework for Ajax）.]]></title>
	  <author>
		 <name>追意</name>
		 <uri>http://www.jovey.net/blog/</uri>
		 <email>support@jovey.net</email>
	  </author>
	  <category term="" scheme="http://www.jovey.net/blog/default.asp?cateID=24" label="前端技术" /> 
	  <updated>2006-05-18T11:25:06+08:00</updated>
	  <published>2006-05-18T11:25:06+08:00</published>
		  <summary type="html"><![CDATA[现在Ajax的应用和讨论是越来越多，Ajax和Flash的比较竞争也越来越激烈，最近一直在忙Flash相册（类似FPV）的开发，今天看到了Ajax做的相册，真是大吃一惊，没想到用Ajax实现起来这么简单，效果也是这么好。我对Flash的热忠也开始了动摇。世界在变，好东西也在变啊。<span style="color:#FFFAF0">[追意布落格www.jovey.net]</span><br/><span style="color:#DC143C">现在就来看看adobe的Spry framework吧：</span><br/>点击查看Spry framework的使用Demo　<a target="_blank" href="http://www.jovey.net/blog/upload/mmajax/gallery/" rel="external">相册</a>｜<a target="_blank" href="http://www.jovey.net/blog/upload/mmajax/products" rel="external">产品表格</a>｜<a target="_blank" href="http://www.jovey.net/blog/upload/mmajax/rssreader" rel="external">RSS阅读器</a>｜&nbsp;&nbsp;<br/><a target="_blank" href="http://www.adobe.com/cfusion/entitlement/index.cfm?event=custom&amp;sku=RC00210&amp;e=labs_spry" rel="external">下载Spry Prerelease 1</a> <br/>Spry framework 是Adobe(macromedia)开发的提供给网页开发者的一个javascript库，它更方便开发者（偏于页面设计的网站开发人员）用ajax创建更富体验的用户界面。<br/>Spry framework第一版是数据性能的一个预览，开发者们使用html,css和尽少的javascript就能实现页面无刷新地把XML数据结合到HTML文档中。Spry framework是基于HTML的，开发者们只需要懂一些基本的HTML,Css和Javascript就可以很容易地执行。<br/>Spry framework项目还刚刚开始，现在发布了预览版，用户可以有大量的时间使用和测试，有问题可以反馈给项目组，估计以后的版本，功能将更加地强大，使用也将更简易方便。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jovey.net/blog/article.asp?id=48" /> 
	  <id>http://www.jovey.net/blog/default.asp?id=48</id>
  </entry>	
		
</feed>
