实在忍不住要写点什么了。我被这两个 JavaScript 搞死了。它们都让我又爱又恨。
Prototype.js 出来得早,随着 Rails 的开发而逐渐扩大影响力,成为 Rails 框架下御用 JS 框架。所以秉承了 Ruby 语言的一系列概念,非常清晰地用组织良好的类,对象扩展的方式,增加了各种常用的 handy 函数或者方法。所以叫做原型么。学习曲线低,顺手拈来。
不过这种循规蹈矩的做法很快让书写它们的人感到厌倦。很多操作都要加上类名,繁复、生硬、罗嗦。于是 jQuery.js 得以进化为,用最自然的,类似伪代码的形式,完成相同的功能,并具有更好的可读性。比如:
$(".rborder").corner("5px").parent().css('padding', '1px').corner("round 5px");
一气呵成,痛快极了。想象不出还有什么写法可以比这个更简洁达意。而 jQuery 的哲学就是:写最少的代码,做最多的事情。
而这种写法,像极了 shell 下面使用管道符串联起来的一系列命令,简单、优雅、强大、灵活。喜欢用 Perl 写代码的一个原因,也是因为其中的 map 和 grep 组合所构造出来的类似效果,清晰、流畅、自然。所以 jQuery 是很讨开发者的欢心的,用起来舒服。
用起来舒服,这件事本身没什么伟大的,可一舒服,写程序的人就兴奋起来了,就会很高兴地去发明些什么,这种内在激发的驱动力一爆发,就造成了现在 jQuery 插件遍天下的格局。这和 Rails 本身敏捷而富有艺术性的气质所带来的全球影响力的爆发是一致的。
不过这带来了一个问题。插件满天飞,怎么保证质量和兼容?自由带来的多样性是件好事,太多了就分不清楚谁是谁了。虽然 jQuery 提供了统一的 svn 仓库,不过各式的插件的文档,测试,演示等等,各自为政,颇为凌乱。或许需要一个类似 CPAN 一样的统一管理介质?
jQuery 对 DOM 对象的操作很容易--主要是很舒服,可要处理数据的时候,就不那么舒服了。我总是对 prototype.js 中的 inspect(), join() 念念不忘,可 jQuery 没有,好不容易看到一个 Array 的插件,提供的功能也是捉襟见肘。所以我目前的结论是,对页面元素的控制上,用 jQuery,对数据的处理上,用 Prototype.js 。
还好,jQuery 只是在自己的命名空间里面东奔西跑,按照标准的方式,两者可以共存。不过 jQuery 为了 write less,默认情况下,将自己的类捆绑到 $ 函数上,于是,这一强大的内激效应让一些插件的作者忘掉了这只是一个快捷方式,只要在插件内部也使用这种写法,就会和 prototype 冲突。比如说:ThickBox 3.1。
开会去了…
Published on August 14, 2007 4:40 pm.
Filed under: 东拉西扯 Tags: bash, cpan, dom, javascript, jquery, perl, prototype, rails, ruby, thickbox
- 前天买了本《Ruby Programming》,正儿八经开始学习 Ruby 了。
- 这两天在上班路上看,看完了前五章。
- 突然发现 prototype.js 像极了 Ruby 的一些写法。each, succ, inject 等等。包括从 Enumerable 类 Mixin 过来的 Array 也是如此。
- 万物归一的感觉, 美伦美奂。
Published on July 25, 2007 3:18 pm.
Filed under: 东拉西扯 Tags: javascript, mixin, prototype, ruby
为了提取垃圾邮件中的中文字串,并自动转化为正则表达式需要的形式,我写了一个 Web 应用程序。只要鼠标选中字串,然后按下某个键,即可通过 Ajax 提交到后端转化和测试。自然我用的是 Catalyst 和 prototype.js。
原本我设定的是 Insert 键关联提交操作。而现在,我需要在提交的同时指定被选字串的类型,比如说邮件地址用 e 键,或者手机号码用 m 键,等等。这在当时开发的时候就发现, FireFox 下, prototype.js 只能返回功能键的 KeyCode,如果是字母,则一律是 0。我自然是不愿意因此屈就去用 IE 的,更何况我现在 Ubuntu 下面也没有 IE。而我有不想用 Mochikit,虽然实验过它没问题。我怀疑是 prototype.js 的问题,不过本着 Agile 开发的精神,没有深究下去。
这次,我决定解决这个问题。当然还是看了番源代码,做了些测试,未果。于是 Google,仔细找了下,发现枫岩的这篇文章,点醒我梦中人。简单的说,在 FireFox 中,KeyCode 返回 0 就用 charCode。于是我猜想 Mochikit 也是这样实现的:在 Signal.js 里第 135 行起定义的 key 函数非但给出了健壮的封装,还有一堆注解。
Published on March 12, 2007 2:39 pm.
Filed under: 东拉西扯 Tags: ajax, catalyst, charcode, firefox, javascript, keycode, mochikit, prototype, xp
这两天在做公司的项目,为了更好的用户体验,我在界面上做足了功夫,当然也离不开 Javascript。
以前用 prototype.js 的时候,只是参照 HTML::Prototype 中的文档,照葫芦画瓢,未得深意。后来从 fayland 的共享连接中看到了 prototype.js 的非官方版本的中文翻译,大致看了下,才知道自己错过了很多东西。
于是打印出来,在回家的路上通读了一遍,小有收获。起码我知道可以用 $() 和 $F() 这两个简单的写法,再也不用满页面写 document.getELementById() 了,虽然我已经写起来非常熟练。此外,我经常做的一件事情 — 显示或者隐藏某个 id 的元素 — 再也不用直接设定 style.display = ‘inline’ 什么的,直接用它提供的 Element 类的 show, hide, toggle 方法即可。Javascript 其实远比以前我所认识的要丰富,除了像以前那样构造一些 function 之外,我还可以轻松的构造一个对象来做一些事情。虽然 JS 没有像 Perl 一样的 Hash 数据结构可以直接调用,不过可以用 Object 来代替。
prototype.js 被提到的时候,通常作为 Ajax 技术而被谈论。在看过这篇文章之后,你就该了解,prototype 叫做原型的道理,就说明了它是构建于 Ajax 这种技术之上的,Ajax 只不过是它默认提供的原型之一。prototype.js 的目的是要简化人们的日常工作,提供更为快捷有效的方法来让人们直接在业务层上考虑问题。同时作为对现有的 Javascript 以及对 DOM 操作的扩展,提供了更强有力的后援。所以在我看来,Prototype.js 好比是 Perl 里面的 Module。那么是不是我将来的关于 Javascript 的操作也可以自己扩展出一套 module 来简化我自己的工作呢?当然可以!Rico (rico.js) 什么的就是在它的基础上继续扩展衍生的产物。看看 prototype.js 的源代码吧,并非讳莫如深,仔细研读之下,甚至你可以自己动手修改扩展它的功能。
在自己的项目中,当文本输入框中的输入变化的时候,我希望在展示区域动态的现实当前的内容。而当用户按下 Enter 键(包括 Table 键)的时候,我希望能够对输入内容作出检查并跳转到下一个 card (并非 form 的 submit)。前面的好办,在 input 标签后面写上 onkeyup=”apply();” 即可,可 Enter/Table 怎么处理呢?嗬嗬,合起来,自己写个 Watcher 类:
Watcher = Class.create();
Watcher.prototype = {
initialize: function(element, apply_func ) {
this.element = $(element);
this.apply_func = apply_func;
this.eventKeypress = this.keyPress.bindAsEventListener(this);
this.eventKeydown = this.keydown.bindAsEventListener(this);
Event.observe(this.element, "keypress", this.eventKeypress);
Event.observe(this.element, "keyup", this.eventKeydown);
},
keyPress: function(event) {
if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN) {
next_card();
}else{
this.apply_func();
}
},
keydown: function(event) {
this.apply_func();
}
};
我们观察 keypress 事件,如果发生了该事件,就让 this.eventKeydown 来接手处理。而 this.eventKeydown 这个对象属性已经绑定为 keydown 这个方法的事件监听器,所以,让 this.eventKeydown 接手,实际上就是触发调用了 keydown 对应的 function 。这里的 keydown 可以理解为像 Perl 里面的匿名代码引用(code ref)。原本传入的 apply_func 也是 code ref,所以 this.apply_func 也是 code ref ,而在这个 ref 后面加上 () 就是 call the code。完美解决。HTML 里面什么都不用写。只要 new Watcher( ‘text_id’, apply_text ); 就可以了。
后来我在使用 $() 的时候发生一个奇怪的问题。当 $() 内部调用通过 innerHTML 插入的某个元素的 id 的时候,如 $(test_id) 会报告 test_id 未定义。为此我困惑了很久,还另外作了实验验证。最后发现,$() 的语法有两种用法,$(test_id) 和 $(‘test_id’) 。不一样吗?确实不一样。用后面一种就安全得多。至少不会和既有的对象名称重复。不过 IE 下面的 Javascript 调试很麻烦,这也是为什么一直没有深入系统的学习 Javascript 的原因之一。
在经历了一系列的痛苦和喜悦之后,这个世界变得越来越和谐统一了。Perl/Javascript/Ruby/… 形式不同,思想皆通。
Published on November 25, 2005 5:15 pm.
Filed under: 东拉西扯 Tags: javascript, perl, prototype, ruby
Ajax 技术热起来之后,相继出现了各式各样的 Ajax 框架库。Catalyst 使用了其中的一种:Prototype 。Mochikit 刚刚发布了 1.0 版本,虽然不是完整的关于 Ajax 处理的库,不过对于常用的一些处理,都提供了相关的函数。
Mochikit 声称自己高度文档化以及良好单元测试。所以看起来是个可以实用的好东西。
Prototype 仅仅提供在 js 内发送请求到服务器,然后照本宣科的把返回的内容给程序员进一步处理,如果服务器没有响应,或者出现意外情况,返回的可能是一堆 404, 500 错误的页面代码。Mochikit 则通过他自己的 MochiKit.Async 提供了 XMLHttpRequestError ,如果出错,会通过 alert 通知客户发生意外。
MochiKit 对于 DOM 的支持也非常不错,我以前要写一堆的 function 来细化的工作,现在只要几句话就可以了。此外,Mochikit 可以直接对字符串或者数字格式化输出,比较实用和方便。
它还有自己的 js 代码解释器,它的交互模式借鉴了 Python 解释器。它还有自己的正则表达式引擎。个人感觉还是 DOM 这部分更加实用一些。
Published on October 26, 2005 10:47 am.
Filed under: 东拉西扯 Tags: dom, javascript, mochikit, prototype
自从有了 gougou 订阅了那么些站点,就不断的开始有新的令人振奋的资源,延展出去的内容花上一整天来细读消化都不够。
最让我吐血的有两处:Zimbra 和 Backbase AJAX RSS Reader 。
前者是一个开源的邮件系统,我关心的是基于 web 的操作界面。和 Gmail 类似,Zimbra 把 Ajax 运用得淋漓尽致,甚至有过之而无不及。它还运用了 Javascript 的 Prototype ,诸如 drag and drop 也用上了(移动邮件到其他目录的操作)。这些应用我也想到过,可总是有人走在前面。不得不感叹世界之大,山外有山。
后者则是 Backbase 的又一作品,顾名思义,是个类似 gougou.com 的 RSS 在线聚合阅读工具。界面非常专业,无处不体现着细致的设计和考究的制作。似乎也使用了 Javascript Prototype ,定期抓取而得的新条目会有浅黄色的背景着重印衬,继而淡出。这个效果原先来自 43thing 之前的 tada list。
这些给我带来的不仅仅是酷炫的视觉效果和用户体验,更多的是对于 web 应用的进一步思考。
Published on September 13, 2005 3:11 pm.
Filed under: 东拉西扯 Tags: ajax, email, prototype, zimbra