`
suqing
  • 浏览: 186765 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

jQuery提升性能的代码规范

阅读更多


  1. 总是从#id继承
  2. Class前加tag名
  3. 缓存jQuery对象
  4. 善于使用jQuery连缀的写法
  5. 使用子查询
  6. 尽量减少直接 操作(Manipulation)DOM
  7. 使用时间委托(别名.冒泡)
  8. 消除无用的查询
  9. 延迟加载到 $(window).load

1. 总是从#id继承

jQuery最快的选择器是ID ($('#someid')). 因为直接对应JavaScript方法, getElementById().

看看class是怎么选的 ($('sometag.someclass')).

function getElementsByClassName(n) {
    var el = [],
        _el = document.getElementsByTagName('*');
    for (var i=0; i<_el.length; i++ ) {
        if (_el[i].className == n ) {
            el[el.length] = _el[i];
        }
    }
    return el;
}
 

选择单个元素

<div id="content">
	<form method="post" action="/">
		<h2>Traffic Light</h2>
		<ul id="traffic_light">
			<li><input type="radio" class="on" name="light" value="red" /> Red</li>

			<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
			<li><input type="radio" class="off" name="light" value="green" /> Green</li>
		</ul>

		<input class="button" id="traffic_button" type="submit" value="Go" />
	</form>
</div>
 

慢的写法:

var traffic_button = $('#content .button');
 

直接选中按钮更快:

var traffic_button = $('#traffic_button');
 

选择多个元素

多个元素的选择,就是DOM的遍历和循环,这种实现方式比较慢。为了优化性能,应该总是从最近的带ID的父元素继承:

var traffic_lights = $('#traffic_light input');
 

2. Class前加tag名

jQuery中第二快的是tag选择器 ($('head')).同样,也是对应一个纯粹的JS方法, getElementsByTagName()

<div id="content">

	<form method="post" action="/">
		<h2>Traffic Light</h2>
		<ul id="traffic_light">
			<li><input type="radio" class="on" name="light" value="red" /> Red</li>

			<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
			<li><input type="radio" class="off" name="light" value="green" /> Green</li>
		</ul>

		<input class="button" id="traffic_button" type="submit" value="Go" />
	</form>
</div>
 

应该在class前都加上tag(最好继承自一个ID):

var active_light = $('#traffic_light input.on');
 

Note: class选择器是jQuery中效率最低的选择器;在IE下他遍历整个DOM. 尽各种可能避免这么写. 绝不能在ID前加tag名。

如下,因为它会先遍历所有的<div> 元素,匹配id为‘content’ :

var content = $('div#content');
 

同样,多个id继承是很冗余的做法:

var traffic_light = $('#content #traffic_light');
 

3. 缓存jQuery对象

养成使用变量保存jQuery对象的习惯,如下:

$('#traffic_light input.on).bind('click', function(){...});
$('#traffic_light input.on).css('border', '3px dashed yellow');
$('#traffic_light input.on).css('background-color', 'orange');
$('#traffic_light input.on).fadeIn('slow');
 

应该是, 先用局部变量保存对象,再进行其他操作:

var $active_light = $('#traffic_light input.on');
$active_light.bind('click', function(){...});
$active_light.css('border', '3px dashed yellow');
$active_light.css('background-color', 'orange');
$active_light.fadeIn('slow');
 

Tip: 既然我们使用的是jQuery库,通常使用$作为标志,变量以$开头。 记住, 绝不使用同样的jQuery选择器 超过一次

Bonus Tip – 为以后的使用保存jQuery结果

如果你想再程序的其他地方使用jQuery的结果,或者函数不止一次执行,缓存到一个全局范围的对象中 .

通过定义一个全局变量,可以在其他函数中调用它:

//定义一个全局变量 (比如 window 对象)
window.$my =
{
	// 初始化多次使用的条件
	head : $('head'),
	traffic_light : $('#traffic_light'),
	traffic_button : $('#traffic_button')
};

function do_something()
{
	// 在这里引用保存的变量
	var script = document.createElement('script');
	$my.head.append(script);

	// 函数中,可以继续添加全局的jQuery变量
	$my.cool_results = $('#some_ul li');
	$my.other_results = $('#some_table td');

	// 仍然可以使用jQuery连缀
	$my.other_results.css('border-color', 'red');
	$my.traffic_light.css('border-color', 'green');
}
 

4. 善于使用jQuery连缀的写法

上面的代码也可以写成这样:

var $active_light = $('#traffic_light input.on');$active_light.bind('click', function(){...})
	.css('border', '3px dashed yellow')
	.css('background-color', 'orange')
	.fadeIn('slow');
 

这样做的好处是更少更简洁的代码.

5. 使用子查询

jQuery能在一个集合中继续使用选择器.这样减少了性能开销,因为已经将父元素保存在变量中。

<div id="content">
	<form method="post" action="/">
		<h2>Traffic Light</h2>
		<ul id="traffic_light">

			<li><input type="radio" class="on" name="light" value="red" /> Red</li>
			<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
			<li><input type="radio" class="off" name="light" value="green" /> Green</li>

		</ul>
		<input class="button" id="traffic_button" type="submit" value="Go" />
	</form>
</div>
 

例如,我们可以先查询和缓存父元素,真正使用的是它的两个子元素.

var $traffic_light = $('#traffic_light'),
	$active_light = $traffic_light.find('input.on'),
	$inactive_lights = $traffic_light.find('input.off');
 

Tip: 你可以同时声明多个局部变量,用逗号分隔,节约敲键盘的次数!

6. 尽量减少直接 操作DOM

基于的思想是,需要保存在内存中的到底是什么,  更新 DOM. 这不是一个jQuery的最佳实践,但却是最有效的js代码. 

直接操作DOM元素十分缓慢. 例如,你需要动态创建列表元素,别这么做:

var top_100_list = [...], // assume this has 100 unique strings
	$mylist = $('#mylist'); // jQuery selects our <ul> element

for (var i=0, l=top_100_list.length; i<l; i++)
{
	$mylist.append('<li>' + top_100_list[i] + '</li>');
}
 

而应该是,在操作DOM之前,先创建列表元素的字符串:

var top_100_list = [...], //假设有100个元素
	$mylist = $('#mylist'), //先选择 <ul> 
	top_100_li = ""; // 用来存储list元素

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);
 

更快的做法, 在插入前把这些元素封装到单独的父节点中:

var top_100_list = [...], // assume this has 100 unique strings
	$mylist = $('#mylist'), // jQuery selects our <ul> element
	top_100_ul = '<ul id="#mylist">'; // This will store our entire unordered list

for (var i=0, l=top_100_list.length; i<l; i++)
{
	top_100_ul += '<li>' + top_100_list[i] + '</li>';
}
top_100_ul += '</ul>'; // Close our unordered list

$mylist.replaceWith(top_100_ul);
 

如果你按照上面的方法,仍然担心性能问题:

  • 试试jQuery的 clone() 方法. 它创建了节点数的拷贝.
  • 使用 DOM DocumentFragments(一个轻量文档对象,文档树的一部分,或者是将要被插入到文档树的文档对象。
  • 非常适合“剪切粘贴”的操作). creator of jQuery points out,性能比直接操作DOM更好

7. 使用时间委托(别名.冒泡)

除非特别指出,每一个事件(如点击鼠标,悬停等),JavaScript都会沿着DOM树“冒泡“到父元素。

这是很有用的一个特性,当许多元素(或节点)都要调用同一个函数。

不应该将一个事件监听功能绑定到多个节点,这是非常低效的,你可以把它绑定到它们的父元素,这样只要绑定一次,辨别出触发事件的节点就可以啦。

例如,假设我们正在开发一个有许多输入框的表单,并在选中时添加/删除一个class。像这样的绑定是低效的:

$('#myList li).bind('click', function(){
	$(this).addClass('clicked');
	// do stuff
});
 

应该在父级监听点击事件:

$('#myList).bind('click', function(e){
	var target = e.target, // e.target grabs the node that triggered the event.
		$target = $(target);  // wraps the node in a jQuery object
	if (target.nodeName === 'LI') {
		$target.addClass('clicked');
		// do stuff
	}
});
 

当你发现自己绑定同一个事件监听器的到许多相同的节点,你正在降低代码的性能.

8. 消除无用的查询

如果没有找到任何匹配的元素,虽然jQuery将失败的查询处理地很好,它仍然需要花费时间来寻找他们。

如果整个网站需要一个全局的JavaScript,大部分人会用$(document).ready(function(){ // all my glorious code })实现。

最有效的办法是使用内联的初始化功能,让模板页面能完全控制JavaScript的执行时间和地点。

例如,在您的“文章“的模板页面,在</body>前写入下面的代码:

<script type="text/javascript>
mylib.article.init();
</script>
</body>

如果您的模板中包含了很多模块,虽然单个页面可能用也可能不用,但是由于某些原因,可以模块后立即初始化函数。

<ul id="traffic_light">
	<li><input type="radio" class="on" name="light" value="red" /> Red</li>

	<li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>
	<li><input type="radio" class="off" name="light" value="green" /> Green</li>
</ul>
  <script type="text/javascript>
mylib.traffic_light.init();
  </script>

全局的js库格式如下:

var mylib =
{
	article_page :
	{
		init : function()
		{
			// Article page specific jQuery functions.
		}
	},
	traffic_light :
	{
		init : function()
		{
			// Traffic light specific jQuery functions.
		}
	}
}
 

9. 延迟加载到$(window).load

大多数页面都可以看到 $(document).ready , 在对象仍然在下载的时候它。

如果你发现网页载入时停滞, 可能问题就在$(document).ready上. 通过 将函数绑定到$(window).load中,减少CPU使用率。

二者的差别在于: $(document).ready(fn)发生在"网页本身的HTML"载入后就触发,

$(window).load(fn)则会等到"网页HTML标签中引用的图档、内嵌物件(如Flash)、IFrame"等拉哩拉杂的东西都载入后才会触发。

$(window).load(function(){
	// jQuery functions to initialize after the page has loaded.
});
 

适用场景:像拖拽 (drag and drop)这些功能,结合了视觉效果(effects)和动画(animation)效果,预先获取隐藏的图像等等.

分享到:
评论

相关推荐

    jQuery攻略 源代码

    9. **最佳实践**: 遵循官方推荐的编码规范和设计模式,提升代码质量。 通过深入研究《jQuery攻略 源代码》,开发者不仅能掌握jQuery的基本用法,还能培养出解决复杂问题的能力,从而在实际项目中更加游刃有余。无论...

    jquery代码规范让代码越来越好看

    总结来说,通过遵循一定的jQuery代码规范,可以显著提升代码质量,使代码既美观又易于理解。这对于前端开发人员来说,是一种非常必要的职业素养。无论是对于个人开发者还是团队合作,规范化的代码都能够带来长远的...

    jQuery权威指南-源代码

    特别是新版本1.4.x的发布,jQuery在功能和性能方面都有质的提升,极大地满足了广大开发者提出的更高要求。因此,为了提高Web开发的效率和强化Web应用的功能,熟练使用jQuery是Web开发者必备的一种能力。 《jQuery...

    jQuery添加产品分类菜单代码.zip

    4. **CSS样式控制**:为了使菜单美观并符合设计规范,jQuery代码可能会与CSS样式结合使用,通过`addClass()`, `removeClass()`等方法动态地添加或移除CSS类,来改变元素的样式和布局。 5. **AJAX交互**:虽然这个...

    jQueryEasyUI 1.1完整源代码

    - **代码规范**: 遵守良好的编程习惯,保持代码整洁,注释清晰。 - **性能优化**: 使用minify工具对源码进行压缩,减少HTTP请求,提高加载速度。 通过学习和使用jQueryEasyUI 1.1的完整源代码,开发者不仅可以...

    JQuery1.4.1与JQuery1.8.3

    1. **性能提升**:在 1.4.1 版本中,jQuery 团队专注于提高库的性能,特别是针对 DOM 操作和事件处理进行了优化。 2. **新的选择器引擎Sizzle**:这个版本引入了 Sizzle,一个独立的选择器引擎,增强了 jQuery 的 ...

    jQuery 星级评分效果实例 基于jQuery 的星级评分效果实例,淘宝网和口啤网等大网站都可见到本效果,本代码同样借鉴了口啤网,感谢原作者,因本人水平有限,本星级评分代码性能仍有一定提升空间,只是闲来无聊练手之作。

    这里提到的代码可能有提升空间,可以通过减少DOM操作次数、利用事件委托或优化CSS选择器等方式来提升代码执行效率。同时,考虑到兼容性和可维护性,我们应该遵循良好的编码规范,如使用模块化开发,将代码组织成可...

    jquery-3.0.0.js 、jquery-3.0.0.min.js 【官方jquery包 js】

    2. 性能提升:3.0.0版本对内部算法进行了优化,提高了代码执行效率,尤其是对于大规模DOM操作时,性能提升显著。 3. 模块化:jQuery 3.0.0遵循AMD(Asynchronous Module Definition)模块化规范,允许开发者按需...

    jquery-3.0.0

    在jQuery 3.0.0中,这些操作的性能得到了进一步提升。 四、事件处理 jQuery的事件处理功能简化了JavaScript原生事件的绑定和解绑,例如`.on()`和`.off()`。此外,`.trigger()`和`.one()`等方法提供了事件触发和一...

    JQuery chm帮助文件(多个版本)

    **jQuery CHM帮助文件概述** jQuery是一个广泛使用的JavaScript库,它极大...总的来说,拥有这些CHM文件,开发者可以在开发过程中快速查阅API,提升工作效率,尤其对于初学者来说,是学习和掌握jQuery的重要参考资料。

    jquery 1.5 到2.13 全套

    自1.5版本以来,jQuery经历了多次迭代,不断优化性能,增强功能,以适应日益复杂的Web开发需求。本文将对jQuery 1.5到2.1.3的主要更新和关键特性进行深入探讨。 1. jQuery 1.5:核心改进与新特性 - Deferred对象:...

    jquery1.6.3与jquery1.9.0包

    在jQuery 1.9.0中,一些非标准的CSS选择器被移除,如`$:even`和`:odd`,取而代之的是使用更规范的`:nth-child(even)`和`:nth-child(odd)`。此外,`live()`方法被废弃,取而代之的是更强大的`on()`和`off()`,这为...

    jQuery各类炫酷效果demo

    jQuery是一款广泛应用于网页交互与动态效果开发的...此外,使用最新的jQuery 3.1版本意味着这些代码遵循现代的编程规范,兼容性好,性能更优。开发者可以通过查看和学习这些示例,进一步提升自己的网页开发能力。

    jquery-2.2.4插件

    本文将深入探讨jQuery 2.2.4版本及其相关插件的使用,帮助读者理解和掌握这一核心版本中的重要特性,以及如何有效地利用它来提升网页的交互性和性能。 首先,让我们来看看jQuery 2.2.4的核心特性。这一版本主要关注...

    jquery 1.5 1.6 1.7

    四、jQuery 1.6:选择器性能提升与属性访问的规范化 1.6版本对选择器引擎进行了优化,提升了选择元素的速度。此外,它明确了属性访问的规则,将`.attr()`和`.prop()`分离,`.attr()`用于获取/设置HTML属性,`.prop...

    大图jQuery多屏首页焦点图代码,兼容主流浏览器

    - "ecmascript":ECMAScript是JavaScript的标准化版本,表明代码可能遵循ECMAScript规范。 【文件名称解析】 "readme.md"通常是项目或代码库的说明文件,通常包含项目介绍、安装步骤、使用方法、贡献指南等内容。...

    jQuery自定义转盘抽奖代码.zip

    这些图片对于提升用户体验至关重要,它们需要适配各种屏幕尺寸,并且在加载时不能影响页面的性能。 "js" 文件夹内是JavaScript源代码,其中的核心文件可能是 "lottery.js" 或类似名称。这个文件实现了抽奖逻辑,...

    jquery验证框架学习教程

    此外,开发者还将学会如何使用jQuery来美化用户界面并提升用户体验,以及如何在现有的开发环境中应用jQuery来解决常见的JavaScript编码问题。推荐进一步阅读相关书籍,如“jQuery实战”,以深入理解和掌握jQuery的...

    jQuery万年历日历设置代码.zip

    9. **性能优化**:对于大型应用,避免频繁的DOM操作可以显著提升性能。开发者应学习并实践如事件委托、延迟加载等优化技巧。 10. **测试与调试**:最后,良好的测试习惯是保证代码质量的关键。开发者需要编写单元...

    jquery仿淘宝SKU选择商品属性代码

    总的来说,这个项目涵盖了前端开发的多个重要方面,包括DOM操作、事件处理、数据交互、用户界面优化以及代码组织,对于学习和提升Web开发技能,尤其是电商领域的开发实践,具有很高的参考价值。

Global site tag (gtag.js) - Google Analytics