2. 在class前面使用tag jQuery中第二快的选择器就是tag选择器(如$(‘head")),因为它和直接来自于原生的Javascript方法getElementByTagName()。所以最好总是用tag来修饰class(并且不要忘了就近的ID) 复制代码 代码如下: var receiveNewsletter = $("#nslForm input.on");
jQuery中class选择器是最慢的,因为在IE浏览器下它会遍历所有的DOM节点。尽量避免使用class选择器。也不要用tag来修饰ID。下面的例子会遍历所有的div元素来查找id为"content"的那个节点: 复制代码 代码如下: var content = $("div#content"); // 非常慢,不要使用
用ID来修饰ID也是画蛇添足: 复制代码 代码如下: var traffic_light = $("#content #traffic_light"); // 非常慢,不要使用
3. 使用子查询 将父对象缓存起来以备将来的使用 复制代码 代码如下: var header = $("#header"); var menu = header.find(".menu"); // 或者 var menu = $(".menu", header);
4. 优化选择器以适用Sizzle的“从右至左”模型 自版本1.3之后,jQuery采用了Sizzle库,与之前的版本在选择器引擎上的表现形式有很大的不同。它用“从左至右”的模型代替了“从右至左”的模型。确保最右的选择器具体些,而左边的选择器选择范围较宽泛些: 复制代码 代码如下: var linkContacts = $(".contact-links div.side-wrapper");
而不要使用 复制代码 代码如下: var linkContacts = $("a.contact-links .side-wrapper");
5. 采用find(),而不使用上下文查找 .find()函数的确快些。但是如果一个页面有许多DOM节点时,需要来回查找时,可能需要更多时间: 复制代码 代码如下: var divs = $(".testdiv", "#pageBody"); // 2353 on Firebug 3.6 var divs = $("#pageBody").find(".testdiv"); // 2324 on Firebug 3.6 - The best time var divs = $("#pageBody .testdiv"); // 2469 on Firebug 3.6
二、优化DOM操作建议 8. 缓存jQuery对象 将你经常用的元素缓存起来: 复制代码 代码如下: var header = $("#header"); var divs = header.find("div"); var forms = header.find("form");
9. 当要进行DOM插入时,将所有元素封装成一个元素 直接的DOM操作很慢。尽可能少的去更改HTML结构。 复制代码 代码如下: var menu = "<ul id="menu">"; for (var i = 1; i < 100; i++) { menu += "<li>" + i + "</li>"; } menu += "</ul>"; $("#header").prepend(menu); // 千万不要这样做: $("#header").prepend("<ul id="menu"></ul>"); for (var i = 1; i < 100; i++) { $("#menu").append("<li>" + i + "</li>"); }