Learning jQuery要出新版了
2008年12月31日 好书
前几天刚看到jQuery1.3.1b征求测试的消息,今天就收到Packt的NewsLetter,预告Learning jQuery的新版Learning jQuery 1.3将在2009年5月出版。作者仍然是Karl Swedberg和 Jonathan Chaffer。
顺便提一下,Learning jQuery作为“全球第一部jQuery著作”(责任编辑杨爽同学的手笔——没错,是全球第一本),其中文版《jQuery基础教程》(人民邮件出版社200807,图灵程序设计丛书),得到了广大读者的认可。第一次印刷的4000千册已经告罄,现在销售的应该是第二次印刷的了。因此,该书也荣登“图灵2008年度十大总排榜”(“十大总”啥意思?回头得问问刘江老师)。
《jQuery基础教程》这本书卖得不错,倒不是因为本人的翻译有多好,主要还是出版社有眼光,引进了全球第一本jQuery专著(第二本jQuery in Action也是图灵引进的,估计2009年第一季度能上市)。而且,根据本人的观察,jQuery在国内应该是最受欢迎的JavaScript框架,无论是在Web专业开发人员,还是在普通的Web开发爱好者中,jQuery的口碑都是最棒的!(插播一条广告:jQuery以简单易用著称,不信请试试。)另外,2008年9月微软和诺基亚都宣布将在自己的平台中集成jQuery,无疑又为更多人转向学习jQuery起到了巨大的推动作用。
短路逻辑与条件运算符
2008年12月30日 编程技术
逻辑运算符包括逻辑与、逻辑或、逻辑非,英文分别对应:(logical)and、or、not。由于逻辑运算返回的是布尔值true(真)或false(假),因此逻辑运算符也叫布尔运算符。(英文operator在程序设计的语境下有两种译为:运算符、操作符。)
Python中的逻辑运算符有一个非常有意思的特性——“短路”,即不做无用功、选择最短路线。具体来说,逻辑运算中的短路表现在逻辑运算符只对有必要求值的表达式求值。例如,表达式x and y(x和y都有可能是表达式),只在x和y同时为真的情况下才会返回True。显然,如果x为假,那么就没有再对y求值的必要了——即使y为真,整个表达式仍然会返回False。因此,and运算符的行为就是:如果x为假,返回x;否则,返回y。
and运算符的这种行为就叫“短路逻辑”(或者懒惰求值)。可见,逻辑运算符的右运算数(如这里的y)有可能不会被求值——原因就是“短路”。
同样,or运算符也有短路行为。例如,对于表达式x or y,如果x是真,则返回x;否则,返回y。
设计短路逻辑有目的何在呢?主要是为了减少不必要的计算。但是,在短路逻辑的基础上,还可以实现一些巧妙的结构。例如:
name = raw_input('Enter name:') or '<unknow>'
这个赋值语句就利用逻辑运算符or实现了在用户输入为空的情况下为name设置默认值的操作。另外,利用短路逻辑还可以实现另一种运算符,即条件运算符,或者叫三元运算符:
b if a else c # 如果a为真,则返回b;否则,返回c
短路逻辑与条件运算符同样也存在于JavaScript中。即,x && y的行为是:如果x可以转换false,则返回x;否则,计算并返回y的值。x || y的行为是:如果x可以转换为true,则返回x;否则,计算并返回y的值。显示,如果&&、||运算符分别在x可转换为false、true的情况下,会执行短路操作——忽略右运算数y。
而利用or运算符的短路行为,JavaScript也实现了为变量赋默认值:
//如果name可以转换为false,则不能短路,必须对右运算符求值,从而实现赋默认值 var name = name || 'unprovided';
以及另一种表现形式的条件表达式——?::
x > 0 ? x * y : -x * y
SitePoint近访John Resig
2008年12月28日 Web开发, 翻译
SitePoint的Ara Pehlivanina最近采访了John Resig。谈了JavaScript库、John Resig得意的几个项目、那本JavaScript高手期待已久但却一再推迟的Secrets of the JavaScript Ninja,还谈了Resig的个人生活。
SP:作为jQuery的创建者,你如何看待JavaScript库之间的竞争,以及它们将来的发展?
Resig:JavaScript都要经历几个循环(从某角度上讲,类似浏览器)。首先是一段时间的竞争,然后是相互合作,最后就是同质化。例如,目前所有库均已实现的CSS选择符引擎,最初竞争的焦点是引擎性能;人们以最有效方式反复实现同一特性,造就了不同实现性能上的差异。然后,不同的库开始合作,就共同支持的选择符集合达成一致,同时也共享提升性能的技术。结果,我们就看到了同质化的代码基——形成一个统一的后台(如Sizzle)。对于库中都存在的其他特性,肯定也要经历类似的循环。
库的最大好处表现在两方面:一是应该帮助用户处理浏览器问题,二是应该为用户提供能够简化开发的API。成功的库必须同时做到这两点。不过,也应该知道,寻求一种统一的库不太可能。毕竟,库与库间的差别主要体现在API,以及如何解决浏览器问题上。让所有库都提供平淡、通用的API,只会导致用户对其反复修补(Turning it into a bland, generic API will only result in a device that users will have to paper over again and again.)。
SP:Sizzle是什么?
Resig:Sizzle是一个新的纯JavaScript写成的CSS选择符引擎。Sizzle是这个引擎的代号,它最终会成为jQuery的新引擎。我希望能有一个高效(至少与其他竞争性引擎相比)、纤小(较小的文件)、容易扩展并且没有依赖性的引擎。
实现这样一个引擎的必要性在于,它很可能被其他一些主要的库采用。我已经跟MochiKit、Prototype、Dojo和TinyMCE团队谈过了,他们都表示对Sizzle的代码基很感兴趣。如果能统一JavaScript中CSS选择符的使用就再好不过了。 查看全文 »
Tags: HTML/XHTML, JavaScript
JavaScript中的Function(函数)对象
2008年12月26日 编程技术
JavaScript中的Function对象是函数,函数的用途分为3类:
- 作为普通逻辑代码容器;
- 作为对象方法;
- 作为构造函数。
1.作为普通逻辑代码容器
function multiply(x, y){
return x*y;
}
函数multiply封装了两位数的乘法运算公式:
var product = multiply(128,128); // product = 16384
创建函数实例的方式有3种。第一种是声明式,即像声明变量一样,将通过function(){}标识符创建的匿名函数直接赋值给变量,以该变量作为调用时的函数名称:
var multiply = function(x, y){
return x*y;
}
第二种是定义式,即以function关键字后跟函数名称及(){}来直接定义命名函数,前面第一个multiply函数就是通过定义式创建的。
第三种是构造函数式,即通过new运算符调用构造函数Function来创建函数。这种方式极不常用,因此就不作介绍了。 查看全文 »
浅复制与深复制中的传值与传址
2008年12月24日 编程技术
这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。
一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,栈内存和堆内存分别用于保存不可变类型值和可变类型值。
什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:
var stringValue = "I'm immutable data structure, mean you can't modify me!"; var anotherStringValue = stringValue; stringValue = "I have changed";
此时,anotherStringValue中保存的值会不会也变成“I have changed”?不会。因为
var anotherStringValue = stringValue;
照stringValue中保存的字符串的原样,复制一个字符串(相应地,在内存中分配一块新空间),并将该字符串赋给anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即
stringValue = "I have changed";
只会影响stringValue的值。但是,确切来讲,stringValue = “I have changed”;并不是修改stringValue,而是创建了一个新字符串(相应地,在内存中分配一块新空间),然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了(当然,垃圾所占用的内存会被回收)。 查看全文 »
Deamweaver CS4怎样支持不唐突的JavaScript
2008年12月24日 翻译
提起Deamweaver和JavaScript,就会让人情不自禁地想起MM_swapImage——早期在Deamweaver中实现鼠标翻转图(swapImage)的“经典”JavaScript函数名。而且,在Deamweaver创建的网页中,到处可见各种类似的JavaScript函数。
不过,Deamweaver也在不断进化。Adobe显然不想反对不唐突的JavaScript。Deamweaver CS4已经支持这种现代的JavaScript编程理念,它的改进围绕将JavaScript代码外部化(external)展开。
首先,Deamweaver CS4在每个HTML文件相关工具条中,会为引用的每个外部文件(包括JavaScript、CSS及第三方域文件)添加一个按钮。点击按钮即可编辑相应外部文件(当然,第三方域中的文件无法编辑)。
其次,在“实时视图”(Live View)中,Deamweaver CS4嵌入了Webkit——Safari和Chrome浏览器的引擎——窗口,通过点击上述按钮,即可切换到相应外部文件,不会打断当前的“实时视图”。打开外部文件后,用户所做修改也会立即呈现在“实时视图”中,不必先保存JavaScript文件。
再次,“实时视图”包含“实时代码”模式,在这种模式下查看HTML代码,能看到“经过计算的源代码”。换句话说,“实时代码”模式显示的是当前页面的DOM结构。用户在“实时视图”中与页面交互导致的DOM变化,都会反映在“实时代码”中。有点类似Firebug啊。此外,在“实时代码”模式下,还可以“冻结”JavaScript,以便检查当前状态下的DOM层次。
Deamweaver CS4提供的JavaScript编辑器具有语法检查和代码提示功能。语法检查会在用户输入代码的同时提供即时反馈,告知用户可能存在的语法问题。代码提示可以根据页面引用中的所有JavaScript文件,向用户提示相关函数和对象;这意味着,代码提示适用于所有JavaScript库。不过,代码提示不适用于远程文件,如果要使用代码提示,必须将文件保存在本地。
最后,Deamweaver CS4还新增了一个“外部化JavaScript”(Externalize JavaScript)命令。这个命令可以把嵌入script标签中的代码,转移到外部JavaScript文件中,然后再为HTML文件添加一个新script标签(以引用新外部文件)。此外,这个命令还支持清理嵌入的JavaScript处理程序,例如onclick属性。不过,生成的不唐突版本有赖于Adobe自己的Spry JavaScript框架。虽然没有为使用别家框架提供选择,但也体现了Deamweaver CS4在支持不唐突JavaScript方面所作的努力。
jQuery1.3.1b征求测试,预计3岁生日时发布
2008年12月23日 Web开发, 翻译
jQuery团队经过艰苦努力,已经为测试jQuery库的新版本作好准备。在jQuery1.3正式供开发使用之前,还需要大家帮忙揪出隐藏的任何bug。
jQuery1.31b的下载地址为:http://code.jquery.com/jquery-1.3b1.js
注意,不要使用缩减或压缩版,因为这两种版本不容易定位错误。
主要变化:
以下是jQuery1.3的主要变化,这些变化可能会导致原有代码出现问题:
- 选择符引擎:虽然有关选择符的代码已经全部重写,但考虑不周的地方在所难免。
- DOM操作(append/prepend/before/after):大部分代码也都重写了,包括一些执行嵌入script元素的逻辑。
- .offset():另一个经过重写的方法。
- 事件触发:事件被触发后会沿DOM向上冒泡——而这可能带来问题。
以上没有包含jQuery1.3的全部变化,感谢各位能将发现的任何问题反馈回来(计划在2009年1月14日——那是jQuery库3岁生日)。
提交反馈的方式如下:
- 在jQuery bug跟踪系统中提交bug(需要注册一个账号)。
- 请在提交的bug中附上简单的测试用例(或者提供测试用例的链接)。
- 注明您测试的是“jQuery1.31b”(以防与其他版本混淆)。
- 将测试用例的链接和bug报告通过电子邮件发送到jQuery Dev列表,以便开发团队注意到您反馈的问题。
提前感谢各位的帮助。对这个新版本,我们恨不得马上就把它交到大家手中。
John Resig : http://blog.jquery.com/2008/12/22/help-test-jquery-13-beta-1/
读《中文的常态与变态》
2008年12月23日 翻译, 译作支持
最近,重读了《中文的常态的变态》,余光忠先生在这篇文章里谈到了名词、连词、介词、副词、形容词、动词等西化之病,并告诫译者要知所防范,并希望能举一反三。
重读斯文,触动最大的是形容词那一节,因为该节正击中了我在翻译中的“要害”——形容词前置过多,后饰不足。余先生原文有言:
“形容词或修饰语(modifier)可以放在名词之前,谓之前饰,也可以跟在名词之后,谓之后饰。……”
“目前的白话文,不知何故,几乎一律前饰,似乎不懂后饰之道。例如……‘我见到一个长得像您兄弟的男人。’(I saw a man who looked like your brother)却很少人会说:‘我见到一个男人,长得像你兄弟。’如果句短,前饰也无所谓。如果句长,前饰就太生硬了。例如下面这句:‘我见到一个长得像你兄弟说话也有点像他的陌生男人。’就冗长得尾大不掉了。要是改为后饰,就自然得多:‘我见到一个陌生男人,长得像你兄弟,说话也有点像他。’……”
“后饰句可以一路加下去,虽长而不失自然,富于弹性。前饰句以名词压底,一长了,就显得累赘、紧张、不胜负担,所以前饰句是关闭句,后饰句是开放句。”
几句话,完全点到了我在英译汉过程中最常犯的错误。前些天还在与人讨论英文主词之后加N多从句也不显累赘,但翻译为中文却容易捉襟见肘的问题。现在看来,形容词后置,或者从句后置,不失为解决之道。
《Dojo权威指南》译者序
2008年12月19日 好书
Dojo: The Definitive Guide Powering Up Ajax Development Techniques 已经在本月16日交稿了。期待早日出版啊。
平心而论,与现有的JavaScript库或框架相比,Dojo的确很值得O’Reilly为它自己出一本权威指南。
从译者的Web开发经验来看,在使用JavaScript语言创建跨平台、跨浏览器的RWA(Rich Web Applications,富Web应用程序)项目时,选择Dojo作为前端开发框架基本上可以做到别无所求。因为,对于通常的JavaScript库和框架所能解决的问题——DOM操作、事件处理、样式修改、外部通信的标准化,Dojo的Base和Core同样也给出了全套解决方案。
当然,就Dojo工具箱的库和框架部分而言,数据抽象和模拟类与继承是另外两个主要的亮点。
除了对开发RIA项目的底层逻辑提供强大支持外, Dijit专门针对设计人员给出大量即装即用的“部件”。部件就是HTML、JavaScript、CSS和其他相关资源(如图片)的集合,也是一个Function对象。基于Dojo部件的用户界面还支持换肤功能。
Util是Dojo独有的,其中包含构建工具、单元测试框架和压缩工具。为优化、测试产品和提高RIA项目的性能提供了有效支持。
在翻译本书的过程中,为确保技术细节的准确,译者参考了Mastering Dojo(The Pragmatic Bookshelf)一书。而且,全书的术语基本上做到了前后统一。需要说明的是,书中将dojo命名空间之下的所有函数(function)统一译为方法。虽然翻译为函数也未尝不可,但译者在此有两点考虑:首先,从面向对象的角度讲,通过对象访问的函数应该叫方法;其次,Dojo跟其他的库和框架一样,都非常强调命名空间,翻译为方法有助于读者进一步明确这一思想。另外,书中在谈及易访问性(Accessibility)时,多次提到了“退化能力”。对此存疑的读者,可以参考译者网站中的相关讨论和介绍。
从翻译一本书的角度讲,序和前言部分一般是最难翻译的。用出版社编辑的话来说,这些部分往往也是重灾区、地雷阵。译者在翻译Dojo之父Alex Russell为此书作的序时,得到了李锟、郭晓刚、米全喜、贺师俊的帮助,特别是米全喜抽时间审阅了全篇译文,提出了9处问题。在此一并致谢!当然,还要感谢陈冀康编辑给了译者翻译本书的机会,感谢责任编辑(暂时不知名,请编辑老师自己补上)为编辑此书付出的精力和时间。
欢迎读者朋友登录译者网站或通过邮件(为防垃圾,见书)反馈本书翻译中存在的问题,或者提供勘误信息。
另,在本书中文版交稿时,Dojo1.2已经发布。译者翻译了“Dojo1.2发版说明”,有需要的读者可以参考。
译者2008年12月18日于北京昌平名佳花园



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