1,从google code加载jQuery
google code已经集合了几个JavaScript库,我们可以从那里加载这些库而不必通过自己的服务器加载。这样的好处是节省带宽,如果用户访问过同样加载了这些库的网站后,JavaScript库会缓存在用户端,提高加载速度。
-
<script src= "http://www.google.com/jsapi"></script> <script type= "text/javascript"><!--
-
// 加载jQuery google.load("jquery", "1.2.6");
-
google. setOnLoadCallback ( function ( ) {
-
// 自己的代码...
-
} );
// --></script>
也可以直接声明一个指向:
2,将匹配选择器元素对象保存在变量中。
尤其在循环体里,下面的做法影响运行效率:
-
for (i = 0; i < 1000; i++ ) {
-
var myList = $ ( '.myList' );
-
myList. append ( 'This is list item ' + i );
-
}
上面的代码在我的机器上耗时1066毫秒。除非我疯了才会将选择器表达示放在循环体里。应该这样做:
-
var myList = $ ( '.myList' );
-
for (i = 0; i < 1000; i++ ) {
-
myList. append ( 'This is list item ' + i );
-
}
上面的代码耗时只有224毫秒。想要更快还可以这样做:
-
var myList = $ ( '.myList' );
-
var myListItems = '<ul>';
-
for (i = 0; i < 1000; i++ ) {
-
myListItems+= 'This is list item ' + i;
-
}
-
myListItems+= '</ul>';
-
myList. html (myListItems );
也就是说尽量减少直接对DOM进行操作,还有直接填充内容比插入内容要快。上面的代码只需185毫秒,尽管不算很明显,但至少显示出可优化的空间。
3,如果可以,选择器尽量选取ID属性。
4,为选择器设定一个范围。
如果使用$('.myDiv')这样的选择器表达示,毫无疑问的是对整个DOM进行了一次遍历,然后返回匹配的元素对象。然而如果为它设定一个范围将会提高运行效率。jQuery(expression, context)函数有两个参数,第一个是表达示,第二个就是范围。指定了范围参数,选择器只会在这个范围内进行选取。例如:
-
var selectedItem = $ ( '#listItem' + i, $ ( '.myList' ) );
5,正常运用连接语句
jQuery最cool的一种用法就是将方法和调用连接起来,例如切换某元素的class属性:
-
$ ( 'myDiv' ). removeClass ( 'off' ). addClass ( 'on' );
如果要连接的方法调用很多,jQuery同样和JavaScript一样可以将语句分行书写:
-
$ ( '#mypanel' )
-
. find ( 'TABLE .firstCol' )
-
. removeClass ( '.firstCol' )
-
. css ( 'background' : 'red' )
-
. append ( '<span>This cell is now red</span>' );
如果养成良好的连接语句的习惯,有助于减入选择器的使用。上面的代码只进行了一次选择器操作,然而却干完了4件事。很难想像将它分开进行4次操作会消耗多少资源,而且书写代码量也少了很多。所以为什么不这么做呢?
接下来再看看,要选取表格中的class='firstColumn'的单元格,并设它的背景色为red:
-
$ ( '#myTable' ). find ( '.firstColumn' ). css ( 'background', 'red' );
很显然,上面的代码进行了两次选择器操作。而.css()调用只会作用到表格中class='firstColumn'的单元格里。这时我们又需要对同一表格中class='lastColumn'的单元格进行操作该如何做呢?看起来不能将它们连在一起写,难道要重新写一句吗?当然不用:
-
$ ( '#myTable' )
-
. find ( '.firstColumn' )
-
. css ( 'background', 'red' )
-
. end ( )
-
. find ( '.lastColumn' )
-
. css ( 'background', 'blue' );
这里用到了.end(),作用是如果连接了多个选择器,将返回到最初的一个选择器中。也就是将('#myTable').find('.firstColumn')返回到('#myTable').find('.firstColumn')返回到('#myTable'),然后再$('#myTable').find('.lastColumn')。这样就解决了刚才说的问题。
同样支持自定义的jQuery函数:
-
$. fn. makeRed = function ( ) {
-
return $ ( this ). css ( 'background', 'red' );
-
}
-
-
$ ( '#myTable' ). find ( '.firstColumn' ). makeRed ( ). append ( 'hello' );
6,学会在适当的时候使用动画
查看一下jQuery的源代码会发现jQuery库中很强大的slideDown()和fadeIn()都是调用jQuery本身的animate()方法:
-
slideDown: function (speed,callback ) {
-
return this. animate ( {height: "show" }, speed, callback );
-
},
-
-
fadeIn: function (speed, callback ) {
-
return this. animate ( {opacity: "show" }, speed, callback );
-
}
animate()方法采用从一个CSS样式到另一个CSS样式的过渡实现动画效果。因此可以为元素定义背景色、长度、宽度和透明试等等形式的动画效果。
-
$ ( '#myList li' ). mouseover ( function ( ) {
-
$ ( this ). animate ( { "height": 100 }, "slow" );
-
} );
上面的代码实现鼠标移到元素上时,高度渐渐变成100像素。
有别于jQuery其它的函数方法,animate()支持自动队列。一旦一个动画完成后又会进行第二个动画,这并不需要进行回调处理:
-
$ ( '#myBox' ). mouseover ( function ( ) {
-
$ ( this ). animate ( { "width": 200 }, "slow" );
-
$ ( this ). animate ( { "height": 200 }, "slow" );
-
} );
animate()还支持多个css同时放置。例如:
-
$ ( '#myBox' ). mouseover ( function ( ) {
-
$ ( this ). animate ( { "width": 200, "height": 200 }, "slow" );
-
} );
7,事件委托
jQuery比以往更重视元素事件委托,这更能体现unobtrusively(无侵入)原则。在元素上添加太多的事件会降低效率,也不便书写和调试。而事件委托能用较少的代码完成同样的功能。
-
$ ( '#myTable TD' ). click ( function ( ) {
-
$ ( this ). css ( 'background', 'red' );
-
} );
因为就不需要在DOM内添加onClick事件,从而使DOM很简洁。假设有一个表格,10列50行,每点击一个单元格后,该单元格背景变red。是不是要进行500次事件委托呢?很明显是不需要:
-
$ ( '#myTable' ). click ( function (e ) {
-
var clicked = $ (e. target );
-
clicked. css ( 'background', 'red' );
-
} );
'e'返回实际响应点击的元素,因此可以取得被点击的目标元素。看上去简洁许多。
8,书写自己的选择器
必要的时候,可以创建自己的选择器。当jQuery内置的选择器无法更有效地完成选取操作时,自己创建的选择器可以对内置选择器进行扩展。
-
$. extend ($. expr [ ':' ], {
-
over100pixels: function (a ) {
-
return $ (a ). height ( )> 100;
-
}
-
} );
-
-
$ ( '.box:over100pixels' ). click ( function ( ) {
-
alert ( 'The element you clicked is over 100 pixels high' );
-
} );
上面代码的第一部分是创建一个自定义的选择器,即返回所有高度超过100像素的元素。代码的第二部分只是将匹配的元素进行事件绑定,匹配元素被点击时,弹出一个对话框。这里只是说明选择器是可扩展的,我将陆续发布有关扩展jQuery扩展的post。
9,利用noconflict来重命名jQuery对象
大多数的JavaScript框架库使用标记符,如果在同一页里使用了不同的JavaScript框架,而且都用做标记符,必定会引志冲突。好在jQuery提供了noConflict()方法来重命名标记符。例如:
-
var $j = jQuery. noConflict ( );
-
$j ( '#myDiv' ). hide ( );
这时符号变成了j。只要出现$j的标记符就是使用jQuery库。
10,判断画片加载完毕
这个问题好像没有答案。怎样去判断一个图片真正加载完毕了呢?用.load()方法吧。
-
$ ( '#myImage' ). attr ( 'src', 'image.jpg' ). load ( function ( ) {
-
alert ( 'Image Loaded' );
-
} );
运行后如果图片加载完毕了,会弹出对话框。这是使用了回调函数。
11,如果检查DOM中的某元素是否存在
如果要对某元素进行操作,并不需要先去检查该元素时否存在于DOM中。因为jQuery的方法或函数对那些并不存在的元素根本不会进行任何操作。但如果需要知道是否已有选定或选定的数量时,可以用length属性:
-
if ($ ( '#myDiv).length) {
-
// 自己的代码...
-
}
12,简化的$(document).ready
通常需要这样写:
-
$ (document ). ready ( function ( ) {
-
// ...
-
} );
其实还可以这样写:
-
$ ( function ( ) {
-
// ...
-
} );