jquery选择器效率优化问题

  jquery选择器固然强大,但是使用不当回导致效率问题;

1.要养成将jQuery对象缓存进变量的习惯

     //不好的写法
$('#btn').bind("click",function() {});
$('#btn').css("border","1px solid red");
$("#btn").css("background-color","green");
$("#btn").fadeIn("slow")
//正确写法;
var $obj=$("#btn");
$obj.bind("click",function (){});
$obj.css("border","1px solid red");
$obj.css("background-color",'green');
$obj.fadeIn("slow"); //为了区分普通的JavaScript对象和jQuery对象,可以在变量首字母前加上$符号。
   //上面代码可以使用jQuery的链式操作加以改善。如下所示:
var $obj=$("#btn");
$obj.bind("click",function (){})
.css("border","1px solid red")
.css("background-color",'green')
.fadeIn("slow");

2.能有id则用id

毫无疑问jq中最快的选择器是id选择器,因为它直接对应着我们的javascript的document.getElementsById();

HTML

<div id="outer">
<div id="inner">
<input type="text" class="txt" />
<input type="button" class="test" id="btn" value="click" />
</div>
</div>

js

   //不好的写法
var obj=$("#outer .test");
//直接获取就行了
var obj=$("#btn"); var obj=$("#inner input.txt")
////建议从最近的ID开始继承
var obj=$('input.txt') //不建议使用tag来修饰id 有种化蛇天足的感觉
var obj=$("div#outer");
//或者
var obj=$("#outer#inner");

实例二

html 

  <ul id="list">
<li class="li0">1</li>
<li class="li1">2</li>
<li class="li2">3</li>
</ul>
<ul id="list1">
<li id="li0">1</li>
<li id="li1">2</li>
<li id="li2">3</li>
</ul>

js

    for(var i=0;i<3;i++){
$('.li'+i)
}
//相比之下,还是比较推荐第二种写法
for(var j=0;j<3;j++){
$('#li'+i);
}

ps:也可以给选择器指定一个上下文;

     var list=$('.mydiv');

     var outer=$('#outer');
var list=$('.mydiv',outer);

3.如果你打算在其他函数中使用jQuery对象,那么你必须把它们缓存到全局环境中

window.$obj={head:$('head'),obj:$('#outer')};
function do_something(){
var script=document.createElement("script");
$obj.head.append(script);
$obj.obj.css("border","1px solid red");
}
//这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM。
//这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 //不好的做法;
for(var i=0;i<100;i++){
$("#content").append('<span>index='+i+'</span>');
}
//推荐写法;
var html="";
for(var i=0;i<100;i++){
html+='<span>index='+i+'</span>';
}
$('#content').append(html);

 4.我们要为一个拥有很多输入框的表单绑定这样的行为:当输入框被选中时为它添加一个class

除非在特殊情况下,否则每个js事件(click,mouseover)都会冒泡到父级节点,当我们需要给多个元素调用同一个函数时候,

这点可能会有用,代替这种效率很差的多元素监听的方法是:你只需向他们的父节点绑定一次就ok了;

//不好的写法
$("#formId input").bind("focus",function (){
$(this).addClass('selected').bind("blur",function (){
$(this).removeClass('selected');
})
})
//推荐写法;
$("#formId").bind("focus",function (e){
var $cell=$(e.target);
//e.target捕捉到触发的目标元素
$cell.addClass('selected');
}).bind('blur',function (e){
var $cell=$(e.target);
$cell.removeClass('selected'); }); //比如:
$("#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个事件的效率高,
//相信你也能自行分辨了。

5.推迟到 $(window).load

尽管$(document).rady 确实很有用, 它可以在页面渲染时,其它元素还没下载完成就执行。如果你发现你的页面一直是载入中的状态,

很有可能就是$(document).ready函数引起的。你可以通过将jQuery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。

它会在所有的html(包括<iframe>)被下载完成后执行。

以下是引用片段:
$(window).load(function(){
// 页面完全载入后才初始化的jQuery函数.
});

一些特效的功能,例如拖放,视觉特效和动画,预载入隐藏图像等等,都是适合这种技术的场合。

6.压缩JavaScript

7.10.慎用 .live()方法(应该说尽量不要使用)

jQuery1.3.1版本之后增加的方法,这个方法的功能就是为 新增的DOM元素 动态绑定事件

8.子选择器和后代选择器 

    $("#outer div"); //后代选择器

    $("#outer>div")  //子选择器

    //应该根据具体的情况来选择使用

9.使用data()方法存储临时变量

    //应该根据具体的情况来选择使用

    //关于data的使用滴呀
//就能在一个元素上存放任何格式的数据,而不仅仅是字符串 var temp='temp';
var obj={name:'jack',age:18};
var bodyData=$(document.body);
bodyData.data("temp",temp);
bodyData.data("obj",obj); alert(bodyData.data("temp"));
alert(bodyData.data("obj").name);
//移除data
bodyData.removeData("temp");
bodyData.removeData("obj"); alert(bodyData.data("temp")); //undefined
alert(bodyData.data("obj").name);//undefined //具体的实例;
var flag=false;
$("#btn").click(function (){
if(flag){
//do xx
flag=false;
}else{
//do yy
flag=true;
}
}) //使用data改进后的代码;
$("#btn").click(function (){
if($('p').data('flag')){
//do xx
$('p'.data('flag',false))
}else{
//do yy
$('p').data('flag',true)
}
})

 10.使用toggleClass来优化

      //方式一
$("#temp").mouseover(function (){
$(this).addClass('color')
}) $("#temp").mouseout(function (){ $(this).removeClass('color');
}) //方式二
$("#temp").mouseover(function (){
$(this).addClass("color");
}).mouseout(function (){
$(this).removeClass("color");
}) //方式三
$("#temp").hover(function (){
$(this).toggleClass('color');
})

jquery选择器效率优化问题的更多相关文章

  1. jQuery选择器的优化选择

    jQuery选择器的优化选择 1.1 属性选择器 var $div=$("[id]"); 选中拥有该属性的元素 var $div=$("[id=div]");  ...

  2. jQuery 选择器效率

    http://blog.csdn.net/cxl444905143/article/details/48808809 ID > Tag > Class ID 选择器是速度最快的,这主要是因 ...

  3. jQuery——选择器效率

    N1:$('#box').find('p'):最快,直接了当的找到对应的节点jQuery对象: N2:$('p','#box'):注意不是$('p,#box')!!!,jQuery会按照从右往左的顺序 ...

  4. 优化jQuery选择器

    优化jQuery选择器 选择优化比以前更加重要,因为越来越多的浏览器实现了queryselectorall()并承担了将jQuery选择器转移到浏览器的责任.记住这些小技巧可以让你轻松突破学习选择器时 ...

  5. jQuery选择器的效率问题

    jQuery提供了功能强大,并兼容多种css版本的选择器,不过发现很多同学在使用选择器时并未注重效率的问题. a) 尽量使用Id选择器,jQuery选择器使用的API都是基于getElementByI ...

  6. jQuery高级技巧——性能优化篇

      通过CDN(Content Delivery Network)引入jQuery库 要提升网站中javascript的性能的最简单的一步就是引入最新版本的jQuery库,新发布的版本通常在性能上会有 ...

  7. jQuery 选择器和JavaScript 选择器的技巧与异常原因

    jquery的选择器借鉴了css选择器,核心依然依靠JavaScript的getElementById()和getElementsByTagName()方法,但是他封装了2个方法,让jquery选择器 ...

  8. [转]关于浏览器css选择器性能优化

    作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...

  9. jquery选择器的实现流程简析及提高性能建议!

    当我们洋洋得意的使用jquery强大的选择器功能时有没有在意过jquery的选择性能问题呢,其实要想高效的使用jquery选择器,了解其实现流程是很有必要的,那么这篇文章我就简单的讲讲其实现流程,相信 ...

随机推荐

  1. 禁止ViewState的3种解决方法

    默认情况下,ViewState是被启用的,比如提交表单后,表单中输入的值会自动保留.但是如果不需要保留,也可以将其禁用,这样可以节省资源.   下面3种方式就可以分别禁用某一个控件.某一个页面和整个应 ...

  2. SEPM安装完之后的一些细节之处

    1. 若SEPM与GUP为同一台主机,则必须在其上也安装SEP, 否则其他客户端无法更新.   2. 先指定GUP,然后指派策略   3. Latest on Manager可以通过离线jdb文件进行 ...

  3. 【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA

    实验指导书及代码包下载: http://pan.baidu.com/s/1gerjjxh iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  4. Javascript 笔记与总结(2-4)Javascript 内置对象

    ① String 字符串对象 fromCharCode() 静态方法, 用作为参数而传递的字符代码创建一个新的字符串. length 字符串的长度. charAt() 抽取字符串中指定位置的字符. c ...

  5. bash shell命令行选项与修传入参数处理

    在编写shell程序时经常需要处理命令行参数,本文描述在bash下的命令行处理方式.选项与参数:如下命令行: ./test.sh -f config.conf -v --prefix=/home -f ...

  6. Windows下的Objective-C集成开发环境(IDE)

    Windows下的Objective-C集成开发环境(IDE) 分类: Objective-C2012-04-20 21:54 26631人阅读 评论(42) 收藏 举报 windowside编译器c ...

  7. apache磁盘缓存配置

    确保mod_cache和mod_disk_cache是开启的 配置如下: CacheDefaultExpire 86400 #失效时间,单位秒CacheEnable disk /      #缓存路径 ...

  8. jquery 选择器,模糊匹配

    按姓名匹配 1,name前缀为aa的所有div的jquery对象 $("div[name^='aa']"); 2,name后缀为aa的所有div的jquery对象 $(" ...

  9. Linux shell 变量 数学 运算

    Abstract : 1)  Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...

  10. linux 自动登录脚本

    #!/usr/bin/expect set port 22 set user xiaoming set password xiaoming123 set host 111.222.22.33 set ...