Tag: javascript

那些相见恨晚的 JavaScript 技巧

JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript 程序员,也未能完全吃透。本文从7个方面讲述 JavaScript 中那些你不很熟知但非常实用的技巧。

简略语句
JavaScript 可以使用简略语句快速创建对象和数组,比如下面的代码:

可以使用简略语句如下:

对象 car 就此创建,不过需要特别注意,结束花括号前一定不要加 “;” 否则在 IE 会遇到很大麻烦。

创建数组的传统方法是:

使用简略语句则:

另一个可以使用简略语句的地方是条件判断语句:

可以简略为:

JSON 数据格式
JSON 是 “JavaScript Object Notation” 的缩写,由 Douglas Crockford 设计,JSON 改变了 JavaScript 在缓存复杂数据格式方面的困境,如下例,假如你要描述一个乐队,可以这样写:

你可以在 JavaScript 中直接使用 JSON,甚至作为某些 API 的返回数据对象,以下代码调用著名书签网站 delicious.com 的一个 API,返回你在该网站的所有书签,并显示在你自己的网站:

JavaScript 本地函数 (Math, Array 和 String)
JavaScript 有很多内置函数,有效的使用,可以避免很多不必要的代码,比如,从一个数组中找出最大值,传统的方法是:

使用内置函数可以更容易实现:

另一个方法是使用 Math.max() 方法:

你可以用这个方法帮助探测浏览器

这解决了 IE 浏览器的一个问题,通过这种方法,你总是可以找到那个正确的值,因为浏览器不支持的那个值会返回 undefined。

还可以使用 JavaScript 内置的 split() 和 join() 函数处理 HTML 对象的 CSS 类名,如果 HTML 对象的类名是空格隔开的多个名字,你在为它追加或删除一个 CSS 类名的时候需要特别注意,如果该对象还没有类名属性,可以直接将新的类名赋予它,如果已经存在类名,新增的类名前必须有一个空格,用传统的 JavaScript 方法是这样实现的:

使用 split 和 join 方法则直观优雅得多:

事件代理
与其在 HTML 文档中设计一堆事件,不如直接设计一个事件代理,举例说明,假如你有一些链接,用户点击后不想打开链接,而是执行某个事件,HTML 代码如下:

传统的事件处理是遍历各个链接,加上各自的事件处理:

使用事件代理,可以直接处理,无需遍历:

匿名函数与 Module 模式
JavaScript 的一个问题是,任何变量,函数或是对象,除非是在某个函数内部定义,否则,就是全局的,意味着同一网页的别的代码可以访问并改写这个变量(ECMA 的 JavaScript 5 已经改变了这一状况 – 译者),使用匿名函数,你可以绕过这一问题。

比如,你有这样一段代码,很显然,变量 name, age, status 将成为全局变量

为了避免这一问题,你可以使用匿名函数:

如果这个函数不会被调用,可以更直接为:

如果要访问其中的对象或函数,可以:

这就是所谓 Module 模式或单例模式(Singleton),该模式为 Douglas Crockford 所推崇,并被大量应用在 Yahoo User Interface Library YUI。

假如你想在别的地方调用里面的方法,又不想在调用前使用 myApplication 这个对象名,可以在匿名函数中返回这些方法,甚至用简称返回:

代码配置
别人使用你编写的 JavaScript 代码的时候,难免会更改某些代码,但这会很困难,因为不是每个人都很容易读懂别人的代码,与其这样,不如创建一个代码配置对象,别人只需要在这个对象中更改某些配置即可实现代码的更改。这里有一篇 JavaScript 配置对象详解的文章,简单说:

在代码中创建一个叫做 configuration 的对象
里面保存所有可以更改的配置,如 CSS ID 和类名,按钮的标签文字,描述性文字,本地化语言设置
将该对象设置为全局对象,以便别人直接访问并改写
你应当在最后一步做这项工作,这里有一个文章,交付代码前的5件事值的参考。

同后台交互
JavaScript 是一门前台语言,你需要别的语言同后台交互,并返回数据,使用 AJAX,你可以让 JavaScript 直接使用同后台的交互,将复杂的数据处理交由后台处理。

JavaScript 框架
自己编写适应各种浏览器的代码是完全浪费时间,应当选择一个 JavaScript 框架,让这些复杂的事情交给框架处理。

更多资源
Douglas Crockford on JavaScript
JavaScript 深度视频教程
The Opera Web Standards Curriculum
JavaScript 详解
延伸阅读
有关 JavaScript 的 10 件让人费解的事情
新 API 寻求让 JavaScript 操作本地文件
让 JavaScript 拯救 HTML5 的离线存储
开源项目越来越青睐 JavaScript
Javascript 是一个错误吗?
Javascript 2 前途尘埃落定
Google 排名中的 10 个最著名的 JavaScript 库
ECMA 推出 JavaScript 5
本文国际来源:Smashing Magazine Seven JavaScript Things I Wish I Knew Much Earlier In My Career (原文作者:Christian Heilmann)

中文编译来源:锐商企业CMS 网站内容管理系统 官方网站


jQuery使用技巧

1、关于页面元素的引用
通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

2、jQuery对象与dom对象的转换
只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是 jquery对象。
普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById(”msg”))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$(”#msg”)[0],$(”div”).eq(1)[0],$(”div”).get()[1],$(”td”)[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:
$(”#msg”).html();
$(”#msg”)[0].innerHTML;
$(”#msg”).eq(0)[0].innerHTML;
$(”#msg”).get(0).innerHTML;

3、如何获取jQuery集合的某一项
对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而 get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个

元素的内容。有如下两种方法:
$(”div”).eq(2).html(); //调用jquery对象的方法
$(”div”).get(2).innerHTML; //调用dom的方法属性

4、同一函数实现set和get
Jquery中的很多方法都是如此,主要包括如下几个:
$(”#msg”).html(); //返回id为msg的元素节点的html内容。
$(”#msg”).html(”new content“);
//将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content

$(”#msg”).text(); //返回id为msg的元素节点的文本内容。
$(”#msg”).text(”new content“);
//将“new content” 作为普通文本串写入id为msg的元素节点内容中,页面显示new content

$(”#msg”).height(); //返回id为msg的元素的高度
$(”#msg”).height(”300″); //将id为msg的元素的高度设为300
$(”#msg”).width(); //返回id为msg的元素的宽度
$(”#msg”).width(”300″); //将id为msg的元素的宽度设为300

$(”input”).val(”); //返回表单输入框的value值
$(”input”).val(”test”); //将表单输入框的value值设为test

$(”#msg”).click(); //触发id为msg的元素的单击事件
$(”#msg”).click(fn); //为id为msg的元素单击事件添加函数
同样blur,focus,select,submit事件都可以有着两种调用方法

5、集合处理功能
对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
包括两种形式:
$(”p”).each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为索引分别为0,1,2的p元素分别设定不同的字体颜色。

$(”tr”).each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果

$(”p”).click(function(){alert($(this).html())})
//为每个p元素增加了click事件,单击某个p元素则弹出其内容

6、扩展我们需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //为jquery扩展了min,max两个方法
使用扩展的方法(通过“$.方法名”调用):
alert(”a=10,b=20,max=”+$.max(10,20)+”,min=”+$.min(10,20));

7、支持方法的连写
所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
例如:
$(”p”).click(function(){alert($(this).html())})
.mouseover(function(){alert(’mouse over event’)})
.each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]});

8、操作元素的样式
主要包括以下几种方式:
$(”#msg”).css(”background”); //返回元素的背景颜色
$(”#msg”).css(”background”,”#ccc”) //设定元素背景为灰色
$(”#msg”).height(300); $(”#msg”).width(”200″); //设定宽高
$(”#msg”).css({ color: “red”, background: “blue” });//以名值对的形式设定样式
$(”#msg”).addClass(”select”); //为元素增加名称为select的class
$(”#msg”).removeClass(”select”); //删除元素名称为select的class
$(”#msg”).toggleClass(”select”); //如果存在(不存在)就删除(添加)名称为select的class

9、完善的事件处理功能
Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
如:
$(”#msg”).click(function(){alert(”good”)}) //为元素添加了单击事件
$(”p”).click(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为三个不同的p元素单击事件分别设定不同的处理
jQuery中几个自定义的事件:
(1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
//当鼠标放在表格的某行上时将class置为over,离开时置为out。
$(”tr”).hover(function(){
$(this).addClass(”over”);
},
function(){
$(this).addClass(”out”);
});
(2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
$(document).ready(function(){alert(”Load Success”)})
//页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价
(3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
//每次点击时轮换添加和删除名为selected的class。
$(”p”).toggle(function(){
$(this).addClass(”selected”);
},function(){
$(this).removeClass(”selected”);
});
(4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
例如:
$(”p”).trigger(”click”); //触发所有p元素的click事件
(5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
从每一个匹配的元素中(添加)删除绑定的事件。
例如:
$(”p”).bind(”click”, function(){alert($(this).text());}); //为每个p元素添加单击事件
$(”p”).unbind(); //删除所有p元素上的所有事件
$(”p”).unbind(”click”) //删除所有p元素上的单击事件

10、几个实用特效功能
其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。

11、几个有用的jQuery方法
$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。

$.each( [0,1,2], function(i, n){ alert( “Item #” + i + “: ” + n ); });
等价于:
var tempArr=[0,1,2];
for(var i=0;i alert("Item #"+i+": "+tempArr[ i ]);
}
也可以处理json数据,如
$.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " + i + ", Value: " + n ); });
结果为:
Name:name, Value:John
Name:lang, Value:JS
$.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
如:
$.extend(settings, options);
//合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在 setting中。
var settings = $.extend({}, defaults, options);
//合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
可以有多个参数(合并多项并返回)
$.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
如:
var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr内容为:[4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr内容为:[2,3]
$.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):删除字符串两端的空白字符。
如:$.trim(” hello, how are you? “); //返回”hello,how are you? ”

12、解决自定义方法或其他类库与jQuery的冲突
很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用 Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$(”#msg”)改为jQuery(”#msg”)。
如:
jQuery.noConflict();
// 开始使用jQuery
jQuery(”div p”).hide();
// 使用其他库的 $()
$(”content”).style.display = ‘none’;
========================================================================================================
以上资料从网上转载而来,因同事需要提供给同事,现发在这里供大家共享。


JS判断浏览器类型及版本

你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器。

几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的Chrome浏览器。由于Chrome出生名门,尽管他还是个小家伙,没有人敢小看他。以后,咱们常说浏览器的“四大才子”就得改称为“五朵金花”了。

在网站前端开发中,浏览器兼容性问题本已让我们手忙脚乱,Chrome的出世不知道又要给我们添多少乱子。虽然说现在有一些WEB技术(AJAX、ExtJS等)已经帮我们处理不同浏览器的兼容问题,但是有时候自己来解决岂不是更好,浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本。

JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。

我们先来分析一下各种浏览器的特征及其userAgent。

IE

只有IE支持创建ActiveX控件,因此她有一个其他浏览器没有的东西,就是ActiveXObject函数。只要判断window对象存在 ActiveXObject函数,就可以明确判断出当前浏览器是IE。而IE各个版本典型的userAgent如下:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)

其中,版本号是MSIE之后的数字。

Firefox

Firefox中的DOM元素都有一个getBoxObjectFor函数,用来获取该DOM元素的位置和大小(IE对应的中是 getBoundingClientRect函数)。这是Firefox独有的,判断它即可知道是当前浏览器是Firefox。Firefox几个版本的 userAgent大致如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12

其中,版本号是Firefox之后的数字。

Opera

Opera提供了专门的浏览器标志,就是window.opera属性。Opera典型的userAgent如下:

Opera/9.27 (Windows NT 5.2; U; zh-cn)
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0

其中,版本号是靠近Opera的数字。

Safari

Safari浏览器中有一个其他浏览器没有的openDatabase函数,可做为判断Safari的标志。Safari典型的userAgent如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3

其版本号是Version之后的数字。

Chrome

Chrome有一个MessageEvent函数,但Firefox也有。不过,好在Chrome并没有Firefox的getBoxObjectFor 函数,根据这个条件还是可以准确判断出Chrome浏览器的。目前,Chrome的userAgent是:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

其中,版本号在Chrome只后的数字。

有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧。

只要了解了以上信息,我们就可以根基这些特征来判断浏览器类型及其版本了。我们会将判断的结果保存在Sys名字空间中,成为前端框架的基本标志信息,供今后的程序来读取。如果判断出谋种浏览器,Sys名字空间将有一个该浏览器名称的属性,其值为该浏览器的版本号。例如,如果判断出IE 7.0,则Sys.ie的值为7.0;如果判断出Firefox 3.0,则Sys.firefox的值为3.0。下面是判断浏览器的代码:


我们把对IE的判断放在第一,因为IE的用户最多,其次是判断Firefox。按使用者多少的顺序来判断浏览器类型,可以提高判断效率,少做无用功。之所以将Chrome放在第三判断,是因为我们预测Chrome很快会成为市场占有率第三的浏览器。其中,在分析浏览器版本时,用到了正则表达式来析取其中的版本信息。

如果你的JavaScript玩得很高,你还可以将前面的判断代码写成这样:


这样可以使JavaScript代码更精简些。当然,可读性稍差一些,就看你是重视效率还是重视可维护性了。

使用不同特征来判断浏览器的方法,虽然在速度上比用正则表达式分析userAgent要来的快,不过这些特征可能会随浏览器版本而变化。比如,一种浏览器本来独有的特性取得了市场上的成功,其他浏览器也就可能跟着加入该特性,从而使该浏览器的独有特征消失,导致我们的判断失败。因此,相对比较保险的做法是通过解析userAgent中的特征来判断浏览器类型。何况,反正判断版本信息也需要解析浏览器的userAgent的。

通过分析各类浏览器的userAgent信息,不难得出分辨各类浏览器及其版本的正则表达式。而且,对浏览器类型的判断和版本的判断完全可以合为一体地进行。于是,我们可以写出下面的代码:


其中,采用了“… ? … : …”这样的判断表达式来精简代码。判断条件是一条赋值语句,既完成正则表达式的匹配及结果复制,又直接作为条件判断。而随后的版本信息只需从前面的匹配结果中提取即可,这是非常高效的代码。

以上的代码都是为了打造前端框架所做的预研,并在五大浏览器上测试通过。今后,判断某种浏览器只需用if(Sys.ie)或 if(Sys.firefox)等形式,而判断浏览器版本只需用if(Sys.ie == ‘8.0′)或if(Sys.firefox == ‘3.0′)等形式,表达起来还是非常优雅的。

前端框架项目已经启动,一切就看过程和结果了…
转自:http://blog.sina.com.cn/s/blog_3ef2a82a0100f1y3.html


js-精华-数组

标准javascript 是内含支持hash关联数组[ ] 和 {} 中的值是以 , (逗号)分隔key值是字符串可以不加引号, 但访问的时候需要加
定义空数组
//Hash关联数组定义
myhash = { }
//[]定义 一唯数组
myArray = [];
//用Array 定义
myArray = new Array();
直接定义数组
//关联数组 带key
myhash = {’key1′:’val1′, ‘key2′:’val2′ };
//多唯
myArray = {
‘key1′ : ‘val1′,
‘key2′ : {
‘key2-1′ : ‘val2-1′,
‘key2-2′ : ‘val2-2′
},
3 : 3
};
//数字作索引 访问 alert(childArr['父选项值1'][0]['val']); output:选项值1
//key值可以不加引号
childArr['父选项值1'] = [
{txt:"选项名1", val:"选项值1"},
{txt:"选项名2", val:"选项值2"},
{txt:"选项名3", val:"选项值3"},
{txt:"选项名n", val:"选项值n"}
]
//数字作索引 0开始
myArray = [1,2,3,'val4'];
用Array 定义数组
myhash = new Array();
myhash['key1'] = ‘val1′;
myhash['key2'] = ‘val2′;
添加一个新键 newkey, 键值为 newval
myhash['newkey'] = ‘newval’;
删除Hash关联数组已有键值
delete myhash['newkey'];
遍历Hash关联数组
for (key in myhash) {
value = myhash[key];
}
//递归遍历数组
function dumpArray(myArray){
for(key in myArray) {
value = myArray[key];
if (typeof value == ‘object’) {
dumpArray(value);
} else {
document.write(key+’:'+value+’
‘);
}
}
}
获取数组所有key
function array_keys(hash) {
keys = [];
for (key in hash) {
keys.push(key);
}
return keys;
}
随机取数组的一个值
var arrName = ["one","two","three","four"];
arrName[Math.ceil(Math.random()*arrName.length)-1];


JS代码在IE和Firefox间的区别

1. HTML 对象的 id 作为对象名的问题
IE:HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用
FF:不支持
解决方法:使用document.getElementById替代document.all

2. 如果控件只有name,没有id, 用getElementById时:
IE:可以找到对象
FF:返回NULL
解决方法:所有控件必须设置ID属性

3. Evel:
IE:支持,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象
FF:不支持。
解决方法:统一使用getElementById(idName) 代替 eval(idName)。

4. Event:
IE:用全局对象window.event
FF:event只能在事件发生的现场使用,在调用函数时传入event对象
解决方法:使用之前做一下浏览器类型判断,各用各的。

5. 对象名称中美元符号‘$’改为使用下划线‘_’

6. 集合类对象问题
IE:可以使用()或[]获取集合类对象
FF:只能使用[]获取集合类对象
现有代码中存在许多,不能在 FF 下运行
解决方法:统一使用[]获取集合类对象。document.form.item(”itemName”) 这样的语句改为document.form.elements["elementName"]

7. 变量名与某 HTML 对象 id 相同的问题
IE:不能使用与 HTML 对象 id 相同的变量名
FF:可以使用
解决方法:在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。

8. Event定位问题
IE:支持event.x 和event.y
FF:支持event.pageX和event.pageY
解决方法,统一使用event.clientX和event.clientY,但是在FF中event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。如果要完全一样,可以判断浏览器类型后对应使用。

9. 父结点的问题
IE:parentElement parentElement.children
FF:parentNode parentNode.childNodes
childNodes的下标的含义在IE和FF中不同,FF使用DOM规范,childNodes中会插入空白文本节点。一般可以通过node.getElementsByTagName()来回避这个问题。

当html中节点缺失时,IE和FF对parentNode的解释不同,例如

IE:input.parentNode的值为空节点
FF:input.parentNode的值为form
FF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

10. const 问题
现有问题:
IE:不支持 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
FF:支持
解决方法:不使用 const ,以 var 代替。

11. body 对象
IE:在body标签完全被读入之后才存在
FF:在body标签没有被浏览器完全读入之前就存在

12. 自定义属性问题
IE:可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性
FF:只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性

13. event.srcElement问题
IE:even.srcElement
FF:even.target
解决方法:使用时判断浏览器类型,各用各的。

14. 模态和非模态窗口
IE:支持模态和非模态窗口
FF:不支持
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口。如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。

15. innerText
IE:innerText
FF:textContent

16. 类似 obj.style.height = imgObj.height 的语句
IE:有效
FF:无效
解决方法:统一使用obj.style.height = imgObj.height + ‘px’;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nileel/archive/2009/08/19/4461687.aspx


24 JavaScript Best Practices for Beginners

1. Use === Instead of ==

JavaScript utilizes two different kinds of equality operators: === | !== and == | != It is considered best practice to always use the former set when comparing.

“If two operands are of the same type and value, then === produces true and !== produces false.” – JavaScript: The Good Parts

However, when working with == and !=, you’ll run into issues when working with different types. In these cases, they’ll try to coerce the values, unsuccessfully.

2. Eval = Bad

For those unfamiliar, the “eval” function gives us access to JavaScript’s compiler. Essentially, we can execute a string’s result by passing it as a parameter of “eval”.

Not only will this decrease your script’s performance substantially, but it also poses a huge security risk because it grants far too much power to the passed in text. Avoid it!

3. Don’t Use Short-Hand

Technically, you can get away with omitting most curly braces and semi-colons. Most browsers will correctly interpret the following:

  • if(someVariableExists) ??
  • ???x?=?false??
  • if(someVariableExists)
       x = false

    However, consider this:

  • if(someVariableExists) ??
  • ???x?=?false??
  • ???anotherFunctionCall();??
  • if(someVariableExists)
       x = false
       anotherFunctionCall();

    One might think that the code above would be equivalent to:

  • if(someVariableExists)?{ ??
  • ???x?=?false; ??
  • ???anotherFunctionCall(); ??
  • }??
  • if(someVariableExists) {
       x = false;
       anotherFunctionCall();
    }

    Unfortunately, he’d be wrong. In reality, it means:

  • if(someVariableExists)?{ ??
  • ???x?=?false; ??
  • } ??
  • anotherFunctionCall();??
  • if(someVariableExists) {
       x = false;
    }
    anotherFunctionCall();

    As you’ll notice, the indentation mimics the functionality of the curly brace. Needless to say, this is a terrible practice that should be avoided at all costs. The only time that curly braces should be omitted is with one-liners, and even this is a highly debated topic.

  • if(2?+?2?===?4)?return?‘nicely?done’;??
  • if(2 + 2 === 4) return 'nicely done';

    Always Consider the Future

    What if, at a later date, you need to add more commands to this if statement. In order to do so, you would need to rewrite this block of code. Bottom line – tread with caution when omitting.

    4. Utilize JS Lint

    JSLint is a debugger written by Douglas Crockford. Simply paste in your script, and it’ll quickly scan for any noticeable issues and errors in your code.

    “JSLint takes a JavaScript source and scans it. If it finds a problem, it returns a message describing the problem and an approximate location within the source. The problem is not necessarily a syntax error, although it often is. JSLint looks at some style conventions as well as structural problems. It does not prove that your program is correct. It just provides another set of eyes to help spot problems.”
    - JSLint Documentation

    Before signing off on a script, run it through JSLint just to be sure that you haven’t made any mindless mistakes.

    5. Place Scripts at the Bottom of Your Page

    This tip has already been recommended in the previous article in this series. As it’s highly appropriate though, I’ll paste in the information.

    Place JS at bottom

    Remember — the primary goal is to make the page load as quickly as possible for the user. When loading a script, the browser can’t continue on until the entire file has been loaded. Thus, the user will have to wait longer before noticing any progress.

    If you have JS files whose only purpose is to add functionality — for example, after a button is clicked — go ahead and place those files at the bottom, just before the closing body tag. This is absolutely a best practice.

    Better

  • <p>And?now?you?know?my?favorite?kinds?of?corn.?</p>??
  • ?<script?type=“text/javascript”?src=“path/to/file.js”></script>??
  • ?<script?type=“text/javascript”?src=“path/to/anotherFile.js”></script>??
  • ?</body>??
  • ?</html>??
  • <p>And now you know my favorite kinds of corn. </p>
    <script type="text/javascript" src="path/to/file.js"></script>
    <script type="text/javascript" src="path/to/anotherFile.js"></script>
    </body>
    </html>

    6. Declare Variables Outside of the For Statement

    When executing lengthy “for” statements, don’t make the engine work any harder than it must. For example:

    Bad

  • for(var?i?=?0;?i?<?someArray.length;?i++)?{ ??
  • ???var?container?=?document.getElementById(‘container’); ??
  • ???container.innerHtml?+=?‘my?number:?’?+?i; ??
  • ???console.log(i); ??
  • }??
  • for(var i = 0; i < someArray.length; i++) {
       var container = document.getElementById('container');
       container.innerHtml += 'my number: ' + i;
       console.log(i);
    }

    Notice how we must determine the length of the array for each iteration, and how we traverse the dom to find the “container” element each time — highly inefficient!

    Better

  • var?container?=?document.getElementById(‘container’); ??
  • ?for(var?i?=?0,?len?=?someArray.length;?i?<?len;??i++)?{ ??
  • ???container.innerHtml?+=?‘my?number:?’?+?i; ??
  • ???console.log(i); ??
  • }??
  • var container = document.getElementById('container');
    for(var i = 0, len = someArray.length; i < len;  i++) {
       container.innerHtml += 'my number: ' + i;
       console.log(i);
    }

    Bonus points to the person who leaves a comment showing us how we can further improve the code block above.

    7. The Fastest Way to Build a String

    Don’t always reach for your handy-dandy “for” statement when you need to loop through an array or object. Be creative and find the quickest solution for the job at hand.

  • var?arr?=?['item?1',?'item?2',?'item?3',?...]; ??
  • ?var?list?=?‘<ul><li>’?+?arr.join(‘</li><li>’)?+?‘</li></ul>’;??
  • var arr = ['item 1', 'item 2', 'item 3', ...];
    var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';

    I won’t bore you with benchmarks; you’ll just have to believe me (or test for yourself) – this is by far the fastest method!

    Using native methods (like join()), regardless of what’s going on behind the abstraction layer, is usually much faster than any non-native alternative.
    - James Padolsey, james.padolsey.com

    8. Reduce Globals

    “By reducing your global footprint to a single name, you significantly reduce the chance of bad interactions with other applications, widgets, or libraries.”
    - Douglas Crockford

  • var?name?=?‘Jeffrey’; ??
  • ?var?lastName?=?‘Way’; ??
  • ??
  • ?function?doSomething()?{…} ??
  • ??
  • console.log(name);?//?Jeffrey?–?or?window.name??
  • var name = 'Jeffrey';
    var lastName = 'Way';
    
    function doSomething() {...}
    
    console.log(name); // Jeffrey -- or window.name

    Better

  • var?DudeNameSpace?=?{ ??
  • ???name?:?‘Jeffrey’, ??
  • ???lastName?:?‘Way’, ??
  • ???doSomething?:?function()?{…} ??
  • } ??
  • console.log(DudeNameSpace.name);?//?Jeffrey??
  • var DudeNameSpace = {
       name : 'Jeffrey',
       lastName : 'Way',
       doSomething : function() {...}
    }
    console.log(DudeNameSpace.name); // Jeffrey

    Notice how we’ve “reduced our footprint” to just the ridiculously named “DudeNameSpace” object.

    9. Comment Your Code

    It might seem unnecessary at first, but trust me, you WANT to comment your code as best as possible. What happens when you return to the project months later, only to find that you can’t easily remember what your line of thinking was. Or, what if one of your colleagues needs to revise your code? Always, always comment important sections of your code.

  • //?Cycle?through?array?and?echo?out?each?name.? ??
  • ?for(var?i?=?0,?len?=?array.length;?i?<?len;?i++)?{ ??
  • ???console.log(array[i]); ??
  • }??
  • // Cycle through array and echo out each name.
    for(var i = 0, len = array.length; i < len; i++) {
       console.log(array[i]);
    }

    10. Embrace Progressive Enhancement

    Always compensate for when JavaScript is disabled. It might be tempting to think, “The majority of my viewers have JavaScript enabled, so I won’t worry about it.” However, this would be a huge mistake.

    Have you taken a moment to view your beautiful slider with JavaScript turned off? (Download the Web Developer Toolbar for an easy way to do so.) It might break your site completely. As a rule of thumb, design your site assuming that JavaScript will be disabled. Then, once you’ve done so, begin to progressively enhance your layout!

    11. Don’t Pass a String to “SetInterval” or “SetTimeOut”

    Consider the following code:

  • setInterval( ??
  • ?“document.getElementById(’container’).innerHTML?+=?’My?new?number:?’?+?i”,?3000 ??
  • );??
  • setInterval(
    "document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
    );

    Not only is this code inefficient, but it also functions in the same way as the “eval” function would. Never pass a string to SetInterval and SetTimeOut. Instead, pass a function name.

  • setInterval(someFunction,?3000);??
  • setInterval(someFunction, 3000);

    12. Don’t Use the “With” Statement

    At first glance, “With” statements seem like a smart idea. The basic concept is that they can be used to provide a shorthand for accessing deeply nested objects. For example…

  • with?(being.person.man.bodyparts)?{ ??
  • ???arms?=?true; ??
  • ???legs?=?true; ??
  • }??
  • with (being.person.man.bodyparts) {
       arms = true;
       legs = true;
    }

    – instead of –

  • being.person.man.bodyparts.arms?=?true; ??
  • being.person.man.bodyparts.legs=?true;??
  • being.person.man.bodyparts.arms = true;
    being.person.man.bodyparts.legs= true;

    Unfortunately, after some testing, it was found that they “behave very badly when setting new members.” Instead, you should use var.

  • var?o?=?being.person.man.bodyparts; ??
  • o.arms?=?true; ??
  • o.legs?=?true;??
  • var o = being.person.man.bodyparts;
    o.arms = true;
    o.legs = true;

    13. Use {} Instead of New Object()

    There are multiple ways to create objects in JavaScript. Perhaps the more traditional method is to use the “new” constructor, like so:

  • var?o?=?new?Object(); ??
  • o.name?=?‘Jeffrey’; ??
  • o.lastName?=?‘Way’; ??
  • o.someFunction?=?function()?{ ??
  • ???console.log(this.name); ??
  • }??
  • var o = new Object();
    o.name = 'Jeffrey';
    o.lastName = 'Way';
    o.someFunction = function() {
       console.log(this.name);
    }

    However, this method receives the “bad practice” stamp without actually being so. Instead, I recommend that you use the much more robust object literal method.

    Better

  • var?o?=?{ ??
  • ???name:?‘Jeffrey’, ??
  • ???lastName?=?‘Way’, ??
  • ???someFunction?:?function()?{ ??
  • ??????console.log(this.name); ??
  • ???} ??
  • };??
  • var o = {
       name: 'Jeffrey',
       lastName = 'Way',
       someFunction : function() {
          console.log(this.name);
       }
    };

    Note that if you simply want to create an empty object, {} will do the trick.

  • var?o?=?{};??
  • var o = {};

    “Objects literals enable us to write code that supports lots of features yet still make it a relatively straightforward for the implementers of our code. No need to invoke constructors directly or maintain the correct order of arguments passed to functions, etc.” – dyn-web.com

    14. Use [] Instead of New Array()

    The same applies for creating a new array.

    Okay

  • var?a?=?new?Array(); ??
  • a[0]?=?“Joe”; ??
  • a[1]?=?‘Plumber’;??
  • var a = new Array();
    a[0] = "Joe";
    a[1] = 'Plumber';

    Better

  • var?a?=?['Joe','Plumber'];??
  • var a = ['Joe','Plumber'];

    “A common error in JavaScript programs is to use an object when an array is required or an array when an object is required. The rule is simple: when the property names are small sequential integers, you should use an array. Otherwise, use an object.” – Douglas Crockford

    15. Long List of Variables? Omit the “Var” Keyword and Use Commas Instead

  • var?someItem?=?’some?string’; ??
  • ?var?anotherItem?=?‘another?string’; ??
  • ?var?oneMoreItem?=?‘one?more?string’;??
  • var someItem = 'some string';
    var anotherItem = 'another string';
    var oneMoreItem = 'one more string';

    Better

  • var?someItem?=?’some?string’, ??
  • ????anotherItem?=?‘another?string’, ??
  • ????oneMoreItem?=?‘one?more?string’;??
  • var someItem = 'some string',
        anotherItem = 'another string',
        oneMoreItem = 'one more string';

    …Should be rather self-explanatory. I doubt there’s any real speed improvements here, but it cleans up your code a bit.

    17. Always, Always Use Semicolons

    Technically, most browsers will allow you to get away with omitting semi-colons.

  • var?someItem?=?’some?string’??
  • ?function?doSomething()?{ ??
  • ??return?’something’??
  • }??
  • var someItem = 'some string'
    function doSomething() {
      return 'something'
    }

    Having said that, this is a very bad practice that can potentially lead to much bigger, and harder to find, issues.

    Better

  • var?someItem?=?’some?string’; ??
  • ?function?doSomething()?{ ??
  • ??return?’something’; ??
  • }??
  • var someItem = 'some string';
    function doSomething() {
      return 'something';
    }

    18. “For in” Statements

    When looping through items in an object, you might find that you’ll also retrieve method functions as well. In order to work around this, always wrap your code in an if statement which filters the information

  • for(key?in?object)?{ ??
  • ???if(object.hasOwnProperty(key)?{ ??
  • ??????…then?do?something… ??
  • ???} ??
  • }??
  • for(key in object) {
       if(object.hasOwnProperty(key) {
          ...then do something...
       }
    }

    As referenced from JavaScript: The Good Parts, by Douglas Crockford.

    19. Use Firebug’s “Timer” Feature to Optimize Your Code

    Need a quick and easy way to determine how long an operation takes? Use Firebug’s “timer” feature to log the results.

  • function?TimeTracker(){ ??
  • ?console.time(“MyTimer”); ??
  • ?for(x=5000;?x?>?0;?x–){} ??
  • ?console.timeEnd(“MyTimer”); ??
  • }??
  • function TimeTracker(){
     console.time("MyTimer");
     for(x=5000; x > 0; x--){}
     console.timeEnd("MyTimer");
    }

    20. Read, Read, Read…

    While I’m a huge fan of web development blogs (like this one!), there really isn’t a substitute for a book when grabbing some lunch, or just before you go to bed. Always keep a web development book on your bedside table. Here are some of my JavaScript favorites.

    Read them…multiple times. I still do!

    21. Self-Executing Functions

    Rather than calling a function, it’s quite simple to make a function run automatically when a page loads, or a parent function is called. Simply wrap your function in parenthesis, and then append an additional set, which essentially calls the function.

  • (function?doSomething()?{ ??
  • ???return?{ ??
  • ??????name:?‘jeff’, ??
  • ??????lastName:?‘way’??
  • ???}; ??
  • })();??
  • (function doSomething() {
       return {
          name: 'jeff',
          lastName: 'way'
       };
    })();

    22. Raw JavaScript Can Always Be Quicker Than Using a Library

    JavaScript libraries, such as jQuery and Mootools, can save you an enormous amount of time when coding — especially with AJAX operations. Having said that, always keep in mind that a library can never be as fast as raw JavaScript (assuming you code correctly).

    jQuery’s “each” method is great for looping, but using a native “for” statement will always be an ounce quicker.

    23. Crockford’s JSON.Parse

    Although JavaScript 2 should have a built-in JSON parser, as of this writing, we still need to implement our own. Douglas Crockford, the creator of JSON, has already created a parser that you can use. It can be downloaded HERE.

    Simply by importing the script, you’ll gain access to a new JSON global object, which can then be used to parse your .json file.

  • var?response?=?JSON.parse(xhr.responseText); ??
  • ??
  • ?var?container?=?document.getElementById(‘container’); ??
  • ?for(var?i?=?0,?len?=?response.length;?i?<?len;?i++)?{ ??
  • ??container.innerHTML?+=?‘<LI>’?+?response[i].name?+?‘?:?’?+?response[i].email?+?‘</LI>’; ??
  • }??
  •  var response = JSON.parse(xhr.responseText);
    
     var container = document.getElementById('container');
     for(var i = 0, len = response.length; i < len; i++) {
       container.innerHTML += '
    
  • ' + response[i].name + ' : ' + response[i].email + ''; }
  • 24. Remove “Language”

    Years ago, it wasn’t uncommon to find the “language” attribute within script tags.

  • <script?type=“text/javascript”?language=“javascript”> ??
  • … ??
  • </script>??
  • <script type="text/javascript" language="javascript">
    ...
    </script>

    However, this attribute has long since been deprecated; so leave it out.


    JavaScript 获取客户端计算机硬件及系统信息

    通过WMI来实现获取客户端计算机硬件及系统信息:
    1//系统信息获取
    2function getSysInfo(){
    3 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
    4 var service = locator.ConnectServer(".");
    5 //CPU信息
    6 var cpu = new Enumerator (service.ExecQuery("SELECT * FROM Win32_Processor")).item();
    7 var cpuType=cpu.Name,hostName=cpu.SystemName;
    8 //内存信息
    9 var memory = new Enumerator (service.ExecQuery("SELECT * FROM Win32_PhysicalMemory"));
    10 for (var mem=[],i=0;!memory.atEnd();memory.moveNext()) mem={cap:memory.item().Capacity/1024/1024,speed:memory.item().Speed}
    11 //系统信息
    12 var system=new Enumerator (service.ExecQuery("SELECT * FROM Win32_ComputerSystem")).item();
    13 var physicMenCap=Math.ceil(system.TotalPhysicalMemory/1024/1024),curUser=system.UserName,cpuCount=system.NumberOfProcessors
    14
    15 return {cpuType:cpuType,cpuCount:cpuCount,hostName:hostName,curUser:curUser,memCap:physicMenCap,mem:mem}
    16}
    代码实现主要包括这几部分:
    先通过new ActiveXObject (”WbemScripting.SWbemLocator”); 访问到WbemScripting对象。
    通过locator.ConnectServer(”.”);连接我们本地电脑(.代表本地电脑,当然
    也可以访问其他计算机)。
    通过service.ExecQuery(”SELECT * FROM Win32_Processor”)这个类似sql的语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集。
    通过new Enumerator来创建一个可枚举的对象,下面就可以遍历取信息了。
    注意:运行的前提是要修改浏览器安全设置,”允许对未标记为可安全执行的ActiveX
    脚本的运行”。

    这里主要取了CPU、内存及系统用户几个信息,大家利用WMI的API或者借助JSEDIT获取
    到更多的信息。下面列出了常用信息的类:
    Win32_Processor // CPU 处理器
    Win32_PhysicalMemory // 物理内存
    Win32_Keyboard // 键盘
    Win32_PointingDevice // 点输入设备,如鼠标
    Win32_DiskDrive // 硬盘驱动器
    Win32_CDROMDrive // 光盘驱动器
    Win32_BaseBoard // 主板
    Win32_BIOS // BIOS 芯片
    Win32_ParallelPort // 并口
    Win32_SerialPort // 串口
    Win32_SoundDevice // 多媒体设置
    Win32_USBController // USB 控制器
    Win32_NetworkAdapter // 网络适配器
    Win32_NetworkAdapterConfiguration // 网络适配器设置
    Win32_Printer // 打印机
    Win32_PrinterConfiguration // 打印机设置
    Win32_PrintJob // 打印机任务
    Win32_TCPIPPrinterPort // 打印机端口
    Win32_POTSModem // MODEM
    Win32_POTSModemToSerialPort // MODEM 端口
    Win32_DesktopMonitor // 显示器
    Win32_VideoController // 显卡细节。
    Win32_VideoSettings // 显卡支持的显示模式。
    Win32_TimeZone // 时区
    Win32_SystemDriver // 驱动程序
    Win32_DiskPartition // 磁盘分区
    Win32_LogicalDisk // 逻辑磁盘
    Win32_LogicalMemoryConfiguration // 逻辑内存配置
    Win32_PageFile // 系统页文件信息
    Win32_PageFileSetting // 页文件设置
    Win32_BootConfiguration // 系统启动配置
    Win32_OperatingSystem // 操作系统信息
    Win32_StartupCommand // 系统自动启动程序
    Win32_Service // 系统安装的服务
    Win32_Group // 系统管理组
    Win32_GroupUser // 系统组帐号
    Win32_UserAccount // 用户帐号
    Win32_Process // 系统进程
    Win32_Thread // 系统线程
    Win32_Share // 共享
    Win32_NetworkClient // 已安装的网络客户端
    Win32_NetworkProtocol // 已安装的网络协议
    WMI Win32类的完整信息及详细列表请参考MSDN:
    http://msdn2.microsoft.com/en-us/library/aa394084(VS.85).aspx
    示例:
    1function button1_onclick() {//cpu 信息
    2 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
    3 var service = locator.ConnectServer(".");
    4 var properties = service.ExecQuery("SELECT * FROM Win32_Processor");
    5 var e = new Enumerator (properties);
    6 document.write("<table border=1>");
    7 for (;!e.atEnd();e.moveNext ())
    8 {
    9 var p = e.item ();
    10 document.write("<tr>");
    11 document.write("<td>" + p.Caption + "</td>");
    12 document.write("<td>" + p.DeviceID + "</td>");
    13 document.write("<td>" + p.Name + "</td>");
    14 document.write("<td>" + p.CpuStatus + "</td>");
    15 document.write("<td>" + p.Availability + "</td>");
    16 document.write("<td>" + p.Level + "</td>");
    17 document.write("<td>" + p.ProcessorID + "</td>");
    18 document.write("<td>" + p.SystemName + "</td>");
    19 document.write("<td>" + p.ProcessorType + "</td>");
    20 document.write("</tr>");
    21 }
    22 document.write("</table>");
    23}
    24
    25function Button2_onclick() {//CD-ROM 信息
    26 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
    27 var service = locator.ConnectServer(".");
    28 var properties = service.ExecQuery("SELECT * FROM Win32_CDROMDrive");
    29 var e = new Enumerator (properties);
    30 document.write("<table border=1>");
    31 for (;!e.atEnd();e.moveNext ())
    32 {
    33 var p = e.item ();
    34 document.write("<tr>");
    35 document.write("<td>" + p.Caption + "</td>");
    36 document.write("<td>" + p.Description + "</td>");
    37 document.write("<td>" + p.Drive + "</td>");
    38 document.write("<td>" + p.Status + "</td>");
    39 document.write("<td>" + p.MediaLoaded + "</td>");
    40 document.write("</tr>");
    41 }
    42 document.write("</table>");
    43}
    44
    45function Button3_onclick() {//键盘信息
    46 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
    47 var service = locator.ConnectServer(".");
    48 var properties = service.ExecQuery("SELECT * FROM Win32_Keyboard");
    49 var e = new Enumerator (properties);
    50 document.write("<table border=1>");
    51 for (;!e.atEnd();e.moveNext ())
    52 {
    53 var p = e.item ();
    54 document.write("<tr>");
    55 document.write("<td>" + p.Description + "</td>");
    56 document.write("<td>" + p.Name + "</td>");
    57 document.write("<td>" + p.Status + "</td>");
    58 document.write("</tr>");
    59 }
    60 document.write("</table>");
    61}
    62
    63function Button4_onclick() {//主板信息
    64 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
    65 var service = locator.ConnectServer(".");
    66 var properties = service.ExecQuery("SELECT * FROM Win32_BaseBoard");
    67 var e = new Enumerator (properties);
    68 document.write("<table border=1>");
    69 for (;!e.atEnd();e.moveNext ())
    70 {
    71 var p = e.item ();
    72 document.write("<tr>");
    73 document.write("<td>" + p.HostingBoard + "</td>");
    74 document.write("<td>" + p.Manufacturer + "</td>");
    75 document.write("<td>" + p.PoweredOn + "</td>");
    76 document.write("<td>" + p.Product + "</td>");
    77 document.write("<td>" + p.SerialNumber + "</td>");
    78 document.write("<td>" + p.Version + "</td>");
    79 document.write("</tr>");
    80 }
    81 document.write("</table>");
    82}

    83
    84


    八款JS框架介绍及比较

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


    15个Web开发者应该感谢的事物

    1. Mosaic

      图形设计师们应该记住11月的某一天,因为这一天诞生了让你们谋生的职业。如果没有Mosaic(查看解释)的图片显示支持,互联网根本就不需要好的设计。Mosaic在1993年正式诞生,并且给所有的web开发者和用户打开了一个全新的互联网世界。

    2. Firefox

      Firefox结束了IE长期以来对web开发者和用户们的精神折磨,这款支持多插件的浏览器迫使IE加快了更新步伐,要知道在这之前,IE在将近5年的时间内居然没有任何更新。
      除了推进基于标准的浏览器发展,Firefox的可扩展性让web开发者受益匪浅,大量基于firefox的插件对于开发工作非常有帮助。

    3. Browsershots.org

      几乎每一位web开发者都知道CSS hack(由于各大浏览器对于CSS的支持不一,要想用户在不同的浏览器获得相同的视觉体验,web开发者需要写不同的代码)的痛苦,但是通过Browsershots我们可以轻易地找到每个页面在不同浏览器下的问题,并且不断找出让你讨厌IE的理由(哈哈)。

    4. Firebug

      感谢Firefox,因为它不仅是一个浏览器,还是一个非常有用的开发工具。Firebug就是一款web开发者的必备插件,通过firebug,你可以全方位地了解和调试你的页面,对于设计者和coder来说,它的影响非同一般。

    5. Google Code

      如果你正在寻找一些有用的代码,Google Code是最好的去处。在这里,你不仅可以找到对你的项目有帮助的各种代码,还能为你提供对外发布项目的平台,并且,这一切都是免费的。
    ??????? 同时,你还可以使用Google的带宽来加载项目中的javascript框架。如果你想要使用jQuery的话,完全可以使用在google code上发布的版本。Google提供了这么美妙的礼物,还有什么理由不用呢?

    6. Frameworks

      各种开发框架也是web开发者们应该感谢的东西。在开发过程中,很多代码都是反复用到的,因此使用Rails, Django 或者CakePHP这样的框架,可以帮助web开发者们有效地节省时间,这是编程领域一个伟大的进步。

      下面是一些我们经常使用的开发框架:

    Ruby on Rails (Ruby)
    CakePHP (PHP)
    Django (Python)
    Zend (PHP)
    CodeIgnitor (PHP)
    Symfony (PHP)

    7. Open Source Projects

      开源机制的建立者和所有被开源社区驱动的项目都应该受到大家的尊敬,因为没有它们,我们不可能拥有现在的互联网和众多免费的开源技术。很多出众的项目都是开源软件,因为它们都是建立在大家免费贡献的基础之上。这些免费的项目可以为那些咨询公司赚取大量的商业利润,并且创造其他的商业机会,但是他们还是向开发者开放这些项目,让他们进行修改和提高,努力维护这些免费的项目。

      开源项目是互联网世界最大的贡献之一,被它鼓励的思想碰撞是网络上最好的事物之一,尤其是那些web开发者们。有谁没有用开源软件来创建过网站或者其他项目呢?这正是我们值得感谢的地方。

    8. Creative Commons

      开源的一大特色是那些创作共用协议,你可以修改/复用/分发这些基于创作共用协议的代码和项目,只要你对其做出了贡献。创作共用协议保护作者的成果,但同时又允许大家去修正和使用它。创作共用协议对于设计者和blogger之类的人来说是非常有用,举个例子,如果某篇文章里面的图片是基于创作共用协议的,那些互联网编辑们就可以免费使用它们来进行内容编辑了。

    9. Paypal

      不管你是爱还是恨,Paypal和其他的支付工具都让在线支付变得更加容易了。诚然,它们还有很多问题和不好的用户体验,但Paypal革新了在线支付的方式是不容置疑的。同时Paypal提供了便于使用的API,让你的网上支付业务实现起来更加容易。如果Paypal曾经让你失望,并且你正在选择其他的支付工具,可以参考five Paypal alternatives。

    10. Javascript Libraries

      Javascript一直是web开发领域最流行的分支之一,其中一个主要因素是由于一大批javascript类库的诞生,这些类库基本上能解决大部分日常的开发问题。除了这些框架本身的类库以外,流行的插件功能也让这些类库无比强大。以下是一些主流的javascript类库:

    jQuery
    Dojo
    Scriptaculous
    Prototype
    MooTools
    MochiKit

    11. Amazon S3 and EC2

      Amazon的S3 和 EC2服务让开发者们生活得更加轻松,一方面他们再也不用担心流量的问题 ,另一方面他们也不用花大量的钱来预购服务器。“用多少支付多少”的托管和存储服务模式对于开发者来说非常实惠。这些“云计算”类型的服务器改变了传统的web-hosting模式,Amazon的创新极大地帮助了web开发人员,使得开发者可以专注于创新和程序开发

    12. Anti-RSI software

      RSI工具对于web开发者来说是必不可少的朋友。RSI(查看解释)通常是因为开发者们长期不良的办公姿势形成的,因为他们每天至少花费8小时坐在电脑前面对着电脑屏幕,据说RSI会慢慢扩展到你的手腕/手掌/前臂/肘/肩膀等部位,并且潜在的影响还会更大。

      因此,非常感谢RSI软件的发明,它可以让你在工作之余记得多休息。

    13. Advanced Text Editors

      功能丰富的文本编辑器也让web开发者们受益匪浅,甚至降低了代码编写的门槛。不管你喜欢Textmate, Emacs, Vim 或者其他的编辑器,它们都可以帮助你节省大量的时间。

    14. CSS

      CSS是一种基于标准的技术,还有谁记得没有CSS的日子么?那个时候,网站的外观实在是太单一,而且想改变web的布局也非常方便,需要修改每一个页面的结构。感谢CSS,让我们的设计生活变得简单,它简洁,并且易于使用,可以轻松改变整站的设置。

    15. Coffee

      恩,咖啡。我想应该很多人都赞成吧。

      Bonus: Laptops

      笔记本电脑改变了web开发者的工作效率,相对于每天固定的工作位置,笔记本电脑让你更加自由。
      我发现自从换了笔记本电脑之后,我的RSI开始有了好转,因为我经常在不同的地方工作,而且我的双手也可以以不同的姿势休息。


    网站优化2

    ?

    验证函数加载

    也可以验证一个函数是否被加载,如果没有,加载 JavaScript 文件。为此,使用清单 4中的代码。

    清单 4. 验证函数是否被加载
    if (myfunction){??// The function has been loaded}else{ // Function has not been loaded yet, so load the javascript.??$import(’http://www.yourfastsite.com/myfile.js’);}

    注意:可以使用defer属性,但不是所有浏览器(包括 Firefox)都支持它。

    优化 CSS 文件
    如果经过适当优化和维护,CSS 文件不一定很大。例如,具有很多独立类的 CSS 文件会影响下载速度。与 JavaScript 文件一样,您需要优化 CSS 文件,使其包含所需的所有内容,同时保持合理的大小。另外,使用外部文件代替内联定义来适应浏览器的缓存机制。

    使用内容分布网络
    内容分布网络(Content-distribution network,CDN)是另一种缩短下载时间的好方法。当您将静态图像放在 Internet 上的许多服务器上时,用户能够从离他们最近的服务器下载这些图像。此外,大多数 CDN 都在快速服务器上运行,因此无论服务器的加载速度如何,其响应速度都比小型的超载服务器快。
    对资产使用多个域来增加连接
    CDN 的另一个优势是它们是独立的域。因为您的浏览器将并发连接的数量限制到一个单一的域,因此无论何时加载一个页面,都很容易占满所有线程。因此,到其他资产的连接被延迟了。然而,您的浏览器能够打开新线程或到其他域的连接,这样,从另一个域加载的任何资产都可以与其他所有资产同时加载。

    在合适的时候使用 Google Gears
    使用 Google Gears(参见参考资料)是避免用户反复下载同一内容的另一种好方法。Gears 允许用户离线访问 Web 应用程序,但是也允许将页面元素持久化到用户的计算机上。因此,频繁加载但未进行更新的内容可以存储在 Gears数据库中,该数据库是一个 SQLite3 关系数据库管理系统。对同一内容的所有next请求都可以从数据库(而不是服务器)直接加载。
    安装 Gears 之后,获取 gears_init.js 文件,以便轻松访问Gears 工厂和应用程序编程接口(API),将其保存为gears_init.js,通过以下方式在您的代码中引用它:
    <script type=”text/javascript” src=”gears_init.js”></script>

    要确定是否已安装 Gears,使用清单 5中的代码。

    清单 5. 确定是否已安装 Gears
    <script>??if (!window.google || !google.gears) {????location.href = “http://gears.google.com/?action=install&message=<welcome message>”???????? + “&return=<return url>”;??}</script>

    如果未安装 Gears,代码将向您提供下载 Gears 的 URL。
    当所有元素都通过验证并且 Gears 已安装之后,您可以测试 Gears 的极其有用的数据库功能,使用清单 6中的 JavaScript 代码。

    清单 6. 测试数据库功能
    <script type=”text/javascript”> var db = google.gears.factory.create(’beta.db’); db.open(’database-test’); db.execute(’create table if not exists Test’ +?????????? ‘ (Phrase text, Timestamp int)’); db.execute(’insert into Test values (?, ?)’, ['Monkey!', new Date().getTime()]); var rs = db.execute(’select * from Test order by Timestamp desc’); while (rs.isValidRow()) {??alert(rs.field(0) + ‘@’ + rs.field(1));??rs.next(); } rs.close();</script>

    这段代码在您的计算机或服务器上创建一个本地数据库db。如果表Test不存在,则创建一个,然后插入测试数据(Monkey!和时间)。代码从数据库获取数据,并在浏览器中以警告的形式呈现出来。
    想像一下可能发生的结果!

    使用 PNG 格式的图像
    Graphic Interchange Format (GIF) 和 Joint Photographic Experts Group (JPEG) 图像格式都已过时了:Portable Network Graphic (PNG) 是未来流行的格式。当然,您可以说 GIF 和 JPEG 已经消亡,或者 PNG 没有任何缺陷,但是所有事物都有各自的优缺点,PNG 以最佳的文件大小提供了出色的质量。因此,如果进行选择的话,应该尽可能使用 PNG 图像。

    保持 [url=javascript:;]Ajax[/url] 调用简短、准确
    当统称为 Asynchronous JavaScript + [url=javascript:;]XML[/url] (Ajax) 的技术在两年前出现时,这些技术为处理页面请求和响应提供了一种革命性方法。然而,拨号用户可能从来没机会体验其真正的优势,因为在许多情形下,Ajax 需要在浏览器与服务器之间大量通信。因此,如果您能够保持 Ajax 调用简短和准确,可以避免用户花费无止尽的时间来等待元素刷新或响应。

    进行一次较大的 Ajax 调用并在本地处理客户机数据
    如果不能进行简短的 Ajax 调用,或者如果这些调用不能提供期望的结果,可以考虑一种替代方法:进行一次大的 Ajax 调用来获取所需的一切内容,然后让客户机在本地处理数据。通过这种方式,客户机只需等待一次(获取传入的数据),但是在此之后(当浏览器与服务器之间没有必要通信时),处理速度将更快。当然,还有大量 Ajax 优化技术,本[url=javascript:;]教程[/url]无法一一列出。如果想要了解关于 Ajax 的更多信息,请查看参考资料
    在沙箱中测试代码
    还有一个经常被遗忘的常用技巧。尽管清醒的 Web 开发人员通常会在启动应用程序之前对其进行测试,但是有时候测试会使他们不那么重视维护任务,或者新功能添加得太快,并且未经过充分考虑或测试。结果,余下的脚本减缓了应用程序的速度。
    如果您添加一项新功能,可以首先在沙箱里(完全脱离了应用程序的其余部分)进行测试,查看它作为单个函数的行为。通过这种方式,您可以反复检查,并分析性能和响应时间,无需考虑 Web 应用程序的其余部分。然后,当新功能的行为符合预期时,可以将其引入到应用程序的其余部分中,运行其他测试,保证功能本身的行为符合预期。

    分析站点代码
    在许多场景中,自我反省是一个不错的建议。幸运的是,在开发过程中,我们可以使用工具来帮助反省,并尽可能客观地进行实践。像 JSLint(参见参考资源)这样的工具的价值是无法衡量的,尽管其站点宣称它 “可能令您备受挫折”,因为它向您提供了所有的潜在代码缺陷,这些缺陷不但使调试更加困难,而且可能导致更长的响应时间。

    使用 JSLint 检查 JavaScript 代码中的错误或糟糕的编码实践
    您不需要像完美主义者那样追求完美无缺的 JavaScript 代码。但是,许多开发人员没有认真对待代码分析,通常在开发过程中跳过了这个步骤。不幸的是,错误和糟糕的编码实践不仅不太专业,而且可能减缓应用程序的速度。当浏览器忙于应付错误和糟糕的编码实践时,加载不仅需要更多时间,还会导致难以调试的错误。
    因此,如果想要获得良好的代码,可以考虑使用代码分析工具。有许多不同的工具可供使用,但是最适合 JavaScript 语言的工具非 JavaScript Lint 莫属,它也叫做 JSLint(参见参考资料)。也可以使用 Firebug,但是 JSLint 更加正式,它包含在 YSlow 中。

    检查孤立的文件和丢失的图像
    检查孤立的文件和丢失的图像是一种明智之举。大部分 Web 开发人员都会检查错误的文件引用,但是这里仍然需要说明一下。丢失的文件容易引起各种问题,因为它们会导致 “The image/page cannot be displayed” 之类的错误消息。但是在网页速度优化方面,它们具有更大的缺陷:当浏览器寻找丢失的或孤立的文件时,它会消耗资源,这不可避免地会导致页面处理速度变慢。因此,请检查孤立或丢失的文件,包括拼写错误的文件名。

    YSlow 扩展
    YSlow Firebug 扩展使主观的网页分析日渐被淘汰。YSlow 使用 Yahoo! 起草的面向高性能网站的权威规则,分析网页并告诉您它们变慢的原因。

    使用 YSlow 分析网页
    YSlow 是一个相对较小但非常有用的 Firefox 扩展。当启动 YSlow 时,该扩展在浏览器的下半部分中打开,如图 4所示。

    图 4. Firefox 中的 YSlow 扩展

    图 4 显示了 Performance 视图,可以在其中看到 YSlow 如何评估您的网页的性能,还能够看到该扩展检测到的问题。单击列表中的一个链接将打开一个页面,其中解释了相应的错误。如果存在可以改进的页面组件,YSlow 会给出改进建议。
    在 Inspect 视图中,如图 5所示,您可以逐一分析元素来剖析页面。Inspect 视图的一个最有用的功能是,当您在页面上移动鼠标指针时,它会自动刷新,因此您无需通过滚动代码内容来查找需要检查的行。

    图 5. Firefox 中的 YSlow Inspect 视图

    从 Stats 视图的名称可以猜测到,它(如图 6所示)显示与当前页面有关的统计数据。这些数据包括空的和主要的缓存和 cookie。

    图 6. Firefox 中的 YSlow Stats 视图

    Components 视图(如图 7所示)列出了当前页面上的组件。显示的与每个组件有关的数据包括文件类型和路径、页面过期时间以及 HTTP 响应报头。单击一个组件可以将其打开,以供查看。单击一个列标题可以按升序或降序对表进行排序。

    图 7. YSlow Components 视图

    YSlow 是一个较小的、有用的扩展,可以在提高页面加载速度方面为您提供许多帮助。如果您以前未使用过它,那么现在应该使用了。

    结束语
    优化网页的加载速度并不复杂。实际上,您通常可以轻而易举地实现速度优化。如果遵循本文中介绍的技巧以及 Web 开发最佳实践,那么无需采用其他措施就可以提高页面的加载速度。
    将大量页面优化技巧收集到一起很简单,我希望本文的资源具有一定的价值。但是,如果您认为速度优化技巧只有这里列出的这些,那么您将惊奇地发现远远不止这些。但是,即使您仅遵循这 20 多个技巧,您的页面的加载速度也会更快,您的用户也会更惬意 ?? 无论他们通过拨号还是专用的宽带上网。


    Copyright © 1996-2010 V酷吧. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress