编写高效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 相关文章推荐
javascript高亮效果的二种实现方法
Sep 14 Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
Dec 28 Javascript
input链接页面、打开新网页等等的具体实现
Dec 30 Javascript
Javascript基础教程之switch语句
Jan 18 Javascript
详解vue.js组件化开发实践
Dec 14 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
vue微信分享的实现(在当前页面分享其他页面)
Apr 16 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
May 03 Javascript
微信小程序仿抖音短视频切换效果的实例代码
Jun 24 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
PHP 简单数组排序实现代码
2009/08/05 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
js获取select选中的option的text示例代码
2013/12/19 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
详解如何较好的使用js
2016/12/16 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
python图像处理之反色实现方法
2015/05/30 Python
Python实现大文件排序的方法
2015/07/10 Python
独特的python循环语句
2016/11/20 Python
Python线程指南详细介绍
2017/01/05 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
语文教育专业推荐信范文
2013/11/25 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
MySql分区类型及创建分区的方法
2022/04/13 MySQL
Moment的feature导致线上bug解决分析
2022/09/23 Javascript