Eva’s Blog

Archive for the ‘技术文章’ Category

八款JS框架介绍及比较

Dojo
Dojo 是目前最为强大的JS框架,它在自己的 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 的类库使用显得不是那么易用,JS语法增强方面不如 Prototype

Prototype
它是一个非常优雅的 JS 库,定义了 JS 的面向对象扩展,DOM 操作API,事件等等,以 Prototype 为核心,形成了一个外围的各种各样的 JS 扩展库,是相当有前途的 JS 底层框架,值得推荐,感觉也是现实中应用最广的库类(RoR 集成的 AJAX JS 库),之上还有 Scriptaculous 实现一些JS组件功能和效果。
优点:基本底层,易学易用,甚至是其他一些js特效开发包的底层,体积算是最小的了。
缺点:如果说缺点,可能就是功能是他的弱项

dScriptaculous
Scriptaculous 是基于prototype.js 框架的 JS 效果。包含了 6 个 js 文件,不同的文件对应不同的 js 效果,所以说,如果底层用 prototype 的话,做js效果用 Scriptaculous 那是再合适不过的了,连大名鼎鼎的 digg 都在用他,可见不一般
优点:基于prototype 是最大的优点,由于使用 prototype 的广泛性,无疑对用户书锦上添花。
缺点:刚刚兴起,需要时间的磨练

Yui-ext
基于 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整体采用模块化设计,所以可以在它的基础上开发你需要的任何特效。
优点:小块头有大能耐
缺点:这么小了,已经不错了

ps:上面的也不尽完全正确,要看没个人的需求和熟悉程度

Advertisements

昨天去tecent面試,突然問我一個2維數組排序的問題,唉,當時竟然沒有達上來!后來想想還是基本功不到位啊!在這里copy網上一個解決方案!

var   temp   =   [
{   x:X-1,   y:Y-1,   ct:5,   d:0},
{   x:X,       y:Y-1,   ct:2,   d:1},
{   x:X+1,   y:Y-1,   ct:7,   d:2},
{   x:X+1,   y:Y,       ct:3,   d:3},
{   x:X+1,   y:Y+1,   ct:0,   d:4},
{   x:X,       y:Y+1,   ct:1,   d:5},
{   x:X-1,   y:Y+1,   ct:6,   d:6},
{   x:X-1,   y:Y,       ct:4,   d:7}
];

做ct的排序。

<script type=”text/javascript”>
function compareIntegers(vNum1,vNum2)
{
if(vNum1>vNum2)
{
return 1;
}
else if(vNum1<vNum2)
{
return -1;
}
else
{
return 0;
}
}
###這個方法可以簡化成

function   cmp(a,b,c)   {
if(a[c]   ==   b[c])
return   0;
return   a[c]   >   b[c]   ?   1:-1;
}  #####

function mySort(arr)
{
arr.sort(compareIntegers);
return arr;
}

string数组排序可以直接用 String的localCompare()方法
function compareStrings(string1,string2)
{
return string1.localeCompare(string2);
}

csdn:

<script>
function   cmp(a,b,c)   {
if(a[c]   ==   b[c])
return   0;
return   a[c]   >   b[c]   ?   1:-1;
}

for(i=0;i<temp.length-1;i++)
for(j=i;j<temp.length;j++)
if(cmp(temp[i],temp[j],”ct”)   >   0)   {
c   =   temp[i]
temp[i]   =   temp[j]
temp[j]   =   c
}
</script>

1.buffer 的主要目的是缓冲数据发送方和接收方速度不匹配的问题。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能

两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。

2.Cache :即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时 间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时 间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache

3.Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是 很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦阁下从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。Cookie 的用途之一是存储用户在特定网站上的密码和 ID。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量空间来储存这些首选项。这样,每次 阁下登录该网站时,阁下的浏览器将检查阁下是否就该唯一的服务器有任何预先定义的首选项(cookie)。如果有的话,浏览器将此 cookie 随阁下对网页的请求一起发送给服务器。

Cookies最典型的应用是判定注册用户是否已经登录网站;另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

使用Cookie Pal软件查看到的Cookie信息;Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递;Cookie包含Server、Expires、Name、value这几个字段;Server是存储Cookie的网站,Expires记录了Cookie的时间和生命期,Name和value字段则是具体的数据.

多数网页编程语言都提供了对Cookie的支持。如 javascript、VBScript、Delphi、ASP、SQL、PHP、C#等。在这些面向 对象的编程语言中,对Cookie的编程利用基本上是相似的,大体过程为:先创建一个Cookie对象(Object),然后利用控制函数对Cookie 进行赋值、读取、写入等操作.

一般来说,Cookie通过HTTP Headers从服务器端返回到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且反它返回至服务器,从而完成浏览器的论证.   js–var cookieContent = document.cookie;

js控制cookie的例子:http://bbs.blueidea.com/thread-2801130-1-1.html


浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“解释引擎”,不过我们一般习惯将之称为“浏览器内核”。负责对网页语法的解释(如HTML、JavaScript)并渲染(显示)网页。

不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因。

几种常见的浏览器内核简介:

Trident:Windows 下的 IE 浏览器使用的内核代号。除 IE 外,众多的 IE Shell(如 Maxthon )都使用这个内核。

Gecko:Mozilla Firefox 浏览器使用的内核代号。使用 Gecko 内核的浏览器也有不少,如 Netscape 、MozillaSuite/SeaMonkey 等。另外,Mozilla Thunderbird 也使用 Gecko 。

Presto:Opera 浏览器使用的内核代号,这是目前公认网页浏览速度最快的浏览器内核。

KHTML/WebCore: Konqueror/Safari 浏览器使用的内核代号。Konqueror 是 X 协议下的 KDE 桌面环境使用的浏览器和资源管理器,可以用在 Unix/GNU/Linux/BSD 系统中,据说 KDE 4.0 以后会有向 Windows 移植的计划;Safari 则是 Apple 用户中最受欢迎的浏览器。

只想说明一点,在FF下内容可以用\n,在IE下必须用\r.

在鼠标focus的时候,才能都适用。

<textarea name=”reject_memo”  cols=”50″ id=”tttt” cols=90 rows = 15></textarea>

<SCRIPT LANGUAGE=”JavaScript”>

var tt = document.getElementById(‘tttt’);
var sNormal=”請提供:\r 1. 成立宗旨(50字以內)、\r 2. 活動性質 (50字以內)、\r 3. 部落格用途與更新頻率 (100字以內)、\r 4. 團體簡介 (50字以內,此描述則顯示在貴單位 logo 旁)”;
if(isFirefox=navigator.userAgent.indexOf(“Firefox”)>0){ var sNormal=”請提供:\n 1. 成立宗旨(50字以內)、\n 2. 活動性質 (50字以內)、\n 3. 部落格用途與更新頻率 (100字以內)、\n 4. 團體簡介 (50字以內,此描述則顯示在貴單位 logo 旁)”;}

if(tt.value.replace(/\s/g,”)==”){tt.value = sNormal;}

tt.onfocus = function(){if(tt.value.replace(/\n/ig,”)==sNormal.replace(/\n/ig,”)){tt.value = ”;}}
tt.onblur=function(){if(tt.value.replace(/\s/g,”)==”){tt.value = sNormal;}}

</SCRIPT>

来自 Nine Javascript Gotchas , 以下是JavaScript容易犯错的九个陷阱。虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 笔者对某些陷阱会混杂一些评点。

1. 最后一个逗号

如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描。

<span class=”code”><script type=”text/javascript”><!–
var theObj = {
city : “Boston”,
state : “MA”,
}
// –></script> </span>

2. this的引用会改变

如这段代码:

<span class=”code”><input id=”MyButton” type=”button” value=”Gotcha!” />
<script type=”text/javascript”><!–
var MyObject = function () {
this.alertMessage = “Javascript rules”;
this.ClickHandler = function() {
alert(this.alertMessage );
}
}();
document.getElementById(”theText”).onclick =  MyObject.ClickHandler
// –></script></span>

并不如你所愿,答案并不是”JavaScript rules”。在执行MyObject.ClickHandler时,代码中红色这行,this的引用实际上指向的是document.getElementById(“theText”)的引用。可以这么解决:

<span class=”code”><input id=”theText” type=”button” value=”Gotcha!” />
<script type=”text/javascript”><!–
var MyObject = function () {
var self = this;
this.alertMessage = “Javascript rules”;
this.OnClick = function() {
alert(self.value);
}
}();
document.getElementById(”theText”).onclick =  MyObject.OnClick
// –></script></span>

实质上,这就是JavaScript作用域的问题。如果你看过,你会发现解决方案不止一种。

3. 标识盗贼

在JavaScript中不要使用跟HTML的id一样的变量名。如下代码:

<span class=”code”><input id=”TheButton” type=”button” />
<script type=”text/javascript”><!–
TheButton = get(“TheButton”);
// –></script></span>

IE会报对象未定义的错误。我只能说:IE sucks.

4. 字符串只替换第一个匹配

如下代码:

<span class=”code”><script type=”text/javascript”><!–
var fileName = “This is a title”.replace(” “,”_”);
// –></script></span>
而实际上,结果是”This_is a title“. 在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样:

<span class=”code”>var fileName = “This is a title”.replace(/ /g,”_”);</span>

5. mouseout意味着mousein

事实上,这是由于事件冒泡导致的。IE中有mouseenter和mouseleave,但不是标准的。作者在此建议大家使用库比如YUI来解决问题。

6. parseInt是基于进制体系的

这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt(“09”),如果你认为答案是9,那就错了。因为,在此,字符串以0开头,parseInt以八进制来处理它,在八进制中,09是非法,返回false,布尔值false转化成数值就是0. 因此,正确的做法是parseInt(“09”, 10).

7. for…in…会遍历所有的东西

有一段这样的代码:

var arr = [5,10,15]
var total = 1;
for ( var x in arr) {
total = total * arr[x];
}

运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype,这样,我们的arr平白无过多出了一个属性(方法),而for…in…会把它给遍历出来。所以这样做才是比较安全的:

for ( var x = 0; x < arr.length; x++) {
total = total * arr[x];
}

其实,这也是污染基本类的prototype会带来危害的一个例证。

8. 事件处理器的陷阱

这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码,这会复写掉之前的window.onclick事件,还可能导致IE的内容泄露(sucks again)。在IE还没有支持DOM 2的事件注册之前,作者建议使用库来解决问题,比如使用YUI:

YAHOO.util.Event.addListener(window, “click”, MyOnClickMethod);

这应该也属于常识问题,但新手可能容易犯错。

9. Focus Pocus

新建一个input文本元素,然后把焦点挪到它上面,按理说,这样的代码应该很自然:

<span class=”code”>var newInput = document.createElement(“input”);<br/>document.body.appendChild(newInput);<br/>newInput.focus();<br/>newInput.select();</span>

但是IE会报错(sucks again and again)。理由可能是当你执行fouce()的时候,元素尚未可用。因此,我们可以延迟执行:

var newInput = document.createElement(“input”);
newInput.id = “TheNewInput”;
document.body.appendChild(newInput);
setTimeout(function(){ //这里我使用闭包改写过,若有兴趣可以对比原文
document.getElementById(‘TheNewInput’).focus();
document.getElementById(‘TheNewInput’).select();}, 10);

在实践中,JavaScript的陷阱还有很多很多,大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现,只能靠开发者之间的经验分享。谢天谢地,我们生活在网络时代,很多碰到的问题,一般都可以在Google中找到答案。

1,下载一个YUI Compressor工具。下载地址是http://www.julienlecomte.net/yuicompressor/。
2,确认你的电脑上有java虚拟机,确认你的js都通过了jslint的测试才行。
3,运用命令行 cd 进入下载包的那个目录。
4,运行java -jar yuicompressor-x.y.z.jar myfile.js -o myfile-min.js(将压缩myfile.js文件并输出为myfile-min.js 【x.y.z 为具体的版本号】)

ps:一下其他相关命令。
Global Options
-h, –help 显示帮助信息
–type 指明需要压缩的文件是js还是css。
–charset 指明需要压缩的文件的
–line-break 在指定的列换行
-o 指定输出文件 。默认为标准输出(屏幕)。

JavaScript Options
–warn 打印代码中的错误信息
–nomunge Minify only, do not obfuscate
–preserve-semi Preserve all semicolons
–preserve-strings Do not merge concatenated string literals, Use this option to specify that concatenated string literals should never be merged.


2017年十月
« 2月    
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

UED Front_end

Blog Stats

  • 146 hits