浏览模式: 标准 | 列表
上个月在 WebFX 上看到 Emil A Eklund 写了一个非常棒的 Chart 组件,这个组件棒就棒在它提供了一个 AbstractChartPainter 的抽象类,然后用 Canvas 技术实现了一个 CanvasChartPainter 类,用 SVG 技术实现了另一个 SVGChartPainter 类,只要在使用 Chart 类的实例绘制图表前,用setPainterFactory 方法来指定一个 PainterFactory,就可以用指定的 Painter 实现来进行绘图表了。 但是这个 Chart 组件中所实现的两个 ChartPainter 类所使用的技术过于前卫,因此只有最新的浏览器才支持。用 Canvas 实现的 Painter,只能在 Mozilla Firefox 1.5+ 和 Opera 9+ 上完美运行,在 IE 6.0 上通过 Emil A Eklund 编写的 IECanvas 也能够勉强运行,但因为 iecanvas.htc 加载速度慢的原因,常常会因为没有加载完就开始执行后面的代码而出现错误。而对于较低版本的浏览器和其它尚未支持 Canvas 的浏览器来说就不能执行了。而另一个 SVG 实现的 Painter,能够执行的浏览器则更少。 为了支持更多的浏览器,我找到了 High Performance JavaScript Vector Graphics Library 这个好东西,这个东西的跨平台和跨浏览器性能相当好,但是这里我们要用它来做 Chart 组件的 ChartPainter 类的话,需要用它的在页面完全调入后画入 DIV 元素的方式来创建对象,因此在 Netscape 4 和 Opera < 7 的版本上不能运行,但是目前大部分浏览器还是都支持的。因此我用它实现了一个 JsGraphicsChartPainter 类,有了它,现在 Chart 组件可以在目前几乎所有的浏览器上都可以使用了。 另外,为了兼容更老版本的浏览器,我将 chart.js 也作了修改。取消了数组 push 方法的调用,用其他方式来实现相同的功能。去掉了加载延时处理代码,这段代码主要是为避免 IECanvas 加载不完而出错设计的,但是这个设计本身不完善,还是无法避免这个问题,而且导致 IE 上显示速度变慢,因此去掉了。我认为 IE 上没必要使用 IECanvas,用 JsGraphics 适用范围更广。并且根据浏览器来判断初始化时该加载 CanvasChartPainter 还是 JsGraphicsChartPainter 。 演示和下载见正文

» 阅读全文

大整数运算一般用于密钥计算中。以下是我从 google 上搜索到的几个 JavaScript 版本的的大整数运算库。
  1. http://www.onicos.com/staff/iz/amuse/javascript/expert/BigInt.txt 这是比较早期的一个 JavaScript 版本的大数运算库,由日本高手出雲所作,其中只包含了加减乘除、模(求余)和比较运算。
  2. http://www.faireal.net/demo/bigint0.5/beta28/ 这是另一个日本高手的作品,这个库中包含的功能非常全,它的历史可以参见该文
  3. http://www.leemon.com/crypto/BigInt.js 这个是美国高手 Leemon Baird 的作品,所实现的功能也非常全。
  4. http://www.ohdave.com/rsa/BigInt.js 最后这个来自 dave 的 RSA In JavaScript 网站,这个虽然功能没有前两个强大,但是使用比较方便,做一般的浏览器端加密部分已经够用了。

» 阅读全文

昨天,Xenium 同学给我看了一个大牛写的一个 JavaScript 的 Sqlite API 库。我发现在代码中居然有的变量名用 $ 开头,有的还有两个 $,看上去就像是 PHP 中的变量名,开始我还以为是 PHP 和 JavaScript 混写的,后来问了 Xenium 才知道,原来 JavaScript 中 $ 也可以作为变量名的一部分,这位大牛这么写是为了让某些变量看上去跟其它变量好区分。开始我还以为是自创的语法,还需要自己写个解释器解释执行这些代码呢。今天试了一下,原来 JavaScript 中本来就真的支持这种写法。而我读过的手册中从来都没有提到过,真是孤陋寡闻了!大牛就是大牛!不服不行啊!不信你试试下面这段代码,完全可以正确执行的。 var $a = 1; var $$a = 2; var $a$ = 3; alert($a); alert($$a); alert($a$);

» 阅读全文

一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。但是对于带有中文的参数来说,这种编码会使编码后的字符串变得很长。如果希望有短一点的方式对参数编码,可以采用 base64 编码方式对字符串进行编码,但是 base64 编码方式不能处理 JavaScript 中的中文,因为 JavaScript 中的中文都是以 UTF-16 方式保存的。而 base64 只能处理单字节字符,所以不能直接用 base64 对带有中文的 JavaScript 字符串进行编码。但是可以通过 utf.js 这个程序中提供的 utf16to8 来将 UTF-16 编码的中文先转化为 UTF-8 方式,然后再进行 base64 编码。这样编码后的字符串,在传递到服务器端后可以直接通过 base64_decode 解码成 UTF-8 的中文字符串。但是还有个问题需要注意。base64 编码中使用了加号(+),而 + 在 URL 传递时会被当成空格,因此必须要将 base64 编码后的字符串中的加号替换成 %2B 才能当作 URL 参数进行传递。否则在服务器端解码后就会出错。

原来在编写 PHPRPC 1.1 的 JavaScript 客户端实现时,就是因为没有注意到这个问题,所以在传递中文参数时,有时候传递的参数正确,有时候参数在服务器端解码时就会出错。后来费了好大劲才发现是这个问题。

» 阅读全文

以前写 JavaScript 程序时,事件都是采用 object.event = handler; 的方式初始化。这种方式对于 Internet Explorer、Mozilla/Firefox 和 Opera 来说很通用。但是有一个问题就是,这种方式只能一个事件对应一个事件处理过程。如果希望一个事件可以依次执行多个处理过程就不好用了。

» 阅读全文