이 글에는 모든 사람을 위한 jQuery 코드 최적화 방법이 요약되어 있습니다. 이 분야에 필요한 사항이 있으면 함께 배워보세요.
jQuery에서는 여러 선택기를 사용하여 동일한 웹 페이지 요소를 선택할 수 있습니다. 각 선택기의 성능은 다르므로 성능 차이를 이해해야 합니다
1. 가장 빠른 선택기: ID 선택기와 요소 레이블 선택기
예를 들어 다음 명령문이 가장 성능이 좋습니다.
$('#id') $('form') $('input')
이런 선택기를 만나면, jQuery는 브라우저의 기본 메소드(예: getElementById())를 자동으로 호출하므로 빠르게 실행됩니다.
2. 느린 선택기: 클래스 선택기
$('.className')의 성능은 브라우저에 따라 다릅니다. Firefox, Safari, Chrome 및 Opera 브라우저에는 모두 기본 메소드 getElementByClassName()이 있으므로 속도가 느리지 않습니다. 그러나 IE5-IE8에서는 이 방법을 배포하지 않았으므로 IE
3에서는 이 선택기가 상당히 느립니다. 가장 느린 선택기: 의사 클래스 선택기와 속성 선택기
웹 페이지에서 숨겨진 요소를 모두 찾으려면 이 방법을 사용해야 합니다. 의사 클래스 선택기:
$(':hidden')
속성 선택기의 예는 다음과 같습니다.
$('[attribute=value]')
이 두 문은 브라우저에 기본 메서드가 없기 때문에 가장 느립니다. 그러나 일부 새 버전의 브라우저에는 querySelector() 및 querySelectorAll() 메서드가 추가되어 이러한 유형의 선택기 성능이 크게 향상됩니다.
다음 6개 선택자는 모두 상위에서 파생됩니다. element
$('.child', $parent) $parent.find('.child') $parent.children('.child') $('#parent > .child') $('#parent .child') $('.child', $('#parent'))
1에서 하위 요소를 선택합니다. 다음 명령문은 주어진 DOM 객체에서 하위 요소를 선택한다는 의미입니다. jQuery는 자동으로 이 명령문을 $.parent.find('child')로 변환하므로 특정 성능 손실이 발생합니다. 가장 빠른 형태보다 5~10% 느립니다
$('.child', $parent)
2. .find() 메소드는 브라우저의 기본 메소드(getElementById, getElementByName, getElementByTagName 등)를 호출하므로 더 빠릅니다
$parent.find('.child')
3 이 명령문은 $.sibling() 및 javascript의 nextSibling( ) 메소드, 노드 순회를 사용합니다. 하나씩. 가장 빠른 형식
$parent.children('.child')
4보다 약 50% 느립니다. jQuery는 내부적으로 Sizzle 엔진을 사용하여 다양한 선택기를 처리합니다. Sizzle 엔진의 선택 순서는 오른쪽에서 왼쪽이므로 이 명령문은 .child를 먼저 선택한 다음 #parent 상위 요소를 하나씩 필터링하여 결과적으로 가장 빠른 형식보다 약 70% 느립니다
$('#parent > .child')
5. 이 진술은 이전 진술과 동일합니다. 그러나 이전 버전은 직접 하위 요소만 선택하는 반면, 이번 버전은 다중 레벨 하위 요소를 선택할 수 있으므로 가장 빠른 형식보다 약 77% 느립니다.
$('#parent .child')
6 jQuery는 이 명령문을 내부적으로 $로 변환합니다. ('#parent').find('.child')는 가장 빠른 형식보다 23% 느립니다
$('.child', $('#parent'))
그래서 최선의 선택은 $parent.find('.child')입니다. 게다가 이전 작업에서 $parent가 생성되는 경우가 많기 때문에 jQuery에서 이를 캐시하므로 실행 속도가 더욱 빨라집니다. jQuery가 아무리 빨라도 네이티브 자바스크립트 방식과 비교할 수는 없습니다. 따라서 사용할 수 있는 네이티브 메소드가 있는 경우에는 jQuery를 사용하지 않는 것이 좋습니다.
가장 간단한 선택기를 예로 들면 document.getElementById("foo")는 $("#foo")보다 10배 이상 빠릅니다.
클릭 이벤트를 처리하는 함수를 a에 바인딩하는 또 다른 예를 살펴보겠습니다. element :
$('a').click(function(){ alert($(this).attr('id')); });
이 코드의 의미는 a 요소를 클릭하면 해당 요소의 id 속성이 팝업된다는 것입니다. 이 속성을 얻으려면 jQuery를 연속해서 두 번 호출해야 합니다. 첫 번째는 $(this)이고 두 번째는 attr('id')입니다.
사실 이런 처리는 전혀 필요하지 않습니다. 더 정확한 작성 방법은 기본 JavaScript 메서드를 사용하여 this.id를 직접 호출하는 것입니다.
$('a').click(function(){ alert(this.id); });
테스트에 따르면 this.id의 속도는 $(this).attr('id보다 20배 이상 빠릅니다. ')
캐시를 잘
특정 웹페이지 요소를 선택하는 것은 비용이 많이 드는 단계입니다. 따라서 선택기를 가능한 한 적게 사용해야 하며 나중에 반복적으로 사용할 수 있도록 선택한 결과를 최대한 많이 캐시해야 합니다.
jQuery('#top').find('p.classA'); jQuery('#top').find('p.classB');
더 좋은 작성 방법은:
var cached = jQuery('#top'); cached.find('p.classA'); cached.find('p.classB');
테스트에 따르면 캐싱이 캐싱을 하지 않는 것보다 2~3배 빠릅니다
jQuery의 주요 기능 체인 쓰기 방식을 사용할 수 있다는 것입니다
$('p').find('h3').eq(2).html('Hello');
체인 쓰기 방법을 사용할 때 jQuery는 각 단계의 결과를 자동으로 캐시하므로 비체인 쓰기 방법보다 빠릅니다. 테스트에 따르면 체인 작성 방법은 비체인 작성 방법(캐싱 없음)보다 약 25% 빠릅니다
이벤트 위임
JavaScript의 이벤트 모델은 "버블" 모드, 즉 이벤트를 채택합니다. 하위 요소의 레벨은 레벨별로 "버블링"되어 상위 요소의 이벤트가 됩니다.
이를 사용하면 이벤트 바인딩이 크게 단순화될 수 있습니다. 예를 들어, 100개의 셀(td 요소)이 포함된 테이블(table 요소)이 있는데 이제 각 셀에 클릭 이벤트(click)를 바인딩해야 합니까?
$("td").on("click", function(){ $(this).toggleClass("click"); });
답은 '아니오'입니다. 이 이벤트를 테이블 요소에만 바인딩하면 됩니다. td 요소에서 클릭 이벤트가 발생한 후 이벤트가 상위 요소 테이블에 "버블"되어 모니터링되기 때문입니다
因此,这个事件只需要在父元素绑定1次即可,而不需要在子元素上绑定100次,从而大大提高性能。这就叫事件的"委托处理",也就是子元素"委托"父元素处理这个事件
$("table").on("click", "td", function(){ $(this).toggleClass("click"); });
更好的写法,则是把事件绑定在document对象上面
$(document).on("click", "td", function(){ $(this).toggleClass("click"); });
如果要取消事件的绑定,就使用off()方法
$(document).off("click", "td");
1、改动DOM结构开销很大,因此不要频繁使用.append()、.insertBefore()和.insetAfter()这样的方法
如果要插入多个元素,就先把它们合并,然后再一次性插入。根据测试,合并插入比不合并插入,快了将近10倍
2、如果要对一个DOM元素进行大量处理,应该先用.detach()方法,把这个元素从DOM中取出来,处理完毕以后,再重新插回文档。根据测试,使用.detach()方法比不使用时,快了60%
3、如果要在DOM元素上储存数据,不要写成下面这样:
var elem = $('#elem'); elem.data(key,value);
而要写成
var elem = $('#elem'); $.data(elem[0],key,value);
根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法是定义在jQuery函数的prototype对象上面的,而$.data()方法是定义jQuery函数上面的,调用的时候不从复杂的jQuery对象上调用,所以速度快得多
4、插入html代码的时候,浏览器原生的innterHTML()方法比jQuery对象的html()更快
每当使用一次选择器(比如$('#id')),就会生成一个jQuery对象。jQuery对象是一个很庞大的对象,带有很多属性和方法,会占用不少资源。所以,尽量少生成jQuery对象
举例来说,许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。下面两个例子,都是取出一个元素的文本,使用的都是text()方法
既可以使用针对jQuery对象的版本:
var $text = $("#text"); var $ts = $text.text();
也可以使用针对jQuery函数的版本:
var $text = $("#text"); var $ts = $.text($text);
由于后一种针对jQuery函数的版本不通过jQuery对象操作,所以相对开销较小,速度比较快
选择作用域链最短的方法
严格地说,这一条原则对所有Javascript编程都适用,而不仅仅针对jQuery
我们知道,Javascript的变量采用链式作用域。读取变量的时候,先在当前作用域寻找该变量,如果找不到,就前往上一层的作用域寻找该变量。这样的设计,使得读取局部变量比读取全局变量快得多
请看下面两段代码,第一段代码是读取全局变量:
var a = 0; function x(){ a += 1; }
第二段代码是读取局部变量:
function y(){ var a = 0; a += 1; }
第二段代码读取变量a的时候,不用前往上一层作用域,所以要比第一段代码快五六倍
同理,在调用对象方法的时候,closure模式要比prototype模式更快
prototype模式:
var X = function(name){ this.name = name; } X.prototype.get_name = function() { return this.name; };
closure模式:
var Y = function(name) { var y = { name: name }; return { 'get_name': function() { return y.name; } }; };
同样是get_name()方法,closure模式更快
使用Pub/Sub模式管理事件
当发生某个事件后,如果要连续执行多个操作,最好不要写成下面这样:
function doSomthing{ doSomethingElse(); doOneMoreThing(); }
而要改用事件触发的形式:
function doSomething{ $.trigger("DO_SOMETHING_DONE"); } $(document).on("DO_SOMETHING_DONE", function(){ doSomethingElse(); });
还可以考虑使用deferred对象
function doSomething(){ var dfd = new $.Deferred(); //Do something async, then... //dfd.resolve(); return dfd.promise(); } function doSomethingElse(){ $.when(doSomething()).then(//The next thing); }
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
위 내용은 jQuery의 코드 최적화에 대한 자세한 지침의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!