通过在父级监听获取焦点和失去焦点的事件,对目标元素进行操作。在上面代码中,父级元素扮演了一个调度员的角色,它可以基于目标元素绑定事件。如果你发现你给很多元素绑定了同一个事件监听,那么现在的你肯定知道哪里做错了。同理,在Table操作时,我们也可以使用这种方式加以改进代码:普通的方式:
以下是引用片段:
$('#myTable td').click(function(){
$(this).css('background', 'red'); });
改进方式:
以下是引用片段:
$('#myTable').click(function(e) {
var $clicked = $(e.target);
$clicked.css('background', 'red'); });
假设有100个td,在使用普通的方式的时候,你绑定了100个事件。在改进方式中,你只为一个元素绑定了1个事件,至于是100个事件的效率高,还是1个事件的效率高,相信你也能自行分辨了。
6.推迟到 $(window).load
jQuery对于开发者来说有一个很诱人的东西,可以把任何东西挂到$(document).ready下。尽管$(document).rady 确实很有用, 它可以在页面渲染时,其它元素还没下载完成就执行。如果你发现你的页面一直是载入中的状态,很有可能就是$(document).ready函数引起的。你可以通过将jQuery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。它会在所有的html(包括<iframe>)被下载完成后执行。
以下是引用片段:
$(window).load(function(){
// 页面完全载入后才初始化的jQuery函数.
});
一些特效的功能,例如拖放,视觉特效和动画,预载入隐藏图像等等,都是适合这种技术的场合。
7.压缩JavaScript
压缩和最小化你的JavaScript文件。压缩之前,请保证你的代码的规范性,否则可能失败,导致Js错误。
8.尽量使用ID代替Class
前面性能优化已经说过,ID选择器的速度是最快的。所以在HTML代码中,能使用ID的尽量使用ID来代替class。看下面的一个例子:
以下是引用片段:
// 创建一个list var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
myListItems += '<li class="listItem' + i + '">This is a list item</li>';
//这里使用的是class
} myListItems += '</ul>';
$myList.html(myListItems);
// 选择每一个 li for (i = 0; i < 1000; i++) {
var selectedItem = $('.listItem' + i); }
在代码最后,选择每个li的过程中,总共用了5066毫秒,超过5秒了。接着我们做一个对比,用ID代替class:
以下是引用片段:
// 创建一个list var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) { myListItems += '<li id="listItem' + i + '">This is a list item</li>';
//这里使用的是id }
myListItems += '</ul>';
$myList.html(myListItems);
// 选择每一个 li for (i = 0; i < 1000; i++) {
var selectedItem = $('#listItem' + i);
}
在上段代码中,选择每个li总共只用了61毫秒,相比class的方式,将近快了100倍。
9.给选择器一个上下文
jQuery选择器中有一个这样的选择器,它能指定上下文。
jQuery( expression, context ); 通过它,能缩小选择器在DOM中搜索的范围,达到节省时间,提高效率。
普通方式:
以下是引用片段:
$('.myDiv')
改进方式:
以下是引用片段:
$('.myDiv' , $("#listItem") )