当前位置: 首页 > 编程日记 > 正文

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(&lsquo;<script src=&rdquo;script/localsourceforjquery&rdquo;></script>&rsquo;)

当然,你也可以用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应用程序。

转载于:https://www.cnblogs.com/shinians/p/5217602.html

相关文章:

关于一些Linux SVN的安装使用

关于一些Linux SVN的安装使用 SVN简介The goal of the Subversion project is to build a version control system that is a compelling replacement for CVS in the open source community. The software is released under an Apache/BSD-style open source license.SVN是一…

【转】触屏手机电话拨打链接

1、web方式&#xff1a; <a href"tel:4008006666">电话&#xff1a;4008006666</a> 2、wap方式&#xff08;主要hack QQ和UC浏览器&#xff09; <a href"wtai://wp/mc;4008006666">电话&#xff1a;4008006666</a>转载于:https://…

java redis 主从 哨兵_Redis主从复制与哨兵机制

Redis主从复制1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave)&#xff0c;主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从数据库&#xff0c;而从数据库一般是只读的&#xff0c;并接收主数据库…

不同变量的区别

1、形参、局部变量以及局部静态变量的区别。 形参和局部变量均属于自动对象&#xff0c;当到达定义所在的块末尾时被销毁&#xff1b;而局部静态变量自定义开始&#xff0c;直到程序结束才被销毁。 2、全局变量和静态全局变量的区别。 全局变量本身就是静态存储方式&#xff0c…

Java 使用 Redis

2019独角兽企业重金招聘Python工程师标准>>> 安装 开始在 Java 中使用 Redis 前&#xff0c; 我们需要确保已经安装了 redis 服务及 Java redis 驱动&#xff0c;且你的机器上能正常使用 Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Ja…

IPMSM弱磁控制策略

下面将详细介绍这种控制策略的实现过程:(l)具有快速动态响应的前馈弱磁控制策略电动汽车用永磁电动机驱动系统应具有较快的转速响应速度&#xff0c;而传统的的弱磁控制策略通常是先根据电机转速的变化调整交轴电流iq&#xff0c;而后根据转速给定值计算得出直轴电流id这种方法…

java 并发统计_java并发编程|CountDownLatch计数器

0x01,CountDownLatch介绍CountDownLatch是一个计数器&#xff0c;作为java并发编程中三个组件之一&#xff0c;这个组件的使用频率还是很多的。这里分享下自己画的java并发编程组件的图&#xff0c;后面一一介绍这几个组件的使用。上面图片标注的1,2,3分别是自己觉得重要性的&a…

MySQL查询随机数据的4种方法和性能对比

从MySQL随机选取数据也是我们最常用的一种发发&#xff0c;其最简单的办法就是使用”ORDER BY RAND()”,本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法&#xff0c;并分析了各自的优缺点。下面从以下四种方案分析各自的优缺点。方案一&#xff1a; 复制代码 代码如下:…

【转】CPU位数、核数、个数

转自&#xff1a;http://blog.chinaunix.net/uid-20344928-id-2985712.html 32 or 64 linux下查看操作CPU的运行位数&#xff1a; getconf LONG_BIT 如结果是32&#xff0c;表示当前CPU工作在32位模式下&#xff08;即操作系统是32位的&#xff09;&#xff0c;但并不表示CPU一…

JPA常用注解

2019独角兽企业重金招聘Python工程师标准>>> JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象&#xff0d;关系表的映射关系&#xff0c;并将运行期的实体对象持久化到数据库中。 JPA由EJB 3.0软件专家组开发&#xff0c;作为JSR-220实现的一…

php pthread 实例,php 真正的多线程 pthread

对于php&#xff0c;有很多种多进程的实现&#xff0c;这里就不说了&#xff0c;下面介绍一种多线程的方式。php真正的多线程实现方式&#xff0c;通过安装php的扩展&#xff1a;pthread 扩展安装步骤如下&#xff1a;1.下载地址是这个&#xff1a;但是这个下载的是 版本3 也就…

Java基础学习总结(1)——equals方法

2019独角兽企业重金招聘Python工程师标准>>> 一、equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test;2 3 public class TestEquals {4 public static void main(String[] args) {5 /**6 * 这里使用构造方法Cat()在堆…

动态规划:求最大公共子串

1 /// <summary>2 /// 动态规划&#xff1a;求最大公共子串3 /// LCS (Longest Common Subsequence)4 /// </summary>5 private static string LCS(string str1, string str2)6 { 7 var d …

java 不可最小化,java – 这是最小化绑定失效的有效方法吗?

我有一些复杂的Observable结构,这可能是也可能不是坏主意,但这不是这个问题的焦点.这些结构的问题在于它们会产生很多UI显示的Observable对象的失效.就像我所知道的那样,当JavaFX UI显示某些内容时,它在其上注册了ChangeListener,因此任何使用延迟评估的尝试都会消失.也就是说,…

让你的javascript函数拥有记忆功能,降低全局变量的使用

考虑例如以下场景&#xff1a;假如我们须要在界面上画一个圆&#xff0c;初始的时候界面是空白的。当鼠标移动的时候&#xff0c;圆须要尾随鼠标移动。鼠标的当前位置就是圆心。我们的实现方案是&#xff1a;假设界面上还没有画圆&#xff0c;那么就新创建一个&#xff1b;假设…

Maven学习总结(6)——Maven与Eclipse整合

2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(六)——Maven与Eclipse整合 一、安装Maven插件 下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin 进入到eclipse中的dropins目录…

为python安装numpy和scipy(federo)

为了进行数值计算&#xff0c;例如积分等等&#xff0c;需要安装numpy和scipy&#xff0c;其中scipy是依赖于numpy的&#xff0c;所以先要装numpy. 1&#xff0c; 通过下载http://pypi.python.org/pypi/numpy&#xff0c;然后python set.up install安装&#xff0c;不过有些行不…

php执行mysql insert,当执行mysql insert 时插入两条是咋回事

当执行mysql insert 时插入两条是怎么回事&#xff1f;本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑//做了一个手机上传图片到服务器的功能。但是获取到执行insert语句时都要执行两次&#xff01;//index.phpheader("Content-Type: text/html; charsetUTF-…

产品经理要读什么书?怎么读?

产品相关知识可以在&#xff1a;http://www.aipingce.com/进行学习&#xff0c;本文转自&#xff1a;http://www.aipingce.com/article-22960-1.html 首先&#xff0c;我个人还是非常推荐大家看实体书的&#xff0c;原因如下&#xff0c;算是做个分析吧&#xff1a; 电子书是免…

HTML5:理解head

2019独角兽企业重金招聘Python工程师标准>>> HTML文档的head部分&#xff0c;通常包括指定页面标题&#xff0c;为搜索引擎提供关于页面本身的信息&#xff0c;加载样式表&#xff0c;以及加载JavaScript文件&#xff08;出于性能考虑&#xff0c;多数时候放在页面底…

php定时任务为什么不好写,php解决crontab定时任务不能写入文件问题的方法分析...

本文实例讲述了php解决crontab定时任务不能写入文件问题的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;今天使用crontab写的定时任务没有执行&#xff0c;很纳闷。crontab.phperror_reporting(0);$time date("Y-m-d h:i:s",time());file_put_conten…

SpringMVC权限管理

2019独角兽企业重金招聘Python工程师标准>>> 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet&#xff0c;所有的请求都通过DispatcherServlet。 DispatcherServlet是前置控制器&#xff0c;配置在web.xml文件中的。拦截匹配的请求&#xff0c;Servl…

搭建Hadoop集群步骤

——基于三台机器 一、前提 1、 首先要有三台已联网机器&#xff0c;假设为A&#xff0c;B1&#xff0c;B2。其中A&#xff1a;192.168.81.91&#xff1b;B1:192.168.81.92&#xff1b;B2:192.168.81.93。机器装有Ubuntu10.04服务器版64位操作系统。 2、 对三台机器做相同的处…

使用DCloud+Framework7制作移动APP应用(一)

http://my.oschina.net/kenblog/blog/516201转载于:https://www.cnblogs.com/NodeStudy/p/5223273.html

nsq php,Nsq从入门到实践

当nsq跑起来之后, 我们可能会遇到以下问题分布式部署处理错误(何时requeue)如何使用golang lib抱着不应该只停留在入门的态度, 笔者粗浅的研究了一下这几个问题, 希望也对有同样疑问的人有帮助.部署由于NSQ的分布式网络结构, NSQD必须广播(到lookup)自己的地址并让消费者连接, …

Java单元测试之JUnit4详解

2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同&#xff0c;JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有&#xff1a; BeforeClass 全局只会执行一次&#xff0c;而且是第一个运行Before 在测试方法运行之前运行…

Java 学习笔记 ------第二章 从JDK到IDE

本章学习目标&#xff1a; 了解与设定PATH了解与指定CLASSPATH了解与指定SOURCEPATH使用package与import管理类别初步认识JDK与IDE的对应关系一、第一个Java程序 工具&#xff1a;使用Windows自带记事本或下载其他编辑器&#xff08;推荐NotePad和Sublime&#xff09; //第一个…

Delphi中的容器类(二)

TStrings类 出于效率的考虑&#xff0c;Delphi并没有象C和Java那样将字符串定义为类&#xff0c;因此TList本身不能直接存储字符串&#xff0c;而字符串列表又是使用非常广泛的&#xff0c;为此Borland提供了TStrings类作为存储字符串的基类&#xff0c;应该说是它除了TList…

Java怎么把数组怎么放入set,如何将数组转换为Java中的Set

回答(16)2 years ago我从上面的建议中写下了以下内容 - 偷了它......真好&#xff01;/*** Handy conversion to set*/public class SetUtil {/*** Convert some items to a set* param items items* param works on any type* return a hash set of the input items*/public s…

vue组件定义、组件的切换、组件的通信、渲染组件的几种方式(标签、路由、render)...

vue中全局的概念是什么&#xff1f;---就是全局定义的功能&#xff0c;所有实例化的vm都可以使用&#xff0c; 全局定义的是挂在构造函数Vue上面的&#xff0c;所以实例化出的对象都可以使用这个功能 1、什么是组件&#xff1f;---从UI的角度把页面拆分成不同的部分&#xff0…