Heim > Web-Frontend > js-Tutorial > Hauptteil

Zusammenfassung der Methoden zur Optimierung des jQuery-Codes

php中世界最好的语言
Freigeben: 2018-03-23 09:26:48
Original
1788 Leute haben es durchsucht

Dieses Mal werde ich Ihnen eine Zusammenfassung der jQuery-Code-Optimierungsmethoden geben. Was sind die Vorsichtsmaßnahmen für die jQuery-Code-Optimierung?

Verwenden Sie den richtigen Selektor

In jQuery können Sie mehrere Selektoren verwenden, um dasselbe Webseitenelement auszuwählen. Die Leistung jedes Selektors ist unterschiedlich, und Sie sollten ihre Leistungsunterschiede verstehen

1 Der schnellste Selektor: ID-Selektor und Element Label-Selektor

Zum Beispiel das Folgende Anweisungen weisen die beste Leistung auf:

$('#id')
$('form')
$('input')
Nach dem Login kopieren

Wenn jQuery auf diese Selektoren trifft, ruft jQuery automatisch die nativen Methoden des Browsers (z. B. getElementById()) intern auf, sodass ihre Ausführung schnell erfolgt.

2. Langsamerer Selektor: Die Leistung des Klassenselektors

$('.className') hängt von verschiedenen Browsern ab. Die Browser Firefox, Safari, Chrome und Opera verfügen alle über die native Methode getElementByClassName(), sodass die Geschwindigkeit nicht langsam ist. IE5-IE8 haben diese Methode jedoch nicht bereitgestellt, sodass dieser Selektor im IE ziemlich langsam sein wird

3. Der langsamste Selektor: Pseudo- Klassenselektor und Attributselektor

Um alle versteckten Elemente auf einer Webseite zu finden, müssen Sie einen Pseudoklassenselektor verwenden:

$(':hidden')
Nach dem Login kopieren

Ein Beispiel für einen Attributselektor ist:

$('[attribute=value]')
Nach dem Login kopieren

Diese beiden Anweisungen sind die langsamsten, da der Browser keine native Methode für sie hat. Einige neue Browserversionen haben jedoch die Methoden querySelector () und querySelectorAll () hinzugefügt, wodurch die Leistung dieses Selektortyps erheblich verbessert wird.

Verstehen Sie die Eltern-Kind-Beziehung

Die folgenden sechs Alle Selektoren wählen untergeordnete Elemente aus übergeordneten Elementen aus

$('.child', $parent)
$parent.find('.child')
$parent.children('.child')
$('#parent > .child')
$('#parent .child')
$('.child', $('#parent'))
Nach dem Login kopieren

1. Die folgende Anweisung bedeutet, dass bei einem gegebenen DOM-Objekt ein untergeordnetes Element daraus ausgewählt wird. jQuery konvertiert diese Anweisung automatisch in $.parent.find('child'), was zu einem gewissen Leistungsverlust führt. Es ist 5–10 % langsamer als die schnellste Form

$('.child', $parent)
Nach dem Login kopieren

2. Dies ist die schnellste Aussage. Die Methode .find() ruft die nativen Methoden des Browsers auf (getElementById, getElementByName, getElementByTagName usw.), sodass sie schneller ist

$parent.find('.child')
Nach dem Login kopieren

3 Diese Anweisung verwendet $.sibling() und nextSibling () Methode von Javascript, durchqueren Sie die Knoten nacheinander. Es ist etwa 50 % langsamer als die schnellste Form

$parent.children('.child')
Nach dem Login kopieren

4. jQuery verwendet intern die Sizzle-Engine, um verschiedene Selektoren zu verarbeiten. Die Auswahlreihenfolge der Sizzle-Engine ist von rechts nach links, daher wählt diese Anweisung zuerst .child aus und filtert dann nacheinander das übergeordnete Element #parent heraus, wodurch es etwa 70 % langsamer ist als die schnellste Form

$('#parent > .child')
Nach dem Login kopieren

5. Diese Aussage ist die gleiche wie die vorherige. Die vorherige wählt jedoch nur direkte Unterelemente aus, während diese mehrstufige Unterelemente auswählen kann, sodass sie langsamer ist, etwa 77 % langsamer als die schnellste Form

$('#parent .child')
Nach dem Login kopieren

6. jQuery-Interna Diese Anweisung wird in $('#parent').find('.child') konvertiert, was 23 % langsamer ist als die schnellste Form

$('.child', $('#parent'))
Nach dem Login kopieren

Die beste Wahl ist also $parent find ('.Kind'). Da außerdem $parent häufig in der vorherigen Operation generiert wird, wird es von jQuery zwischengespeichert, wodurch die Ausführungsgeschwindigkeit weiter beschleunigt wird.

Verwenden Sie jQuery nicht zu oft.

Egal wie schnell jQuery ist, es kann nicht konkurrieren mit den nativen Methoden im Vergleich zu Javascript. Versuchen Sie daher, die Verwendung von jQuery zu vermeiden, wenn native Methoden verwendet werden können.

Nehmen wir den einfachsten Selektor als Beispiel: document.getElementById("foo") ist mehr als zehnmal schneller als $("#foo")

Sehen wir uns ein anderes Beispiel an ein Element Binden Sie eine -Funktion, die Klickereignisse verarbeitet :

$('a').click(function(){
    alert($(this).attr('id'));
  });
Nach dem Login kopieren

Dieser Code bedeutet, dass nach dem Klicken auf ein Element das ID-Attribut des Elements angezeigt wird. Um dieses Attribut zu erhalten, muss jQuery zweimal hintereinander aufgerufen werden, der erste ist $(this) und der zweite ist attr('id').

Tatsächlich ist diese Verarbeitung völlig unnötig. Die korrektere Schreibweise besteht darin, this.id direkt mit der nativen JavaScript-Methode aufzurufen:

$('a').click(function(){
    alert(this.id);
  });
Nach dem Login kopieren

Laut dem Test ist die Geschwindigkeit von this.id mehr als 20-mal schneller als die von $( this).attr('id') Times

Gut zwischenspeichern

Die Auswahl eines bestimmten Webseitenelements ist ein sehr kostspieliger Schritt. Daher sollten Sie den Selektor so selten wie möglich verwenden und die ausgewählten Ergebnisse so weit wie möglich zwischenspeichern, um sie in der Zukunft wiederholt verwenden zu können.

Zum Beispiel ist Folgendes eine schlechte Schreibweise:

jQuery('#top').find('p.classA');
jQuery('#top').find('p.classB');
Nach dem Login kopieren

更好的写法是:

var cached = jQuery('#top');
  cached.find('p.classA');
  cached.find('p.classB');
Nach dem Login kopieren

根据测试,缓存比不缓存,快了2-3倍

jQuery的一大特点,就是允许使用链式写法

$('p').find('h3').eq(2).html('Hello');
Nach dem Login kopieren

采用链式写法时,jQuery自动缓存每一步的结果,因此比非链式写法要快。根据测试,链式写法比(不使用缓存的)非链式写法,大约快了25%

事件委托

javascript的事件模型,采用"冒泡"模式,也就是说,子元素的事件会逐级向上"冒泡",成为父元素的事件。

利用这一点,可以大大简化事件的绑定。比如,有一个表格(table元素),里面有100个格子(td元素),现在要求在每个格子上面绑定一个点击事件(click),请问是否需要将下面的命令执行100次?

$("td").on("click", function(){
    $(this).toggleClass("click");
  });
Nach dem Login kopieren

回答是不需要,我们只要把这个事件绑定在table元素上面就可以了,因为td元素发生点击事件之后,这个事件会"冒泡"到父元素table上面,从而被监听到

因此,这个事件只需要在父元素绑定1次即可,而不需要在子元素上绑定100次,从而大大提高性能。这就叫事件的"委托处理",也就是子元素"委托"父元素处理这个事件

$("table").on("click", "td", function(){
    $(this).toggleClass("click");
  });
Nach dem Login kopieren

更好的写法,则是把事件绑定在document对象上面

$(document).on("click", "td", function(){
    $(this).toggleClass("click");
  });
Nach dem Login kopieren

如果要取消事件的绑定,就使用off()方法

$(document).off("click", "td");
Nach dem Login kopieren

少改动DOM

1、改动DOM结构开销很大,因此不要频繁使用.append()、.insertBefore()和.insetAfter()这样的方法

如果要插入多个元素,就先把它们合并,然后再一次性插入。根据测试,合并插入比不合并插入,快了将近10倍

2、如果要对一个DOM元素进行大量处理,应该先用.detach()方法,把这个元素从DOM中取出来,处理完毕以后,再重新插回文档。根据测试,使用.detach()方法比不使用时,快了60%

3、如果要在DOM元素上储存数据,不要写成下面这样:

var elem = $('#elem');
elem.data(key,value);
Nach dem Login kopieren

而要写成

var elem = $('#elem');
$.data(elem[0],key,value);
Nach dem Login kopieren

根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法是定义在jQuery函数的prototype对象上面的,而$.data()方法是定义jQuery函数上面的,调用的时候不从复杂的jQuery对象上调用,所以速度快得多

4、插入html代码的时候,浏览器原生的innterHTML()方法比jQuery对象的html()更快

尽量少生成jQuery对象

每当使用一次选择器(比如$('#id')),就会生成一个jQuery对象。jQuery对象是一个很庞大的对象,带有很多属性和方法,会占用不少资源。所以,尽量少生成jQuery对象

举例来说,许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。下面两个例子,都是取出一个元素的文本,使用的都是text()方法

既可以使用针对jQuery对象的版本:

var $text = $("#text");
var $ts = $text.text();
Nach dem Login kopieren

也可以使用针对jQuery函数的版本:

var $text = $("#text");
var $ts = $.text($text);
Nach dem Login kopieren

由于后一种针对jQuery函数的版本不通过jQuery对象操作,所以相对开销较小,速度比较快

选择作用域链最短的方法

严格地说,这一条原则对所有Javascript编程都适用,而不仅仅针对jQuery

我们知道,Javascript的变量采用链式作用域。读取变量的时候,先在当前作用域寻找该变量,如果找不到,就前往上一层的作用域寻找该变量。这样的设计,使得读取局部变量比读取全局变量快得多

请看下面两段代码,第一段代码是读取全局变量:

var a = 0;
  function x(){
    a += 1;
  }
Nach dem Login kopieren

第二段代码是读取局部变量:

function y(){
    var a = 0;
    a += 1;
  }
Nach dem Login kopieren

第二段代码读取变量a的时候,不用前往上一层作用域,所以要比第一段代码快五六倍

同理,在调用对象方法的时候,closure模式要比prototype模式更快

prototype模式:

var X = function(name){ this.name = name; }
X.prototype.get_name = function() { return this.name; };
Nach dem Login kopieren

closure模式:

var Y = function(name) {
    var y = { name: name };
    return { 'get_name': function() { return y.name; } };
  };
Nach dem Login kopieren

同样是get_name()方法,closure模式更快

使用Pub/Sub模式管理事件

当发生某个事件后,如果要连续执行多个操作,最好不要写成下面这样:

function doSomthing{
    doSomethingElse();
    doOneMoreThing();
  }
Nach dem Login kopieren

而要改用事件触发的形式:

function doSomething{
    $.trigger("DO_SOMETHING_DONE");
  }
  $(document).on("DO_SOMETHING_DONE", function(){
    doSomethingElse(); 
  });
Nach dem Login kopieren

还可以考虑使用deferred对象

function doSomething(){
    var dfd = new $.Deferred();
    //Do something async, then... 
    //dfd.resolve();
    return dfd.promise();
  }
  function doSomethingElse(){
    $.when(doSomething()).then(//The next thing);
  }
Nach dem Login kopieren

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

javascript的代码优化详解

Node.js的非对称加密详解

360浏览器兼容模式的页面显示不全怎么处理

Das obige ist der detaillierte Inhalt vonZusammenfassung der Methoden zur Optimierung des jQuery-Codes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage