当我决定写一个兼容性优秀的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
