当前位置: 首页 > news >正文

尽量使用最新版本的jQuery类库

Query项目中使用了大量的创新。最好的方法来提高性能就是使用最新版本的jQuery。每一个新的版本都包含了优化的bug修复。对我们来说唯一要干的就是修改tag,何乐而不为呢?

我们也可以使用免费的CDN服务,例如, Google来存放jQuery类库。

<!-- Include a specific version of jQuery --> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <!-- Include the latest version in the 1.6 branch --> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>

2. 使用简单的选择器

直 到最近,返回DOM元素的方式都是解析选择器字符串,javascript循环和内建的javascript API例如,getElementbyId(),getElementsByTagName(),getElementsByClassName()三种 方式的整合使用。但是现代浏览器都开始支持querySelectorAll(),这个方法能够理解CSS查询器,而且能带来显著的性能提升。

然而,我们应该避免使用复杂的选择器返回元素。更不用说很多用户使用老版本的浏览器,强迫jQuery去处理DOM树。这个方式非常慢。

$('li[data-selected="true"] a') // Fancy, but slow $('li.selected a') // Better $('#elem') // Best

选择id是最快速的方式。如果你需要使用class名称, 那么你最好带上tag名称,这样会更快些。特别是在老浏览器和移动设备上。

访问DOM是javascript应用最慢的方式 ,因此尽量少使用。使用变量去保存选择器,这样会使用cache来保存。性能更好。

var buttons = $('#navigation a.button'); // Some prefer prefixing their jQuery variables with $: var $buttons = $('#navigation a.button');

另 外一个值得做的是jQuery给了你很多的额外便利选择器 ,例如,:visible,:hidden,:animated还有其它,这些不是合法的CSS3选择器。结果是你使用这些类库就不能有效地利用 querySelectorAll()方法。为了弥补这个问题,你需要先选择元素,再过滤,如下:

$('a.button:animated'); // Does not use querySelectorAll() $('a.button').filter(':animated'); // Uses it

3. 数组方式使用jQuery对象

运行选择器的结果是一个jQuery对象。然而,jQuery类库让你感觉你正在使用一个定义了index和长度的数组。

// Selecting all the navigation buttons: var buttons = $('#navigation a.button'); // We can loop though the collection: for(var i=0;i<buttons.length;i++){ console.log(buttons[i]); // A DOM element, not a jQuery object } // We can even slice it: var firstFour = buttons.slice(0,4);

如果性能是你关注的,那么使用简单for或者while循环来处理,而不是$.each(),这样能使你的代码更快。

检查长度也是一个检查你的collection是否含有元素的方式。

if(buttons){ // This is always true // Do something } if(buttons.length){ // True only if buttons contains elements // Do something }

4. 选择器属性

jQuery提供了一个属性,这个属性显示了用来做链式的选择器。

$('#container li:first-child').selector // #container li:first-child $('#container li').filter(':first-child').selector // #container li.filter(:first-child)

虽然上面的例子针对同样的元素,选择器则完全不一样。第二个实际上是非法的,你不可以使用它来创建一个对象。只能用来显示filter方法是用来缩小collection。

5. 创建一个空的jQuery对象

创建一个新的jQuery空间能极大的减小开销。有时候,你可能需要创建一个空的对象,然后使用add()方法添加对象。

var container = $([]); container.add(another_element);

这也是quickEach方法的基础,你可以使用这种更快的方式而非each()。

6. 选择一个随机元素

上面我提到过,jQuery添加它自己的选择器过滤。除了类库,你可以添加自己的过滤器。只需要添加一个新的方法到$.expr[':']对象。一个非常棒的使用方式是Waldek Mastykarz的博客中提到的:创建一个用来返回随机元素的选择器。你可以修改下面代码:

(function($){ var random = 0; $.expr[':'].random = function(a, i, m, r) { if (i == 0) { random = Math.floor(Math.random() * r.length); } return i == random; }; })(jQuery); // This is how you use it: $('li:random').addClass('glow');

7. 使用CSS Hooks

CSS hooks API是提供开发人员得到和设置特定的CSS数值的方法。使用它,你可以隐藏浏览器特定的执行并且使用一个统一的界面来存取特定的属性。、

$.cssHooks['borderRadius'] = { get: function(elem, computed, extra){ // Depending on the browser, read the value of // -moz-border-radius, -webkit-border-radius or border-radius }, set: function(elem, value){ // Set the appropriate CSS3 property } }; // Use it without worrying which property the browser actually understands: $('#rect').css('borderRadius',5);

更好的在于,人们已经创建了一个支持CSS hooks类库

8. 使用自定义的删除方法

你可能听到过jQuery的删除插件,它能够允许你给你的动画添加特效。唯一的缺点是你的访问者需要加载另外一个javascript文件。幸运的是,你可以简单的从插件拷贝效果,并且添加到jQuery.easing对象中,如下:

$.easing.easeInOutQuad = function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }; // To use it: $('#elem').animate({width:200},'slow','easeInOutQuad');

9. $.proxy()

使用callback方法的缺点之一是当执行类库中的方法后,context被设置到另外一个元素,例如:

<div id="panel" style="display:none"> <button>Close</button> </div>

执行下面代码:

$('#panel').fadeIn(function(){ // this points to #panel $('#panel button').click(function(){ // this points to the button $(this).fadeOut(); }); });

你将遇到问题,button会消失,不是panel。使用$.proxy方法,你可以这样书写代码:

$('#panel').fadeIn(function(){ // Using $.proxy to bind this: $('#panel button').click($.proxy(function(){ // this points to #panel $(this).fadeOut(); },this)); });

这样才正确的执行。$.proxy方法接受两个参数,你最初的方法,还有context。这里$.proxy in the docs.。

10. 判断页面是否太过复杂

一个非常简单的道理,约复杂的页面,加载的速度越慢。你可以使用下面代码检查一下你的页面内容:

console.log( $('*').length );

以上代码返回的数值越小,网页加载速度越快。你可以考虑通过删除无用多余的元素来优化你的代码

11. 将你的代码转化成jQuery插件

如果你要花一定得时间去开发一段jQuery代码,那么你可以考虑将代码变成插件。这将能够帮助你重用代码,并且能够有效的帮助你组织代码。创建一个插件代码如下:

(function($){ $.fn.yourPluginName = function(){ // Your code goes here return this; }; })(jQuery);

你可以在这里开发教程。

12. 设置全局AJAX为缺省

如果你开发ajax程序的话,你肯定需要有”加载中“之类的显示告知用户,ajax正在进行,我们可以使用如下代码统一管理,如下:

// ajaxSetup is useful for setting general defaults: $.ajaxSetup({ url : '/ajax/', dataType : 'json' }); $.ajaxStart(function(){ showIndicator(); disableButtons(); }); $.ajaxComplete(function(){ hideIndicator(); enableButtons(); }); /* // Additional methods you can use: $.ajaxStop(); $.ajaxError(); $.ajaxSuccess(); $.ajaxSend(); */

详细你可以查看这篇文章:

  • 如何快速创建一个AJAX的"加载"的图片效果
  • 5个在线Ajax“加载中”旋转图标生成器工具

13. 在动画中使用delay()方法

链式的动画效果是jQuery的强大之处。但是有一个忽略了的细节就是你可以在动画之间加上delays,如下:

// This is wrong: $('#elem').animate({width:200},function(){ setTimeout(function(){ $('#elem').animate({marginTop:100}); },2000); }); // Do it like this: $('#elem').animate({width:200}).delay(2000).animate({marginTop:100});

jQuery动画帮了我们大忙,否则我们得自己处理一堆的细节,设置timtout,处理属性值,跟踪动画变化等等。

大家可以参考这个文章:jQuery animations

14. 合理利用HTML5的Data属性

HTML5的data属性可以帮助我们插入数据。特别合适前后端的数据交换。jQuery近来发布的data()方法,可以有效的利用HTML5的属性,来自动得到数据。下面是个例子:

<div id="d1" data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'> </div>

为了存取数据你需要调用如下代码:

$("#d1").data("role"); // "page" $("#d1").data("lastValue"); // 43 $("#d1").data("hidden"); // true; $("#d1").data("options").name; // "John";
http://www.jsqmd.com/news/1125127/

相关文章:

  • kubernetes(K8s)学习笔记:第八期与第九期核心知识点自测与详解
  • Transformers.js:让AI在浏览器中运行的革命性技术
  • Trace 采样策略:别等事故来了才发现没证据
  • Go 限流中间件:令牌桶之外还要看排队语义
  • 556页集团供应链、营销案例,从断裂到贯通:构建生产供应链、财务成本与营销数字化的四步战略落地闭环
  • 2026-02 Google announcement
  • 【OpenHarmony/HarmonyOs 】函数图像绘制实践:ArkTS 表达式解析与 Canvas 曲线采样
  • Chrome DevTools 3步定位 Blob 视频源:从 Network 面板到 m3u8 链接实战
  • 题解:洛谷 B4554 [GESP202606 二级] 菱形
  • 实景动态重构:新一代视频孪生技术范式研究
  • Go 泛型的运行时性能:单态化、接口装箱与编译器优化的基准分析
  • Seedance2.5 官网在哪?新模型还没开放,创作者们已经坐不住了!
  • MCP企业运用全面知识点-进阶篇
  • 显卡驱动彻底清理指南:3分钟掌握DDU专业工具
  • 为什么选择MaiBot:3个让你快速上手的智能聊天机器人部署技巧
  • 5步构建企业级数据治理平台:OpenMetadata深度实践指南
  • IS31FL3731 LED驱动芯片与PIC18LF25K40微控制器应用解析
  • 题解:洛谷 B4553 [GESP202606 二级] 完全平方数计数
  • reverse和substr用法
  • 手机内存不足怎么清理不删文件?免费方案+靠谱工具推荐|避坑指南
  • 鸿蒙应用安全认证实战:基于HUKS密钥库的签名验签方案详解
  • VRRTest:3步检测你的显示器可变刷新率是否真正工作
  • FModel:Unreal Engine游戏档案浏览器完整指南
  • ng系列.
  • 【OpenHarmony/HarmonyOs 】科学计算器实现细节:本地表达式解析、历史记录与零网络依赖
  • WebAssembly 跨语言数据格式:JSON 方便,但不一定便宜
  • AI机器学习高级数学与优化
  • 豆包AI vs DeepSeek:生活可用性与技术能力的范式之辨
  • AI写教材必备攻略!掌握这些技巧,低查重生成高质量教材不是梦
  • SQL注入从原理到实战:手工注入、绕过技巧与安全防御详解