jQuery最佳实践

jQuery最佳实践

1. 使用最新版本的jQuery

jQuery的版本更新很快,你应该总是使用最新的版本。因为新版本会改进性能,还有很多新功能。

下面就来看看,不同版本的jQuery性能差异有多大。这里是三条最常见的jQuery选择语句:

  $(‘.elem’)

  $(‘.elem’, context)

  context.find(‘.elem’)

我们用1.4.2、1.4.4、1.6.2三个版本的jQuery测试,看看浏览器在1秒内能够执行多少次。结果如下:

可以看到,1.6.2版本的运行次数,远远超过两个老版本。尤其是第一条语句,性能有数倍的提高。

其他语句的测试,比如.attr(“value”)和.val(),也是新版本的jQuery表现好于老版本。

2. 用对选择器

在jQuery中,你可以用多种选择器,选择同一个网页元素。每种选择器的性能是不一样的,你应该了解它们的性能差异。

(1)最快的选择器:id选择器和元素标签选择器

举例来说,下面的语句性能最佳:

  $(‘#id’)

  $(‘form’)

  $(‘input’)

遇到这些选择器的时候,jQuery内部会自动调用浏览器的原生方法(比如getElementById()),所以它们的执行速度快。 Read More

客户端存储

Web应用允许使用浏览器提供的API实现将数据存储到用户的电脑上。这种客户端存储相当于赋予了Web浏览器记忆功能。比方说,Web应用就可以用这种方式来“记住”用户的配置信息甚至是用户所有的状态信息,以便准确地“回忆”起用户上一次访问时候的状态。客户端存储遵循“同源策略”,因此不同站点的页面是无法互相读取对方存储数据的,而同一站点的不同页面之间是可以互相共享存储数据的,它为我们提供了一种通信机制,例如,一个页面上填写的表单数据可以显示在另外一个页面中。Web应用可以选择它们存储数据的有效期:比如采用临时存储可以让数据保存至当前窗口关闭或者浏览器退出;采用永久存储,可以将数据永久地存储到硬盘上,永不失效。

客户端存储有以下几种形式:

Web存储

Web存储最初作为HTML5一部分被定义成API形式,但是后来被剥离出来作为独立的一份标准了。该标准目前还在草案阶段,但其中一部分内容已经被包括IE8在内的所有主流浏览器实现了。Web存储标准所描述的API包含了 localStorage 对象和 sessionStorage 对象,这两个对象实际上是持久化关联数组,是名值对的映射表,“名”和“值”都是字符串。Web存储易于使用、支持大容量(但非无限量)数据存储同时兼容当前所有主流浏览器,但是不兼容早期浏览器。§20.1 会对 localStorage 和 sessionStorage 这两个对象作详细介绍。

Cookies

Cookie是一种早期的客户端存储机制,起初是针对服务器端脚本设计使用的。尽管在客户端提供了非常繁琐的JavaScript API来操作Cookie,但却难用之极,而且只能存储少量文本数据。不仅如此,任何以Cookie形式存储的数据,不论服务器端是否需要,每一次HTTP请求都会把这些数据传输到服务器端。Cookie目前仍然被客户端开发者大量使用的一个重要原因是:所有浏览器都支持它。但是,随着Web Storage的普及,Cookie终将会回归到最初的形态:作为一种被服务端脚本使用的客户端存储机制。§20.2会详细介绍Cookie。

IE User Data

微软在IE5及之后的IE浏览器中实现了它专属的客户端机制——”userData”。userData可以实现一定量的文本数据存储,对于IE8以前的IE浏览器中,可以将其用作是Web存储的替代方案。关于userData的API会在§20.3中作相应介绍。

离线Web应用

HTML5标准中定义了一组“离线Web应用”API,用以缓存web页面以及相关资源(脚本、CSS文件、图片等等)。它实现的是将web应用整体存储在客户端,而不仅仅是存储数据。它能够让web应用“安装”在客户端,这样一来,哪怕网络不可用的时候web应用依然是可用的。离线web应用相关的内容会在§20.4中作介绍。

Web数据库

为了能够让开发者像使用数据库那样来操作大量数据,很多主流的浏览器纷纷开始集成客户端数据库的功能。Safari、Chrome和Opera都内置了SQL数据库的客户端API。不幸的是,这类API的标准化工作以失败告终,并且Firefox和IE看样子也都不打算实现这种API。目前还有一种正在标准化的数据库API,称为“索引数据库API(Indexed Database API)”。调用该API返回的是一个不包含查询语言的简单数据库对象。这两种客户端数据库API都是异步的,都使用了事件处理机制(译注:类似DOM事件机制),这样的方式多多少少会显得有些复杂。本章中不会对他们做介绍,但是 §22.8 中会对索引数据库API作概要介绍同时会提供一些例子。

文件系统API

本书第8章介绍过现在主流浏览器都支持一个文件对象,用以将择的文件通过XMLHttpRequest上传到服务端。与之相关的规范(草案阶段)定义了一组API,用于操作一个私有的本地文件系统。在该文件系统中可以进行对文件的读写操作。这些内容正在紧锣密鼓标准化当中,这些API将在§22.7中作介绍。随着这些API被广泛地实现和支持,web应用可以使用类似基于文件的存储机制,这对于大部分程序员来说再熟悉不过了。

存储、安全和隐私

Web浏览器通常会提供“记住密码”功能,这些密码会以加密的形式安全地存储到硬盘上。然而,本章介绍的任何形式的客户端数据存储都不牵涉加密:任何存储在用户硬盘上的数据都是未加密的。这样一来,对于拥有电脑访问权限的恶意用户以及恶意软件(比如:间谍软件)同样也可以获取到存储的数据。因此,客户端存储不应该用来保存密码、商业账号或者其他类似的敏感信息。记住:尽管用户访问你的网站时,愿意在表单中输入一些信息,但绝不代表用户愿意将这些信息保存到硬盘上。就拿信用卡卡号来举例好了,这是用户的隐私,用户并不愿意公开,如果你利用客户端存储永久将该信息存储起来,这无异于你将信用卡号写在一张便签纸上,随后黏在用户的键盘上,让所有人都看到。 还有要谨记的一点:很多web用户不信任那些使用cookie和其他客户端存储机制来做类似“跟踪‘功能的网站。所以,尽量尝试用本章讨论的存储机制来为你的网站提升用户体验;而不是用它们来收集和侵犯隐私相关的数据。如果网站滥用客户端存储,用户将会禁用该功能,这样一来不仅起不到效果,还会导致依赖客户端存储的网站完全不可用。

20.1 localStorage 和 sessionStorage
实现了”Web存储“草案标准的浏览器在window对象上定义了两个属性:localStorage和sessionStorage。这两个属性都代表同一个Storage对象——一个持久化关联数组,数组使用字符串来索引,存储的值也都是字符串形式的。Storage对象在使用上和一般的JavaScript对象没什么区别:设置对象的属性为字符串值,随后浏览器会将该值存储起来。localStorage和sessionStorage两者的区别在于存储的有效期和作用域的不同:数据可以存储多长时间以及谁拥有数据的访问权。 Read More

[转]Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误。

今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷。

我参考的文献主要是Douglas Crockford的专著《Javascript语言精粹》(JavaScript: The Good Parts)和Fredrik Holmström的文章《我对Javascript的抱怨》(My gripes with Javascript)。

一、为什么Javascript有设计缺陷?

这里有三个客观原因,导致Javascript的设计不够完善。

1. 设计阶段过于仓促

Javascript的设计,其实只用了十天。而且,设计师是为了向公司交差,本人其实不愿意这样设计(参见《Javascript诞生记》)。

另一方面,这种语言的设计初衷,是为了解决一些简单的网页互动(比如,检查”用户名”是否填写),并没有考虑复杂应用的需要。设计者做梦也想不到,Javascript将来可以写出像Gmail这种极其庞大复杂的网页。 Read More

【转】关于脚本载入器的思考

最近看了一些脚本载入器的文章,包括很火的LABjs,controlJS,还有淘宝玉伯的seajs,很火的话题,也比较有争议!下面转一篇尼古拉斯的文章,我也同意作者的观点,希望很能够得到浏览器原生的支持!

第一篇日志的评论中有来自 Kyle Simpson 的批评 (Kyle 是另一个脚本载入器 LABjs 的创建者)。LABjs 目标和 ControlJS 有些不同:开启 JavaScript 文件的平行下载,同时管理执行顺序。为了要做到这点,LABjs 需要知道哪些浏览器支持平行下载,然后为不支持的浏览器提供其他解决方案。 Read More

找一个平衡点

好久没写博客了,最近比较忙,感觉有点累。不过好像也明白了一个道理,人都是有理想,然而通常情况下,现实却不尽如人意,怎么办呢。怎么样才会幸福呢?为什么有人会一直抱怨,为什么有些人会潦倒一生呢?或许他们还没有找到那个点,或许人生的很多时候都在寻找这样的点,我希望我的工作可以,让我做我喜欢的事,我希望工作能给我成就感,我希望工作能给我职场的机会,可是太多的人,太多的时候,都会那么几个因素不如意。怎么办,明白一个道理“现实不可能尽如人意,人活着也不能没有理想“,找一个平衡点,可以让我有所追求的活着,可以满足同事,公司还有其它对我的要求,我会奉献出我热情和能量,但是请给我一定要保留,我的热情和理想的火种!工作需要这个点,生活同样也需要,或许还有很多!找到了这样的点,人就会踏实了,我们也才可能专注下来,不管是做学问,或者是寻找到下一个的平衡点!

ie无法使用jquery解析xml

今天做一个区域配送部分,需要调用XML来显示各个地区的配送信息,但是用jquery调用xml时,IE总是提示xml文件加载失败,但是在Firefox中的结果却是成功的。代码如下:
[javascript]
$.ajax({
url:”codArea.xml”,
type: “GET”,
dataType: “xml”,
error: function(xml){
alert(‘Error loading XML document’+xml);
},
success: function(xml){
$(xml).find(“pName”).each(function(i){
$(“#province”).append(“<option id=”+i+”>”+$(this).text()+”</option>”);
});
}
});
[/javascript]
标准的jquery调用xml的方式,问题出在哪里呢百思不得其解,最后上网找到答案了,因为IE出于安全考虑,不允许浏览器去直接请求本地磁盘的文件。如果把文件上传到服务器就可以正常访问了,但是如果想在本地看效果,可修改适当的修改一下代码,如下:
[javascript]
$.ajax({
url:”codArea.xml”,
type: “GET”,
dataType: ($.browser.msie) ? “text” : “xml”,
error: function(xml){
alert(‘Error loading XML document’+xml);
},
success: function(data){
var xml;
if (typeof data == “string”) {
xml = new ActiveXObject(“Microsoft.XMLDOM”);
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
};
$(xml).find(“pName”).each(function(i){
$(“#province”).append(“<option id=”+i+”>”+$(this).text()+”</option>”);
});
}
});
[/javascript]

wordpress函数中文翻译

在讲述下面的WordPress函数之前,我们需要明确这样一点,所有的WordPress函数都是已经定义好的PHP函数,它们都需要写在PHP 语句中(<?php ?>)才能执行;而且,所有这些函数在PHP语句中都应以分号”;”结尾。其实,为了用好这些函数,为你的WordPress服务,你最好具有 PHP语言的基础。

1.bloginfo()

顾名思义,该函数主要用来显示博客信息;而且根据参数的不同,可以用来显示博客信息中的不同部分。常用的有以下几种:

bloginfo(’name’) 显示博客题名,如“月夜”;默认(不写参数)输出该项;

bloginfo(’description’) 显示博客描述部分,如“分享网络知识·享受快乐生活”;

bloginfo(’url’) 输出博客URL地址,如http://www.yueye.org;

bloginfo(’rss2_url’) 显示博客的RSS2.0 feed地址,如http://www.yueye.org/feed;

bloginfo(’template_url’) 用来获取WordPress博客的模板地址;

bloginfo(’charset’) 显示博客的编码方式,如“UTF-8”;

一种常见的使用bloginfo()函数的组合如下:

<a href=”<?php bloginfo(’url’); ?>” title=”<?php bloginfo(’description’); ?>” ><?php bloginfo(’name’); ?>

在月夜博客中,如上信息输出形如月夜的样式。这种形式通常会用来添加博客的底部信息,如Copyright @ 月夜,经常在主题模板中使用。

需要注意的是bloginfo()函数只能输出显示这些参量,如果你想在PHP语句中使用得到的这些值,则需使用get_bloginfo()函数,该函数和bloginfo()使用相同的参数,获得相同的结果。 Read More

【转】WEB移动应用框架构想

iUI、jQTouch、WPTouch、PhoneGap、XUI、iWebkit、Rhodes、gwt-mobile…当我们已经开始惊 叹 web移动应用充斥着各种各样框架与类库的时候,其实各大web框架才刚刚开始他们的移动领域:Yahoo的YUI3.2的Touch版、jQuery的 jQueryMobile、ExtJS整合JQTouch和Raphaël库推出的Sencha Touch框架。。。

ExtJs更名为Sencha的确让我震惊不少,毕竟自己也曾是ExtJs框架的粉丝,如此重量级的框架忽然掉头往mobile touch的方向发展,确实不是一件易事,我们也不禁惊叹移动应用所带来的重大改变。

OK,在这里我并不是想跟大家介绍各种web移动应用框架的用法介绍和性能对比。只是受ExtJs的影响,以及想知道自己到底去到一个什么程 度,以及更好 的积累沉淀下前端的经验,于是我开始构想一个好的web移动应用框架应该如何如何,并开始尝试着手实现。重复造轮子只是强迫自己更深入地去了解这个领域, 并不是自大到要挑战什么。于是分析对比了下,总结如下:

1.轻量级

这个应该是移动应用框架里最重要的一点,不要想着3G的普及还有wifi啥的,国情就是国情,要大部门用户在3秒内下载完你那100K的css 和js文件 是强人所难。因此我们的移动应用框架必须尽可能的轻量化,所有的命名和函数实现方法都要尽可能的简练和高度压缩。抛掉那些PC上web应用的特效和组件 吧,不要为了一个菜单效果把7,80K的jQuery.js加在你的页面上。

2.主流手机浏览器兼容性

面对如此多的手机平台和浏览器,要你的移动应用在所有浏览器上表现如一是很困难的,有时候你需要对不同浏览器加载不同的样式文件,又或是运行不 一样的函数 来实现效果。因此我们的框架必须有能识别各种主流浏览器的方法,具体点,你的框架必须能区分如iPhone、iPad、Android、Windows Phone等,OK,再国情化一点,QQ手机浏览器和UCWeb。最后要注意的是这里尽量不用UA的方法来判断,因为各浏览器的 avigator.userAgent都很不可靠,这里可以参考下mooltools判断浏览器的思路,应用到我们的移动领域上。 Read More

区别中英文截取字符(二)

是为了对上一篇“区别中英文截取字符”做个补充纠正,其中有一点,我是概念上混淆了,一个UTF-8中文字确实是占了3个字节,但是字符宽度还是2个字符宽度,所以造成了UTF-8下,截取相同数量的字符,但是宽度却不相同,更正后的代码还是有一定的局限性,就是要用等宽字体“如宋体,sans-serif”,但是如果你定义成了非等宽字体就不适用了如“Arial”,举个最简单的例子“a”,”w”这两个字母定义成“Arial”的时候,它们的宽度是不相等的。希望大家能提供更好的思路来解决这个问题,fixtext插件代码如下:
[javascript]
(function(){
$.fn.fixtext=function(options){
var defaults={
ellipsis:true,
maxLen:”15″
}
var options = $.extend(defaults, options);
this.each(function(){
var fixobj=$(this);
var currentStr=”";
var text=$(fixobj).html();
var textlen=text.length;
//判断是否保留省略号
options.maxLen=(options.ellipsis)?options.maxLen-4:options.maxLen;
for(var i=0,len=textlen;i<len; i++){
currentStr+=text.charAt(i);
if(getCharLength(currentStr)>options.maxLen){
//不保留里省略号的文字内容
text2=text.substr(0,i);
//保留里省略号的文字内容
if(options.ellipsis){text2=text2+”……”}
$(fixobj).html(text2);
return;
}
else{
$(fixobj).html(currentStr);
}
}
//计算截取字符的长度
function getCharLength(str){
var charLen=0;
for (var i=0,len=str.length; i<len; i++){
if(str.charCodeAt(i)>255){
charLen+=2;
}
else{
charLen+=1
}
}
return charLen;
}
})
}
})(jQuery)
[/javascript]

Demo : http://www.rainboys.cn/demo/fixtext.html

插件下载地址:http://www.rainboys.cn/demo/js/fixtext.js

区别中英文截取字符

最近很忙,博客很久没有更新了,今天抽出了一点闲暇时间,动手写了这个“区别中英文截取固定字符”的jQuery插件,暂且命名为fixtext吧,相信前端的兄弟们,这种情况会经常遇到,但是一直找不到太完美的解决办法,通常下用css截取,但是css有弊端,最令人不满意的是,限定宽度后有可能会截掉不完整的字符,相当的不雅,后台截取当然最好,但是多数情况下PD不一定愿意干这个活。今天特意写了这个插件,基本能满足大家的工作需要了,包括中英文混排的文字,并且可以区分UTF-8,和GB2312,这样大家应该清楚,中文的编码不一样占的字符也是不一样的,UTF-8占了三个字符,而GB2312占了两个字符,另外还包括一个非常实用的功能——是否保留省略号,用起来还算方便吧。
fixtext插件源码:
[javascript]
/*
* fixtext 0.1
* Copyright (c) 2010 Rainboy http://www.rainboys.cn/
* Date: 2010-07-26
* 区别中英文截取字符
*/
(function(){
$.fn.fixtext=function(options){
var defaults={
ellipsis:true,
maxLen:”15″
}
var options = $.extend(defaults, options);
this.each(function(){
var fixobj=$(this);
//判断网页的编码方式,如果是UTF-8那么一个汉字就占3个字符,如果GB2312一个汉字占2个字符
var webcode;
webcode=(document.characterSet)?document.characterSet:document.charset;
incre=(webcode.toUpperCase()==”GB2312″)?2:3;
var currentStr=”";
var text=$(fixobj).html();
var textlen=text.length;
//判断是否保留省略号
options.maxLen=(options.ellipsis)?options.maxLen-2*incre:options.maxLen;
for(var i=0,len=textlen;i<len; i++){
currentStr+=text.charAt(i);
if(getCharLength(currentStr,incre)>options.maxLen){
//不保留里省略号的文字内容
text2=text.substr(0,i);
//保留里省略号的文字内容
if(options.ellipsis){text2=text2+”……”}
$(fixobj).html(text2);
return;
}
else{
$(fixobj).html(currentStr);
}
}
//计算截取字符的长度
function getCharLength(str,incre){
var charLen=0;
for (var i=0,len=str.length; i<len; i++){
if(str.charCodeAt(i)>255){
charLen+=incre;
}
else{
charLen+=1
}
}
return charLen;
}
})
}
})(jQuery)
[/javascript]
引用脚本
[javascript]
$(要截取的对象).fixtext({ellipsis:false,maxLen:”20″});
[/javascript]
这里面包括了两个参数ellipsis和maxLen,顾名思义,ellipsis它就是决定是否保留省略号的,当他的参数是“true”的时候,就保留省略号,“false”时就不保留省略号,maxLen就是截取的字符长度,有一点提醒一下大家,maxLen包括省略号的长度,比如要截取20个字符,并且保留省略号,如果页面编码是GB2312,那么截取的字符就是16个。插件的源代码就不解释了,注释已经很详细了。童鞋们使用过程中遇到了问题的话,请给我留言!欢迎大家来交流!

Demo : http://www.rainboys.cn/demo/fixtext.html

插件下载地址:http://www.rainboys.cn/demo/js/fixtext.js