当我决定写一个兼容性优秀的Javascript Framework时并没有感受到这个工作的艰难,但这两天我在写代码时发现如果真的能写出一个在不同浏览器间都能完美无缺地运行,甚至使不同浏览器得到几乎完全一样的结果是多么的不容易。
虽然W3C已经发布了种种统一的标准,但浏览器却并不完全按照这个标准去执行代码,甚至到目前为止没有一款浏览器可以正常运行所有W3C标准的代码。不同的浏览器往往有自己专属的代码语法,这无疑会使代码为了兼容性而变得冗长。
在如今各个浏览器发布自己的标准而不遵循一个统一标准的同时,程序员将越来越难兼顾兼容性,他们不得不为不同的浏览器编写不同的代码。造成这一问题的原因往往是由于商业原因——从技术上讲并不是问题,我不相信IE在技术原因上无法支持SVG格式的矢量图片。
由于我承诺COFIS的出现就是为了解决浏览器兼容性的问题,所以有些只针对部分浏览器的解决方案被我舍弃了,虽然这些解决方案很出色,但引入这些方案的同时只会使程序员更加迷茫——缺少兼容性的解决方案不是真正的解决方案。如果一个网站宣称只支持某某浏览器,它就是在劫持用户,强迫用户使用某款浏览器。中国众多银行的网上银行就是这种无耻的劫持用户者。
但现实总是残酷的,有时不得不做些妥协。比如COFIS框架中的 _c_rotate 函数,为了兼顾兼容性不得不警告程序员慎用有包含Alpha通道PNG图片的元素,因为IE只会加载PNG图片的Alpha通道一次,如果图片进行了旋转而不再次加载Alpha通道会使PNG的半透明效果变得非常糟糕。
COFIS框架目前还是面向过程的,因为我最早在文曲星上接触GV BASIC开始,到中学时接触的C语言都是面向过程的,直到现在我编程的思想还是偏向面向过程的,这也是至今我不愿意学习Java的原因。不过当然OOP是现在的趋势,当COFIS拥有100个兼容性出色的函数时,我承诺会同时推出面向对象的COFIS,如果你已经习惯了面向对象的编程思想,我相信那一定会给你带来帮助。
在写框架的同时,Demo当然是不可少的,我也写了两个比较有趣的提供旋转函数的Demo。第一个是时钟,这个Demo就是我的博客右侧边栏中放置的Clock,你也可以在这个页面单独测试及查看源码。第二个是齿轮,你可以在这个页面单独测试及查看源码。在做这个Demo时发现了前面提到的兼容性问题,即IE在选择PNG图片时丢失Alpha通道的Issue,在搜索了20多个小时解决方案而无获而返时,我只能提供一个妥协的办法,警告程序员慎用有包含Alpha通道PNG图片的元素,同时换掉了我之前Demo的背景图片。虽然这个解决方法影响了原有Demo的美观,但对IE来说这种改进是必要的。如果你对COFIS感兴趣,可以到 http://cofis.sneezry.com 查看COFIS的wiki,不过请注意,COFIS还没有正式发布,其中的函数接口可能随时变化,将COFIS使用到成熟的产品中是不建议的。
作为一个有责任感的程序员不应丢弃任何平台上的用户;而作为一个有责任感的企业,更不应迫使程序员丢弃其他平台上的用户。期待有一天所有的平台都能严格按照统一标准执行代码,而那一天我将高兴地宣布,我们再也不需要像COFIS这样的框架了。
UPDATE: 基于COFIS框架的时钟Demo已经提供gadget版本下载:http://file.sneezry.com/cofis_demo/clock/clock.gadget

嗯,首先这是个很老土的题目,然后又配上了这个很无厘头的配图~好吧,如果你愿意听的话我可以从2010年的春节讲起(各种砖头、臭鸡蛋)……那我还是从2011年的春节讲起吧。大年三十回了奶奶家,初一回来了,就是这样(各种砖头、臭鸡蛋继续飞过)~那我还是再详细点说吧,否则这篇博客应该发到推特上去。大年三十哥哥开车接我去奶奶家陪奶奶一起过年,其实这没什么特别的,特别的是这次和奶奶一起过年的还有我哥哥的儿子——我的小侄子。其实从高中开始每年春节我都不怎么喜欢过,曾经的那份热情与兴奋现在一点都没有了,每年春节我基本都一个人做点无聊的事,别人看着电视玩着扑克我都没兴趣。今年就不同了,我可算是有一件“正经”的事要做了——带孩子(大学里那些在我身边搞对象的同学们,我已经开始带孩子了 – -b)。
我小的时候老爸总打我,所以我曾经暗下决心,以后我有孩子了可不能这样,一定要像对朋友那样对TA,这回哥哥的儿子就成为我第一个实验的对象。可是想来容易做来难啊,这不到10岁的小P孩没折腾死我,当时就有一种80后被00后彻底击败的愧疚感~~~
也不知道为什么,小侄子喊了一天外加跑了一下午还那么有精力,和他比我可是差远了。因为我之前没和他接触过,刚到奶奶家时他还有点害羞,当我在他面前随手用纸折出一个小兔子那一刻起,他便一直跟着我(哼哼,小P孩被小叔的才华折服了吧)。之后我又教他折花篮和玫瑰花,当然这些他肯定学不会(连我自己都学了好长时间呢,嘿嘿)。当然小孩子嘛,基本都是三秒钟热情(我没打错字,真的是三秒钟),折了一会纸就开始让我陪他玩扑克,这时哥哥不怀好意地对我一笑。玩上了才知道,好嘛,每次都是他洗牌,每次他都抓俩王,而我每次都会抓到一张广告牌(就是新扑克中第一张上面印有广告的那种,这让我怎么出啊~),当然每次都是我输喽。败给这个小家伙了~
当我走的时候小家伙还有点恋恋不舍,我还偷看到他眼角有一些晶莹的小东西(成就感啊,看来以后我一定能做一个合格的爸爸 ^^)。
然后再说说最不愿意提到的春晚吧~引用同学一句经典的话“以前看到赵本山的小品就感觉春晚快结束了,今年感觉春晚从来就没正式开始过”。有人说是老百姓的要求越来越高了,可我不这么想。想想千手观音,其实老百姓的要求并不高,只是春晚离老百姓的审美观越来越远了。为什么郭德纲现在这么火呢?因为他敢说实话,老百姓找到了共鸣,而现在的春晚离百姓生活越来越远了,与其说春晚是为庆祝节日的,不如说是给政府搞宣传的,现在的春晚和新闻联播差不多了(个人感觉这句话我说的灰常好,喜欢的同学请随便摘抄 xD)。
最后说说我最近在搞什么小灰机吧。放假这几天陆续做了谷歌的在线输入法、适用于网页的Android动态壁纸和适用于任意网页的谷歌翻译。这三个程序都是基于JS的,我发现JS真的是一个很神奇的语言。搞了这三个程序之后我发现有很多功能都是冗余的,其实可以把这些功能提取出来做一个集合。比如动态创建可拖拽的div元素,所有包含工具条的应用基本都需要这个功能,于是乎……嘿嘿,就这么愉快地决定了——自己搞一个JS常用功能函数集合——或者我们通常叫这个东东为framework,框架。
昨天想给这个框架起个有趣的名字,向几个同学征求了下意见,结果他们都问我什么是框架。我说这个没必要知道,你看java和python和语言有什么关系啊,就是作者喜欢那么叫,觉得有趣,结果——下面我张贴下他们给我提供的框架候选名字:asdfjkl;、qweruiop、qazwsx……好吧,我再次败给这些可爱的同学们了。最后我自己想出了个COFIS,当然COFIS也不是英文单词(我就喜欢造词,比如这个Sneezry,还有一个Walrk什么的~),COFIS分别是取自目前五大主流浏览器——Chrome、Opera、Firefox、IE和Safari的首字母,寓意也很明了,就是突出兼容性。javascript最让人头痛的问题就是浏览器间的兼容性,我希望通过我的框架可以让人们从兼容性的问题上解放出来。
也许像COFIS这种东西已经有人做了,而且也很成熟了,不过我还是喜欢依据我自己的需求、习惯写一个属于自己的框架,这样或许会使工作效率更高。既然想做就做得像那么回事,于是乎我又搞了个logo,就是本文的配图。漂亮吧,嘿嘿,那个箱子是我用鼠标画出来的哦。还有,logo里的代码很有趣的哦,好奇的你千万不要忘记自己试试看啊~~~