《Flex3实战》作者自序
2009年03月21日 好书, 翻译, 译作支持
多年来,我一直都在找寻一种方式,一种能够带给用户更好的在线体验的方式。而且,这个找寻历程从Google革命性的Google Maps站点引起轰动之前就已经开始了。我的意思是说,Web用户在很长一段时间里,都不知道还能有什么更好的在线体验。
在把Web当作文档发布系统使用的若干年里,用户体验曾一度在强大的本地桌面应用和乏善可陈的HTML应用之间摇来摆去。但是,贫乏的用户体验并没有对HTML和Web构成冲击——Web作为平台中立的文档发布系统,事实上是非常名符其实的。开发人员和公司专注于Web是因为它支持快速应用程序开发,而用户之所以接受眼前的一切则是由于——嗨!Web应用程序就是这个样子的。真的就是这个样子吗?
有件事曾令我百思不得其解。每次点击都会导致后台系统执行许多代码,而结果反映到UI上却只是一点点变化。而比这更糟的则是对数据库服务器频繁密集的访问。对一名技术人员来说,解决这个问题最简便的办法就是多加内存、使用虚拟机装载,或者少花钱多采购一些杂牌服务器,然后大功告成。但是,我更关心用户要为此付出什么代价。他们会对Web应用程序中常见的点击加等候习以为常;而且,对UI也没有多大的操作自由。不错,可以使用JavaScript;然而,这只是在掌握更高级技术之前的选择。从投入产出角度讲,这样做往往得不偿失。
这时候,Java Applet和Flash问世了,而且乍一看它们正是我要找寻的东西。实际上,Applet作为一个解决方案并不合适,它的体积太大,下载也很慢,况且不能跨平台使用。Flash挺有希望的,可是在设计师的工作环境中创建企业级应用程序,仍然不免有缘木求鱼的味道。
我在eBay的知识管理部门工作期间,也遇到了相同的问题。我需要找到一种方式,能够抽象出数据的复杂性,并且能让用户在可视的环境中方便地操作这些数据。
既而,Flex在2004年发布了(最初是V1,很快就是V1.5)。我当时有权作出采用它的决定,我们的团队也因使用它而感受到了完全不一样的体验。当时,我就知道Flex前途无量。因为Flex应用程序既具有桌面应用程序的强大特性,又能满足软件团队快速开发的需求。
作为Flex支持者,我把推动Flex社区发展当作自己的一项使命。我创建了CFLEX.Net(www.cflex.net),并坚信这个社区的规模越大,通过知识和代码共享产生的反推力也将越大,借此就可以促进这项技术的更快普及。毕竟,强有力的支持网络可以降低在组织中引入新技术的风险。
作为较早采用Flex的人,我在学习Flex的过程中走过不少弯路。主要原因是当时缺少相关书籍和参考资料。这种局面在Flex 2发布后得到了改观,大量的学习资源开始涌现。
我在2005年底离开eBay加入Amcom Computer Services,并在那里创建和管理一个开发团队。同学习任何新技术一样,要熟练掌握Flex也不容易。因此,最好的办法就是不断提升技能。在培训开发人员使用Flex的过程中,我发现市面上的某些图书常常言不及义,很多显而易见的问题都没有提到。
为了进一步推动Flex社区的发展,我决定写作本书,希望它能解决读者经常会遇到的问题。本书一反按功能特性布局谋篇的常见模式,改为按创建应用程序的自然进程组织内容。我只在必要时介绍必要的知识,不会过早地讨论复杂主题。同时,着意缩短的示例代码,也将有助于读者理解和上手。另外,我还发现把新事物与已知事物联系起来,可以增强学习效果。因此,在适当的情况下,我会尽可能拿其他技术的实现原理来进行类比。
希望读者通过阅读本书能够深入理解Flex,并最终加入到Flex社区中——因为届时你也能够向周围的人共享自己的知识和经验。
而现在,则是准备学习Flex的时候。随着社区逐步发展壮大,越来越多第三方厂商会发布与Flex有关的技术,Flex用户组也会在世界各地不断涌现。
随着其他厂商的先后跟进,RIA领域将迅速升温——Adobe再次证明自己走在了前列。我们正处于一个令人振奋的时代!以HTML为基础的Web应用程序始终会占有一席之地;然而,现在是该把你的技能提升到一个新高度的时候了。因为,这个产业的向前发展不会以个别人的意志为转移。
现在请坐下,系好安全带,旅行就要开始了!
TARIQ AHMED
作者简介:
TARIQ AHMED是一位Web应用程序的先驱人物,先后向Bell Canada和Reuters等公司引荐了下一代Web技术。他和Jon Hirschi最早将Adobe Flex引入eBay;随后又被其他项目采用。作为Adoble Flex社区专家,Tariq始终致力于推广这一技术并通过各种项目为社区提供支持。另外,Tariq因他的Community Flex (CFLEX.Net)站点而广为人知。Tariq目前是位于美国于旧金山湾区的Amcom Technology公司的产品开发经理。
JON HIRSCHI自第一个版本开始就致力于Flex的改进。作为Adobe Flex社区专家,他一直通过自己的博客、技术杂志文章和用户组共享其具有专家视角的观点。Jon不仅向eBay引荐了Flex,而且也是eBay负责管理服务器的前沿控制中心的一员。Jon目前是位于美国于旧金山湾区的Kadoink Inc.公司的技术经理。
FAISAL ABID是一名在加拿大多伦多求学的软件工程专业的学生,他拥有自己的RIA咨询公司G-uniX Technologies。他曾为很多客户撰写了RIA方案,包括基于互联网的创业型公司Buzzspot和RazorCom。Faisal的社区业绩包括在各类杂志上发表文章,他也因自己的技术经验而小有名气。
《Flex3实战》序
2009年03月20日 好书, 翻译, 译作支持
创建RIA(Rich Internet Applications,富因特网应用程序)的技术早于这个概念很久就出现了;Flash Platform是从v8开始支持RIA的。然而,Flash最初的定位只是一种发挥设计人员创意的环境,并不适合开发人员使用。
如果读者使用Flash开发应用程序,那么仍然需要跨越很大的障碍。首先,以高效快捷的方式发布囊括众多功能的富应用程序,就是一项严峻的挑战。因为,你必须亲手完成其中的绝大部分工作。
问题其实很简单:最好是有一个纯粹的开发环境,既能利用业已受到广泛支持、性能优越的Flash,又能直接满足开发人员及其系统开发的需求。为开发人员提供一个得力的工具,再配备一个能替他们完成大多数繁琐工作的框架,从而让他们把注意力集中到应用程序的逻辑上来。这个问题的解决方案就是Flex。
Adobe FlexFlex自2004年3月由Macromedia发布起,已经过了多年的发展。而且,紧随第一版之后发布的1.5版,同年就取得了更好的销售业绩。Flex最早是作为一种服务器产品开发的,广告里也把它作为在Flash Platform上创建应用程序的一种工具来宣传。
这个工具的推出开启了一个新时代,也点燃了RIA的燎原之火。随着基于Flex的RIA日益受到人们关注,事实已经证明确实存在对RIA的需求,而这种技术手段赖以发展的基础也已具备。下一步就是把RIA推向规模化。
后来,在Adobe的品牌下,这个产品以2006年6月发布的Flex 2为标志取得了巨大的飞跃。主要表现在对语言(ActionScript 3)的重新实现和对Flash Player(V9)的重要升级,极大的提升了它的性能。
而且,开发环境转换到Eclipse平台,也坚定了程序员们的信心。Flex 2关注的是基础开发与服务器端数据管理的衔接问题。我们也知道,首次以免费方式发布的用于编译Flex应用程序的SDK还处在IDE外部。最终,服务器端组件发展成了Flex Data Services,即目前的LiveCycle Data Services,该服务支持实时数据共享。
这些改变都有助于形成更明确的RIA思想,即在浏览器中提供一种桌面应用程序般的体验。而此时,RIA最需要的就是社区支持。
Tariq AhmedTariq也发现了社区支持的重要性,并走在了前列。为此,他创建了第一个专注于Flex的门户社区,即Community Flex (CFLEX.Net)。
CFLEX.Net中汇集了引导人们学习这个新框架的大量经验、技巧、博客、新闻和技术文章。Tariq是社区发展初期上述内容的主要发布者,而我就从他那里学到了很多Flex技能。
Tariq很早就认识到了数据服务及实时数据对于RIA的重要性。他构建了很多Flex应用程序,从企业内部以业务为核心的系统,到面向外部用户的各种项目。他几乎理解并使用了这个平台提供的所有特性,而这也决定了他非常适合成为一本Flex书的作者。我相信,这本由业内专家亲自捉刀撰写的书,正是读者朋友们期待已久的。
Flex 3的发布,把我们带到了这个框架和这门技术的新阶段。Adobe对Flex平台的很多组件开源,目的就是让Flex尽可能透明化,从而有利于接收来自社区的有价值的反馈(当然,也包括有价值的代码)。
随着Adobe AIR的发布,开发人员现在又可以使用Flex部署桌面和基于浏览器的应用程序了。
Adobe过去曾以其伟大的设计工具而闻名。Flex 3是允许设计人员与开发人员紧密协作的第一个工具,可以为设计出漂亮美观的Flex应用程序提供强大支持。此外,这个框架和Flex Builder中包含的大量有助于提高效率的增强,降低了新开发人员使用Flex的门槛,也有助于他们开发出容易扩展的应用程序。
无论你有什么样的开发背景,也不管你对Flex了解多少,相信本书一定会成为你的得力助手。应该说,任何人都可以从本书中学习到有用的东西。Tariq与另外两位作者Jon和Faisal,为我们奉献了一本必备的Flex佳作。别忘了,本书出自深受人们喜爱、拥有许多必知必会资源的Flex社区——CFLEX.Net的头号人物之手。
Adobe Systems, Inc. 平台推广专家
Ryan Stewart
读《中文的常态与变态》
2008年12月23日 翻译, 译作支持
最近,重读了《中文的常态的变态》,余光忠先生在这篇文章里谈到了名词、连词、介词、副词、形容词、动词等西化之病,并告诫译者要知所防范,并希望能举一反三。
重读斯文,触动最大的是形容词那一节,因为该节正击中了我在翻译中的“要害”——形容词前置过多,后饰不足。余先生原文有言:
“形容词或修饰语(modifier)可以放在名词之前,谓之前饰,也可以跟在名词之后,谓之后饰。……”
“目前的白话文,不知何故,几乎一律前饰,似乎不懂后饰之道。例如……‘我见到一个长得像您兄弟的男人。’(I saw a man who looked like your brother)却很少人会说:‘我见到一个男人,长得像你兄弟。’如果句短,前饰也无所谓。如果句长,前饰就太生硬了。例如下面这句:‘我见到一个长得像你兄弟说话也有点像他的陌生男人。’就冗长得尾大不掉了。要是改为后饰,就自然得多:‘我见到一个陌生男人,长得像你兄弟,说话也有点像他。’……”
“后饰句可以一路加下去,虽长而不失自然,富于弹性。前饰句以名词压底,一长了,就显得累赘、紧张、不胜负担,所以前饰句是关闭句,后饰句是开放句。”
几句话,完全点到了我在英译汉过程中最常犯的错误。前些天还在与人讨论英文主词之后加N多从句也不显累赘,但翻译为中文却容易捉襟见肘的问题。现在看来,形容词后置,或者从句后置,不失为解决之道。
Dojo 1.2 发版说明
2008年12月18日 翻译, 译作支持
原文链接:http://dojotoolkit.org/book/dojo-1-2-release-notes
向后兼容
Dojo1.2中添加了一些新特性,也修改和废弃了一些原有特性。不过,最重要的是,Dojo1.2的主体仍然保持与Dojo1.0和Dojo1.2向后兼容。对此,“迁移问题”中会详细介绍。
Core及相关的库
键盘事件
为防止将可打印字符键错误地识别为功能键(例如,在IE中,左括号与向下箭头键的keyCode相同),新增了charOrCode属性,不推荐使用keyChar。
浏览器检测
消除了dojo.isIE、dojo.isFF、dojo.isSafari等属性“错误的”返回值。在用户代理不是指定浏览器的情况下,这些属性现在的返回值是undefined而不再是0,但在条件正确的情况仍然会返回版本号。
dojo.cldr
dojo.cldr已经从CLDR1.5.1更新为1.6。由于地区表已经更新,因此格式化字符串或使用dojo.date.locale、dojo.number、dojo.currency等包解析的用户字符串有可能与以前版本不一样。
djConfig.addOnLoad
通过dojo.addOnLoad添加了一个新回调函数。
在djConfig.isDebug=true的情况下,try/catch行为将发生变化
以前,当Core中某些模块(XHR、Deferred、dojo.addOnLoad回调代码)发生的错误被捕获后,要么通过控制台进行报告,要么另行抛出,导致难以追踪错误的起因。虽然这样有利于代码稳定,但从开发角度看,却不利于发现错误。现在,相关模块会让最初的异常向上冒泡,并在djConfig.isDebug设置为true的情况下停止JavaScript的执行。如果diConfig.isDebug被设置为false(或undefined),则使用try/catch结构并通过控制台记录错误。
dojo.fx.easing
以前的dojo.fx.easing已经被提升到Core中,并可以通过dojo.require(“dojo.fx.easing”)加载。
dojo.html.set()
新增特性,用于在ContentPane外部使用类似ContentPane的功能。
Dijit方面的增强
易用性及观感的增强
在Dojo1.2中,Dijit的外观和易用性获得了较大增强。
_Widget.attributeMap
现在,attributeMap也可以处理innerHTML和类名了。可以把attributeMap的作用想象成绑定部件属性与DOM节点。
_Widget.placeAt
placeAt()是一个新的domNode操作方法,用于简化对部件的domNode的连缀和放置操作(或通过addChild()将部件的domNode添加到其他部件中)。
动画
加快了部件中默认的动画执行时间。现在,可以通过dojo.config.defaultDuration控制动画了。
BorderContainer
修正了窗格布局中缺失边框或出现双边框的问题。通过新的参数gutters=true/false(默认为true)可以为所有窗格添加“外边距”(包括不可调整大小的窗格),从而使窗格与窗格、窗格与BorderContainer之间保持一定距离。
Button
修正了垂直对齐及各种显示问题。
CheckBox
突出显示搜索结果。
FilteringSelect
不必为了让用户能清除下拉列表中的值而放入空值了,用户现在可以使用退格或删除键清除该值。
突出显示搜索结果。
表单验证
增强后的表单部件不会再因为用户输入的值不完整而变黄了。但是,如果用户输入的值无效(哪怕再继续输入更多字符也仍然无效),仍然会变黄……这样用户就不会再感到它们“慌报军情”了。
另外,还为dijit.form.Form部件新增了onValidStateChange连接点,以便能够创建像禁用提交按钮(在表单无效时)之类的行为。
Menu
新增了CheckableMenuItem类。使用这个类,用户在选择菜单项时会伴随一个对勾图标出现或消息(有点类似切换按钮)。
RadioButton
在FF和Safari中实现了类似IE中的获取焦点的效果(标签四周会出现带阴影的线框)。
Tree
解决了水平滚动的问题,而且为每一行都设置了white-space:nowrap,确保标签不会折行显示。
同时还修正了图标与文本垂直的对齐问题。
TimeTextBox
自动滚动
键盘支持
更佳的外观
Tooltip
缩小了箭头图标
Util
util/buildscripts
通过一个新的构建选项可以去掉构建过程中所有JavaScript文件内包含的console.*调用。
stripConsole=normal将去掉除console.warn和console.error之外的所有console.*调用
stripConsole=all将去掉所有console.*调用
警告:如果在使用这个选项时导致了OutOfMemoryError,请参考http://trac.dojotoolkit.org/ticket/7698。
DOH:单元测试框架
新增了一个doh.robot包,以方便为DnD和部件等视觉组件编写单元测试。
在dijit/tests/form/robot中也可以找到一些类似的测试。
迁移问题
在从Dojo1.1迁移到Dojo1.2时,需要对已有应用程序作如下更新:
下载文件或执行JavaScript的链接(dojo.addOnUnload()与dojo.addOnWindowUnload())
通过dojo.addOnUnload()注册的回调函数以前不能在IE中被触发。现在这个问题虽然已经修正,但是也出现了一个问题。用户在单击下载文件或执行JavaScript代码(即href属性值为javascript:开头)的链接时,会触发window.onbeforeunload事件,而该事件又会触发dojo.addOnUnload回调函数。但是,上述链接通常不会影响页面。因此,如果要在dojo.addOnUnload()中执行破坏性操作,请务必格外小心。
如果需要清理循环引用以避免内存泄漏(除了有用的Dojo代码外),那么可以使用Dojo1.2中新增的dojo.addOnWindowUnload方法,该方法基于window.onunload触发回调函数。dojo.addOnWindowUnload与dojo.addOnUnload的原理相同,但只基于window.onunload事件发生(即页面真正缷载)而触发。在dojo.addOnWindowUnload()回调函数中操作DOM和JavaScript属性时要小心,因为页面的状态不一定可靠。
Editor
出于安全原因,不推荐使用TEXTAREA;而使用DIV。
Widget.arrt()
Widget.arrt()是用于设置/取得所有部件属性的标准接口。旧方法setValue()、setAttribute()和setTitle()仍然存在,但已经不推荐使用。基本上,Widget.attr()与dojo.attr()相似,详细内容请参考http://blog.dojotoolkit.org/2008/08/19/widget-attr。
dijit._Widget.destroy()
对_Widget的.destroy()方法从技术上作了修改。以前,这个方法有一个“已定案的(finalize)”什么也不做的参数。但现在,这个参数被改为了“保护DOM(preserveDom)”,是一个布尔值,表示destory()是否删除与_Widget(this.domNode)关联的domNode。传入“true”,则保留DOM。
dojo.isGears转移到dojo.gears.available
检测Gears的特性转移到了dojo.gears模块中。要检测Gears是否已经安装,首先执行dojo.require(“dojo.gears”),然后根据dojo.gears.available返回的布尔值确定。
在调用dojo.xhr时,不再推荐使用handleAs: “json-comment-filtered”
如果再使用handleAs: “json-comment-filtered”,会在控制台中看到一条警告消息。
要取消该警告,可以将djConfig.useCommentedJson设置为true。
同时,这也意味着删除了djConfig.usePlainJson标签,因为普通的JSON是优先考虑的,目前使用普通的JSON不会产生警告。
dijit.layout.BorderContainer在所有窗格四周添加了外边距
新参数“gutters”的默认值为true,因此会在所有窗格周围添加“外边距”(即使是大小不可调整的窗格),从而使窗格与窗格、窗格与BorderContainer之间保持一定距离。
《CSS Web站点设计手册》原书勘误
2008年08月25日 译作支持
CSS Web Site Design(《CSS Web站点设计手册》)发布了原书勘误,今天翻译出来并补充到了“勘误页面”,供读者参考。




为之漫笔(李松峰),本博客专注于Web前后端技术、移动平台开发技术、交互设计和技术翻译。声明一下,因为时常需要外出审稿,而且基本不带笔记本,所以有时可能会迟一点回复大家的留言。