编写高效jQuery代码的4个原则和5个技巧


Posted in Javascript onApril 24, 2014

jQuery的编写原则:

一、不要过度使用jQuery

1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大。所以有原生方法可以使用的场合,尽量避免使用jQuery。

$("a").click(function(){
    alert($(this).attr("id"));
});
//改良后↓
$("a").click(function(){
    alert(this.id);
});

2. 许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。由于后者不通过jQuery对象操作,所以相对开销较小,速度比较快。

var $text = $("#text");
var $ts = $text.text();
//改良后↓
var $text = $("#text");
var $ts = $.text($text);

这里是用了“$.text()”的内置函数,其他类似的还有“$.data()”等。

二、缓存jQuery对象

查找DOM元素实际上有不小的内存开销,使用选择器的次数应该越少越好,并且尽可能缓存选中的结果,便于以后反复使用。记住,永远不要让相同的选择器出现多次。

例如:

$("#top").find("p.classA");
$("#top").find("p.classB");
改良后↓
var cached = $("#top");
cached.find("p.classA");
cached.find("p.classB");

三、少改动DOM结构

如果要多次改动DOM结构,就先把要改动的部分先取出来,改动完成后再放回去。这里的基本思想是在内存中建立你确实想要的东西,最后做一次最有效的更新DOM操作。

例如:

var top_100_list = [...], // 这里是100个字符串的数组  
$mylist = $("#mylist"); 
for (var i=0, l=top_100_list.length; i<l; i++){
    $mylist.append("<li>" + top_100_list[i] + "</li>"); // 100次DOM操作
}
改良后↓
var top_100_list = [...],
$mylist = $("#mylist"),
top_100_li = ""; // 这个变量用来存储变化的字符串
for (var i=0, l=top_100_list.length; i<l; i++){
    top_100_li += "<li>" + top_100_list[i] + "</li>";
} 
$mylist.html(top_100_li);// DOM操作只有这么一次

四、命名规范

jQuery代码中不免夹杂有JS代码,如何让jQuery代码看起来严谨有序,规范自己的命名规则能更好的提高代码的阅读性。

1. 函数名:function getResultByUserId(){..},遵循骆驼命名法,首字母小写,单词首字母大写,尽量短而且明确表达方法的用意。

还可以这样定义:

$.flushCartItemList = function() {
    isAjaxDate = true;
}

2. 参数名:function method(recordIdx, recordVal){..}, 同函数名,参数尽量用缩写。
命名就是要有意义,一些属性的缩写也很有讲究,例如:索引:idx;值:val;长度:len;名称:nm;等...

3. 变量名:var user_id; var user_list_tab; var user_list_tr_1;,一般以下划线为单词分割,按照“命名_元素_索引”的规则。

jQuery对象的变量名要加上“$”的前缀以区分javascript对象。

jQuery编写技巧:

一、选择器择优

选择器是jQuery的基础,如何选择效率最高的选择器,先要了解各种选择器的性能差异。

①ID选择器和标签元素选择器:$("#ID"); $("Tag");

jQuery内部会自动调用浏览器的原生方法(getElementById();,getElementByTagName();),所以执行速度快。

②类选择器:$(".Class");

jQuery会遍历所有DOM节点查找class=Class的DOM对象,所以执行速度较慢。

③伪类选择器和属性选择器:$(":Type"); $("[Attribute='Value']");

因为浏览器没有针对它们的原生方法,这两种选择器执行速度是最慢的。不过,不排除一些第三方浏览器增加了querySelector()和querySelectorAll()方法,因此会使这类选择器的性能有大幅提高。

二、链式写法

$("div").find("h3").eq(2).html("Hello");

采用链式写法时,jQuery会自动缓存每一步的结果,比非链式写法(手动缓存)要快。

三、高效循环

循环总是一种比较耗时的操作,javascript原生循环方法for和while,要比jQuery的“.each()”快。并且关于for循环,以下这种写法效率最高。

for (var i = 0, len = array.length; i < len; i++) {
  // alert(i);
}

先声明变量,再进行循环操作,效率远比遍历数组“for (var i in arr)”高得多,也比循环取得数组长度“for (var i = 0; i < arr.length; i++)”的效率高!

四、字符串拼接

 字符串的拼接在开发中会经常遇到,用“+=”的方式来拼接字符串的效率非常的低,我们可以利用数组的“.join()”方法。

var array = [];
for(var i = 0; i < 10000; i++){
    array[i] = "<input type='button' value='a'>";
}
document.getElementById("one").innerHTML = array.join("");

以前我很喜欢用数组的原生的方法“.push()”,其实直接用arr[i]或者arr[arr.length]的方式要快一点,但是差别不是很大。

五、页面加载

 尽管$(function(){}); 确实很有用, 它是在所有DOM元素加载完成。如果你发现你的页面一直是载入中的状态,很有可能就是这个函数引起的。你可以通过将jQuery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。

$(window).load(function(){
    // 页面完全载入(包括所有的DOM元素和JS代码)后才初始化的jQuery函数. 
});

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

Javascript 相关文章推荐
JTrackBar水平拖动效果
Jul 15 Javascript
javascript之更有效率的字符串替换
Aug 02 Javascript
php上传图片并给图片打上透明水印的代码
Jun 07 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
移动端脚本框架Hammer.js
Dec 15 Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 Javascript
Node.JS如何实现JWT原理
Sep 18 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 Javascript
使用Typescript开发微信小程序的步骤详解
Jan 12 Javascript
js检测浏览器版本、核心、是否移动端示例
Apr 24 #Javascript
javascript模拟订火车票和退票示例
Apr 24 #Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 #Javascript
jquery map方法使用示例
Apr 23 #Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 #Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 #Javascript
Jquery实现Div上下移动示例
Apr 23 #Javascript
You might like
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
PHP crc32()函数讲解
2019/02/14 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
javascript 数组排序函数
2009/08/20 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
javascript中this关键字详解
2016/12/12 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Python3模拟登录操作实例分析
2019/03/12 Python
java判断三位数的实例讲解
2019/06/10 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Pytorch之finetune使用详解
2020/01/18 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
思想品德自我评价
2014/02/04 职场文书
给老师的检讨书
2014/02/11 职场文书
教师节感谢信
2015/01/22 职场文书
在人间读书笔记
2015/06/30 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js