最近,重读了《中文的常态的变态》,余光忠先生在这篇文章里谈到了名词、连词、介词、副词、形容词、动词等西化之病,并告诫译者要知所防范,并希望能举一反三。

重读斯文,触动最大的是形容词那一节,因为该节正击中了我在翻译中的“要害”——形容词前置过多,后饰不足。余先生原文有言:

“形容词或修饰语(modifier)可以放在名词之前,谓之前饰,也可以跟在名词之后,谓之后饰。……”

“目前的白话文,不知何故,几乎一律前饰,似乎不懂后饰之道。例如……‘我见到一个长得像您兄弟的男人。’(I saw a man who looked like your brother)却很少人会说:‘我见到一个男人,长得像你兄弟。’如果句短,前饰也无所谓。如果句长,前饰就太生硬了。例如下面这句:‘我见到一个长得像你兄弟说话也有点像他的陌生男人。’就冗长得尾大不掉了。要是改为后饰,就自然得多:‘我见到一个陌生男人,长得像你兄弟,说话也有点像他。’……”

“后饰句可以一路加下去,虽长而不失自然,富于弹性。前饰句以名词压底,一长了,就显得累赘、紧张、不胜负担,所以前饰句是关闭句,后饰句是开放句。”

几句话,完全点到了我在英译汉过程中最常犯的错误。前些天还在与人讨论英文主词之后加N多从句也不显累赘,但翻译为中文却容易捉襟见肘的问题。现在看来,形容词后置,或者从句后置,不失为解决之道。

原文链接:http://dojotoolkit.org/book/dojo-1-2-release-notes

向后兼容

Dojo1.2中添加了一些新特性,也修改和废弃了一些原有特性。不过,最重要的是,Dojo1.2的主体仍然保持与Dojo1.0Dojo1.2向后兼容。对此,“迁移问题”中会详细介绍。

Core及相关的库

键盘事件

为防止将可打印字符键错误地识别为功能键(例如,在IE中,左括号与向下箭头键的keyCode相同),新增了charOrCode属性,不推荐使用keyChar

浏览器检测

消除了dojo.isIEdojo.isFFdojo.isSafari等属性“错误的”返回值。在用户代理不是指定浏览器的情况下,这些属性现在的返回值是undefined而不再是0,但在条件正确的情况仍然会返回版本号。

dojo.cldr

dojo.cldr已经从CLDR1.5.1更新为1.6。由于地区表已经更新,因此格式化字符串或使用dojo.date.localedojo.numberdojo.currency等包解析的用户字符串有可能与以前版本不一样。

djConfig.addOnLoad

通过dojo.addOnLoad添加了一个新回调函数。

djConfig.isDebug=true的情况下,try/catch行为将发生变化

以前,当Core中某些模块(XHRDeferreddojo.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

FFSafari中实现了类似IE中的获取焦点的效果(标签四周会出现带阴影的线框)。

Tree

解决了水平滚动的问题,而且为每一行都设置了white-space:nowrap,确保标签不会折行显示。

同时还修正了图标与文本垂直的对齐问题。

TimeTextBox

自动滚动

键盘支持

更佳的外观

Tooltip

缩小了箭头图标

Util

util/buildscripts

通过一个新的构建选项可以去掉构建过程中所有JavaScript文件内包含的console.*调用。

stripConsole=normal将去掉除console.warnconsole.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.addOnWindowUnloaddojo.addOnUnload的原理相同,但只基于window.onunload事件发生(即页面真正缷载)而触发。在dojo.addOnWindowUnload()回调函数中操作DOMJavaScript属性时要小心,因为页面的状态不一定可靠。

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)”什么也不做的参数。但现在,这个参数被改为了“保护DOMpreserveDom)”,是一个布尔值,表示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 Site Design(《CSS Web站点设计手册》)发布了原书勘误,今天翻译出来并补充到了“勘误页面”,供读者参考。

近来,有几位购买了我翻译的《jQuery基础教程》的读者朋友来信,询问了一些问题。本着有信必复的原则,同时也避免“重复劳动”,我把问题和答复放在这里,供广大读者朋友参考。

目前的主要问题有3个:

Q1:关于DOM文档。查看

这个问题是读者对JavaScript与DOM的关系理解不透造成的。

Q2:关于XPath选择符。查看

这个问题是因为jQuery1.2之后不再内置支持XPath选择符造成的。

Q3:jQuery版本。查看
这个问题与Q2类似,因为《jQuery基础教程》基于jQuery1.1,而很多读者下载的则是更高版本。 查看全文 »

没错,我现在又开始读这本书。虽然 《JavaScript DOM高级程序设计》的第一读者就是我,但我现在仍然要说:我要安排时间再通读它几遍!

好书啊,没办法。翻译一遍,还不够烦吗?——怎么会烦呢?尽管在翻译它时,我倾注的热情和努力已经够多,但我仍然感觉没有完全读透它!我读它读得还不够。

再读 《JavaScript DOM高级程序设计》,我体验到了什么叫享受。毫无疑问,就当前谈论和讲解JavaScript及DOM编程的技术书而言,这本书已经接近该领域的极高点了(其他几本我也知道,但在它面前只能算各有千秋吧)。读一本好书——不是入门级的书——尤其是像《JavaScript DOM高级程序设计》这样适合中高级读者的好书,读者的心态应该是与书背后的作者进行交流。在读它的过程中,跟着作者的思路去假设、去思考、去推断、去印证、去反问、去寻找答案,是之谓交流。我正是因为体验到与作者交流的愉悦,才想起来写这些文字。

事实上,老实说,我现在正抽一切可能的时间做《JavaScript DOM高级程序设计》的审校。书虽然已经出版了,但我自己深知,作为正式翻译的第5本书,我当时(2007年9~11月)的翻译水平还不够好——至少不如现在的状态;而且,对翻译技术书的认识也没有今天这么深入。现在,我已经看到第2章,也单独为它建立了勘误页面。虽然目前发现的错误很少,但却发现语言表达上犯了“的的不休”的毛病,也就是“的”字用得有点过度——这一点,请买第一次印刷的朋友们多多担待。不过,多余的“的”字,我在审校过程中都已经加了删除标记。在第二次印刷时,相信这个毛病就会得到全面、彻底纠正。

为此,我跟杨爽同学要了这本书的英文版,以便对照审校。