7个jQuery最佳实践


Posted in Javascript onJanuary 12, 2016

随着富网络应用(rich web applications)数量的增长,以及用户对快速交互响应的高期望,开发者开始使用JavaScript库来快速高效的完成一些重复性的工作。这其中最流行的JavaScript库就是jQuery。但是jQuery的大量应用却带来了另外一个问题:在使用JavaScript库的时候,有哪些最佳实践,又有哪些不好的实践呢?

7个jQuery最佳实践

背景

在这篇文章中,我会给大家介绍在编写、调试和审查JavaScript代码的时候一些好的实践(至少我是这么认为的)。事实上,我选择了其中7个最常见的场景。

1、使用CDN及其回退地址(fallback)

CDN代表内容传递网络(Content Delivery Network),是一个缓存了JavaScript文件的服务器。使用CDN之后,每当一个新用户发起请求的时候,你的应用程序可以使用CDN缓存,而不用从你的服务器上重新加载库文件。Google、Microsoft和JQuery都提供CDN服务。

鉴于网络并不总是100%可靠,服务器也可能因为一些原因宕机,你必须要确保即使这些事情发生,你的应用程序依然能正常运行。这时候我们就要用到回退地址:当应用程序无法找到缓存库的时候,它就会回退回来,使用服务器文件。

Google CDN 是这样的:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"> </script>

Microsoft CDN是这样的:

<script src="//ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js"> </script>

需要注意的是,我们没有指定URL协议为http而是使用的//。这是因为CDN服务器支持http和https,如果你的网站拥有SSL认证,你无须修改就可以正常加载文件。

另外,就像我之前提到的那样,我们还需要一个回退地址,以防CDN服务器出现问题。

<script>Window.JQuery || document.write(‘<script src=”script/localsourceforjquery”></script>’)

当然,你也可以用Require来配置需要的jQuery,不过我觉得就这样也不错。

2、限制DOM交互

用JavaScript操作DOM树是存在性能消耗的。jQuery也一样。所以,尽量减少与DOM的交互吧。当我帮助我一个同事提高数据显示速度的时候,我看见他在一个循环里面使用了选择器。这简直是性能杀手!他是这样写的:

containerDiv = $("#contentDiv");
for(var d =0; d < TotalActions; d++)
{
 containerDiv.append("<div><span class='brilliantRunner'>" + d + "</span></div>");
}

有什么问题呢?咋一看没啥问题。而且我的同事也说这段代码跑得很欢乐呢!我真是哔了狗了!当TotalActions小于50时,察觉不到任何问题;但是其达到25000的时候,速度便降低了很多,原因(我也是google到的)就是DOM交互放到了循环当中。

对于这个功能,(多次尝试失败之后)我将循环中的直接DOM交互替换成了一个数组的push操作,然后用一个空字符串作为分隔符将数组连接(join)起来。最后,程序当然变得更加流畅和高效了。

var myContent=[];
for(var d = 0; d < TotalActions; d++)
{
 myContent.push("<div><span class='brilliantRunner'>" + d + "</span></div>");
}
containerDiv.html(myContent.join(""));

3、缓存

jQuery最重要也是最有特色的地方,就是它的选择器以及在DOM树中查找HTML元素的方式。但是,我多次看到,一些开发者在同一个函数中,多次调用相同的选择器,比如 $(“#divid”)。尽管jQuery选择元素非常快,但也不要每次都去查找相同的元素吧。所以,你可以像这样缓存的你元素:

var $divId = $("#divId")

然后在接下来的代码中,就可以用$divId了。

对于下面的代码:

var thefunction = function()
{
 $("#mydiv").ToggleClass("zclass");
 $("#mydiv").fadeOut(800);
}

var thefunction2 = function()
{
 $("#mydiv").addAttr("name");
 $("#mydiv").fadeIn(400);
}

我们可以对它做这样的修改,并且使用链式语法,使其看起来更加漂亮:

var mydiv =$("#mydiv");
var thefunction = function()
{
 mydiv.ToggleClass("zclass").fadeOut(800);
}

var thefunction2 = function()
{
 mydiv.addAttr("name").fadeIn(400);
}

但是话又说回来,你也不用每次把所有东西都缓存起来。看下面的例子:

$("#link").click(function()
{
  $(this).addClass("gored");
}

在这里,我既没有用 $(“#link”),或者将其缓存起来,而是使用的$(this)。因为在这个例子中,我操作的对象就是这个链接本身。

4、find 和 filter

最近,在使用find()来获取jQuery对象结合的时候,我产生了一些困惑。然后我发现,这个操作可以替换为用filter()方法来实现。理解这两者的区别非常重要:

find: 将会从选定的元素开始,一直向下查找DOM树

filter: 是在jQuery集合当中查找
5、end()

当在jQuery集合中进行链式操作的时候,我有时候需要回到父对象去进行一些操作。比如你正在一个表格的第二行应用CSS,然后希望回到表格对象,对其添加一些样式。在你对行应用完样式之后,只要使用end()方法,你就会自动回到表格对象,然后随意的对其添加样式吧!

(译者注:find()、filter()和end()原文是大写,其实应该是小写)

6、对象字面量

当你通过链式语法来操作元素的CSS属性的时候,你可以使用对象字面量方式来提升性能。比如这段代码:

$("#myimg").attr("src", "thepath").attr("alt", "the alt text");

变成下面这样之后,不仅避免了操作DOM元素,而且还不用多次调用相关的设置方法:

$("#myimg").attr({"src": "thepath", "alt": "the alt text"});

7、善用CSS类

尽可能使用CSS类而不要写内联CSS代码。我想这一点就不需要举例说明了吧。

希望这篇文章能够帮助你编写更好的jQuery应用程序,真正的帮助到大家。

Javascript 相关文章推荐
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
Apr 18 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
认识less和webstrom的less配置方法
Aug 02 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
Aug 09 jQuery
jquery实现动态改变css样式的方法分析
May 27 jQuery
vue使用recorder.js实现录音功能
Nov 22 Javascript
JavaScript中MutationObServer监听DOM元素详情
Nov 27 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 #Javascript
JavaScript实现输入框(密码框)出现提示语
Jan 12 #Javascript
javascript自动恢复文本框点击清除后的默认文本
Jan 12 #Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 #Javascript
jquery模拟实现鼠标指针停止运动事件
Jan 12 #Javascript
js实现字符串和数组之间相互转换操作
Jan 12 #Javascript
js右下角弹出提示框示例代码
Jan 12 #Javascript
You might like
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
python打开音乐文件的实例方法
2020/07/21 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
教师查摆问题自查报告
2014/10/11 职场文书
个人自查自纠材料
2014/10/14 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
执行力心得体会范文
2016/01/11 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
nginx访问报403错误的几种情况详解
2022/07/23 Servers