js除了有JQuery框架以外,还有哪些强大点的框架,或者比较实用的也可以。。 谁能给我介绍一下?

JavaScript010

js除了有JQuery框架以外,还有哪些强大点的框架,或者比较实用的也可以。。 谁能给我介绍一下?,第1张

目前来看,JS框架以及一些开发包和库类有如下几个,Dojo 、Scriptaculous 、Prototype 、yui-ext 、Jquery 、Mochikit、mootools 、moo.fx

Dojo (JS library and UI component ):

Dojo是目前最为强大的j s框架,它在自己的Wiki上给自己下了一个定义,dojo是一个用JavaScript编写的开源的DHTML工具箱。dojo很想做一个“大一统”的 工具箱,不仅仅是浏览器层面的,野心还是很大的。Dojo包括ajax, browser, event, widget等跨浏览器API,包括了JS本身的语言扩展,以及各个方面的工具类库,和比较完善的UI组件库,也被广泛 应用在很多项目中,他的UI组件的特点是通过给html标签增加tag的方式进行扩展,而不是通过写JS来生成,dojo的API模仿Java类库的组织 方式。 用dojo写Web OS可谓非常方便。dojo现在已经4.0了,dojo强大的地方在于界面和特效的封装,可以让开发者快速构建一些兼容标准的界面。

优点:库相当完善,发展时间也比较长,功能强大,据说利用dojo的io.bind()可以实现comet,看见其功能强大非一般,得到IBM和SUN的支持

缺点:文件体积比较大,200多KB,初次下载相当慢,此外,dojo的类库使用显得不是那么易用,j s语法增强方面不如prototype。

Prototype (JS OO library):

是一个非常优雅的JS库,定义了JS的面向对象扩展,DOM操作API,事件等等,以prototype为核心,形成了一个外围的各种各样 的JS扩展库,是相当有前途的JS底层框架,值得推荐,感觉也是现实中应用最广的库类(RoR集成的AJAX JS库),之上还有 Scriptaculous 实现一些JS组件功能和效果。

优点:基本底层,易学易用,甚至是其他一些js特效开发包的底层,体积算是最小的了。

缺点:如果说缺点,可能就是功能是他的弱项

Scriptaculous (JS UI component based on prototype):

Scriptaculous是基于prototype.js框架的JS效果。包含了6个js文件,不同的文件对应不同的js效果,所以说,如果底层用 prototype的话,做js效果用Scriptaculous那是再合适不过的了,连大名鼎鼎的digg都在用他,可见不一般

优点:基于prototype是最大的优点,由于使用prototype的广泛性,无疑对用户书锦上添花,并且在《ajax in action》中就拿Scriptaculous来讲述js效果

缺点:刚刚兴起,需要时间的磨练

yui-ext (JS UI component):

基于Yahoo UI的扩展包yui-ext是具有CS风格的Web用户界面组件 能实现复杂的Layout布局,界面效果可以和backbase媲美,而且使用纯javascript代码开发。真正的可编辑的表格Edit Grid,支持XML和Json数据类型,直接可以迁入grid。许多组件实现了对数据源的支持,例如动态的布局,可编辑的表格控件,动态加载的Tree 控件、动态拖拽效果等等。1.0 beta版开始同Jquery合作,推出基于jQuery的Ext 1.0,提供了更多有趣的功能。

优点:结构化,类似于java的结构,清晰明了,底层用到了Jquery的一些函数,使整合使用有了选择,最重要的一点是界面太让让人震撼了。

缺点:太过复杂,整个界面的构造过于复杂。

Jquery :

jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是个js高手又想写出优 秀的js效果,jQuery可以帮你达到目的!并且简介的语法和高的效率一直是jQuery追求的目标,

优点:注重简介和高效,js效果有yui-ext的选择,因为yui-ext 重用了很多jQuery的函数

缺点:据说太嫩,历史不悠久。

Mochikit :

MochiKit自称为一个轻量级的js框架。MochiKit 主要受到 Python 和 Python 标准库提供的很多便利之处的启发,另外还缓解了浏览器版本之间的不一致性。其中的 MochiKit.DOM 尤其方便,能够以比原始 JavaScript 更友好的方式处理 DOM 对象。MochiKit.DOM 大部分都是针对 XHTML 文档定制的,如果与 MochiKit 和 Ajax 结合在一起,使用 XHTML 包装的微格式尤其方便。Mochikit可以直接对字符串或者数字格式化输出,比较实用和方便。它还有自己的 js 代码解释器

优点:MochiKit.DOM这部分很实用,简介也是很突出的

缺点:轻量级的缺点

mootools :

MooTools是一个简洁,模块化,面向对象的JavaScript框架。它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码。Mootools跟prototypejs相类似,语法几乎一样。但它提供的功能要比prototypejs多,而且更强大。比如增加了动画特效、拖放操作等等。

优点:可以定制自己所需要的功能,可以说是prototypejs的增强版。

缺点:不大不小,具体应用具体分析

moo.fx :

moo.fx是一个超级轻量级的javascript特效库(7k),能够与prototype.js或mootools框架一起使用。它非常快、易于使用、跨浏览器、符合标准,提供控制和修改任何HTML元素的CSS属性,包括颜色。它内置检查器能够防止用户通过多次或疯狂点击来破坏效果。moo.fx整体采用模块化设计,所以可以在它的基础上开发你需要的任何特效。

优点:小块头有大能耐

缺点:这么小了,已经不错了

这个问题挺复杂的,以前看过一次,但没太看懂,这次整理了一下。有兴趣的同学可以看看。

首先打印出0.14和0.14*100的二进制(程序见参考):

0.14 : 0 01111111100 0001111010111000010100011110101110000101000111101100

0.14*100 : 0 10000000010 1100000000000000000000000000000000000000000000000001

14.0 : 0 10000000010 1100000000000000000000000000000000000000000000000000

我们可以看到0.14的小数部分出现循环,就像10/3 = 1.33333…一样,所以0.14是有精度丢失的,

比较0.14*100和14.0,0.14*100多了最后一位1。

Java遵循IEEE 754标准来支持浮点数的操作,结合浮点值0.14,我们来看一下,1) 0.14的二进制格式

0 01111111100 0001111010111000010100011110101110000101000111101100.

根据IEEE 754标准,

注:S:符号(0正1负),E,指数,M小数部分。

对0.14格式化后的结果是:

S(1位) E(11位) M (52位)

0 01111111100 0001111010111000010100011110101110000101000111101100

根据计算公式:

我们可以得到e = 01111111100 – 1023 = 1020 – 1023 = -3

m = 1 (隐藏位) + 0.0001111010111000010100011110101110000101000111101100 = 1 +

Long.valueOf("0001111010111000010100011110101110000101000111101100", 2)/ (Math.pow(2, 52) – 1)

= 1.12000000000000013

n = 1.12000000000000013 *2^-3= 1.12000000000000013/8 约 0.14

接下来,第二个问题,2)为什么0.14 * 100 输出14.000000000000002?

由上可知0.14是不精确的,乘100只会扩大这个不精确度。具体的计算过程如下:

100的浮点二进制:

0 10000000101 1001000000000000000000000000000000000000000000000000

跟据浮点乘法规则指数相加,小数相乘,得到

0.14 * 100 =

2^(6-3) //100的指数是6,0.14的指数是-3

*

(1. 1001000000000000000000000000000000000000000000000000*

1. 0001111010111000010100011110101110000101000111101100) //小数部分

= 2^(6-3) * (1 + 0.1001000000000000000000000000000000000000000000000000 +

0.0001111010111000010100011110101110000101000111101100 +

0. 1001000000000000000000000000000000000000000000000000 * 0. 0001111010111000010100011110101110000101000111101100

//方便计算,分解乘数(同1.1 * 1.1 = 1 + 0.1 * 1 + 1 * 0.1 + 0.1*0.1)

这部分我用计算器计算,貌似精度丢失更严重,但可以得知小数部分依然是循环,而不能精确表达。同时,通过查看JDK中Double.toString(d)方法,我们可以看到SUN实现的浮点输出方法。所以最后打印在页面的是14.000000000000002而不是14.0.

故,浮点是用有限二进位接近表达一个数值,不精确是常态,使用要慎重

参考(强烈推荐)

IEEE 754 浮点数的表示精度探讨

http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html

解读IEEE标准754:浮点数表示

http://www.linuxsir.org/bbs/thread262207.html

浮点乘法计算

http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BinMath/multFloat.html

打印DOUBLE二进制方法:

public class DoubleTest {

@Test

public void test(){

System.out.println("0.5 : " + this.dumpDouble(0.5))

System.out.println("0.14 : " + this.dumpDouble(0.14))

System.out.println("0.14*100 : " + this.dumpDouble(0.14 * 100))

System.out.println("14.0 : " + this.dumpDouble(14.0))

System.out.println("100 : " + this.dumpDouble(100))

Assert.assertEquals("100.0%", getPercentage(0.9999, 2))

Assert.assertEquals("100%", getPercentage(0.9999, 1))

Assert.assertEquals("99.9%", getPercentage(0.999, 2))

Assert.assertEquals("10.1%", getPercentage(0.101, 2))

Assert.assertEquals("10.2%", getPercentage(0.1015, 2))

Assert.assertEquals("11.0%", getPercentage(0.1095, 2))

Assert.assertEquals("0.11%", getPercentage(0.0011, 3))

final int TOTAL = 100000

double[] data = new double[TOTAL]

for(int i = 0i <TOTALi++ ){

data[i] = Math.random()

}

//通过FORMAT,获得百分比,忽略精度

DecimalFormat f = new DecimalFormat("0.##'.0'%")

long start = System.currentTimeMillis()

for(int i = 0i <TOTALi++ ){

f.format(data[i])

}

long end = System.currentTimeMillis()

System.out.println("0 time: " + (end - start))

//基于字符计算百分比

start = System.currentTimeMillis()

for(int i = 0i <TOTALi++ ){

this.getPercentage(data[i], 2)

}

end = System.currentTimeMillis()

System.out.println("1 time: " + (end - start))

}

public String dumpDouble(double d) {

StringBuilder b = new StringBuilder()

String bString = Long.toBinaryString(Double.doubleToLongBits(d))

int fillZeros = 64 - bString.length()

for(int i = 0i <fillZeros i++){

if(i == 1){

b.append(' ')

}

b.append('0')

}

for(int i = 0i <bString.length()i++ ){

if((i + fillZeros) == 1 || (i + fillZeros) == 12){

b.append(' ')

}

b.append(bString.charAt(i))

}

return b.toString()

}

char[] next = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',}

public String getPercentage(double d, int precision){

StringBuilder b = new StringBuilder(Double.toString(d * 100))

int dot = b.indexOf(".")

if(dot >0 &&dot + precision <b.length()){

char c = b.charAt(dot + precision)

//四舍五入

if(c >'4'){

int j = dot + precision - 1

if(j == dot) {

//跳过小数点

j --

}

char n = next[b.charAt(j) - '0']

b.setCharAt(j, n)

//向前进1

while(n == '0' &&j >0){

j --

if(j == dot) {

//跳过小数点

j --

}

//+1

n = next[b.charAt(j) - '0']

b.setCharAt(j, n)

}

if(j == 0){

b.insert(0, 1)

dot++

if(precision == 1){

b.setCharAt(dot, '%')

return b.substring(0, dot + 1)

}else{

b.setCharAt(dot + precision, '%')

return b.substring(0, dot + precision + 1)

}

}

}

b.setCharAt(dot + precision, '%')

return b.substring(0, dot + precision + 1)

}

b.append("%")

return b.toString()

}