目次
適切なセレクターを使用する
親子関係を理解する
より良い書き方は:
少改动DOM
尽量少生成jQuery对象
ホームページ ウェブフロントエンド jsチュートリアル jQuery でのコード最適化に関する詳細な手順

jQuery でのコード最適化に関する詳細な手順

Jun 09, 2018 am 10:46 AM
jquery コードの最適化

この記事には、jQuery コードの最適化方法がまとめられています。この分野のニーズがある場合は、一緒に学びましょう。

適切なセレクターを使用する

jQuery では、複数のセレクターを使用して同じ Web ページ要素を選択できます。各セレクターのパフォーマンスは異なり、パフォーマンスの違いを理解する必要があります

1. 最速のセレクター: ID セレクターと要素ラベル セレクター

たとえば、次のステートメントは最高のパフォーマンスを発揮します:

$('#id')
$('form')
$('input')
ログイン後にコピー

これらのセレクターに遭遇した場合、 jQuery はブラウザのネイティブ メソッド (getElementById() など) を自動的に呼び出すため、メソッドは迅速に実行されます。

2. 遅いセレクター: クラス セレクター

$('.className') のパフォーマンスはブラウザーによって異なります。 Firefox、Safari、Chrome、Opera ブラウザにはすべてネイティブ メソッド getElementByClassName() があるため、速度は遅くなりません。ただし、IE5 ~ IE8 はこのメソッドをデプロイしていないため、IE

3 ではこのセレクターは非常に遅くなります。最も遅いセレクター: 疑似クラス セレクターと属性セレクター

Web ページ内のすべての非表示の要素を見つけるには、次を使用する必要があります。疑似クラス セレクター:

$(':hidden')
ログイン後にコピー

属性セレクターの例:

$('[attribute=value]')
ログイン後にコピー

これら 2 つのステートメントは、ブラウザーにネイティブ メソッドがないため、最も遅くなります。ただし、一部の新しいバージョンのブラウザーには、querySelector() メソッドと querySelectorAll() メソッドが追加されており、このタイプのセレクターのパフォーマンスが大幅に向上します

親子関係を理解する

次の 6 つのセレクターはすべて親要素からのものです。

$('.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( ) メソッドを使用し、ノードをトラバースします一つずつ。 jQuery は内部で Sizzle エンジンを使用してさまざまなセレクターを処理します。シズル エンジンの選択順序は右から左であるため、このステートメントは最初に .child を選択し、次に親要素 #parent を 1 つずつフィルターで除外するため、最速の形式よりも約 70% 遅くなります

$parent.children('.child')
ログイン後にコピー

5. これ このステートメントは前のステートメントと同じです。ただし、前のものは直接のサブ要素のみを選択しますが、このものはマルチレベルのサブ要素を選択できるため、最速のフォーム

$('#parent > .child')
ログイン後にコピー

6 よりも約 77% 遅くなります。jQuery はこのステートメントを内部で $ に変換します。 ('#parent').find('.child') ですが、これは最速の形式より 23% 遅いです

$('#parent .child')
ログイン後にコピー

したがって、最良の選択は $parent.find('.child') です。また、$parent は前の操作で生成されることが多いため、jQuery がキャッシュするため、jQuery がどれほど高速であっても、ネイティブ JavaScript メソッドとは比較にならないため、実行速度はさらに高速化されます。したがって、使用できるネイティブ メソッドがある場合は、jQuery の使用を避けるようにしてください。

最も単純なセレクターを例にとると、 document.getElementById("foo") は $("#foo") よりも 10 倍以上高速です

クリック イベントを処理する関数を a にバインドする別の例を見てみましょうelement :

$('.child', $('#parent'))
ログイン後にコピー

このコードの意味は、a 要素をクリックすると、要素の id 属性がポップアップすることです。この属性を取得するには、jQuery を 2 回続けて呼び出す必要があります。1 回目は $(this)、2 回目は attr('id') です。

実はこの処理は全く不要です。より正しい書き方は、ネイティブ JavaScript メソッドを直接使用して this.id を呼び出すことです:

$('a').click(function(){
    alert($(this).attr('id'));
  });
ログイン後にコピー

テストによると、this.id の速度は $(this).attr('id よりも 20 倍以上高速です) ')

しっかりキャッシュしましょう

特定の Web ページ要素を選択するのは、コストのかかるステップです。したがって、セレクターの使用回数はできるだけ少なくし、将来繰り返し使用できるように、選択した結果をできるだけ多くキャッシュする必要があります。

例えば、次のような書き方は悪い書き方です:

$('a').click(function(){
    alert(this.id);
  });
ログイン後にコピー

より良い書き方は:

jQuery('#top').find('p.classA');
jQuery('#top').find('p.classB');
ログイン後にコピー

テストによると、キャッシュした方がキャッシュしない場合よりも2~3倍高速です

jQueryの大きな特徴それは、チェーン書き込みメソッドを使用できるようにすることです

var cached = jQuery('#top');
  cached.find('p.classA');
  cached.find('p.classB');
ログイン後にコピー

チェーン書き込みメソッドを使用すると、jQuery が各ステップの結果を自動的にキャッシュするため、非チェーン書き込みメソッドよりも高速になります。テストによると、チェーン書き込み方式は非チェーン書き込み方式 (キャッシュなし) より約 25% 高速です

イベント委任

JavaScript のイベント モデルは「バブル」モード、つまり、子要素はレベルごとに「バブル」し、親要素のイベントになります。

これを使用すると、イベントバインディングを大幅に簡素化できます。たとえば、100 個のセル (td 要素) を持つテーブル (table 要素) があり、各セルにクリック イベント (click) をバインドする必要があります。次のコマンドを 100 回実行する必要がありますか?

$('p').find('h3').eq(2).html('Hello');
ログイン後にコピー

答えは「いいえ」です。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");
ログイン後にコピー

少改动DOM

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()更快

尽量少生成jQuery对象

每当使用一次选择器(比如$('#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);
  }
ログイン後にコピー

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在微信小程序中如何使用switch开关选择器

在JavaScript中如何计算多边形质心

在Angular19中有关自定义表单控件使用

以上がjQuery でのコード最適化に関する詳細な手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

jQueryのリファレンスメソッドを詳しく解説:クイックスタートガイド jQueryのリファレンスメソッドを詳しく解説:クイックスタートガイド Feb 27, 2024 pm 06:45 PM

jQuery 参照方法の詳細説明: クイック スタート ガイド jQuery は、Web サイト開発で広く使用されている人気のある JavaScript ライブラリであり、JavaScript プログラミングを簡素化し、開発者に豊富な機能を提供します。この記事では、jQuery の参照方法を詳しく紹介し、読者がすぐに使い始めるのに役立つ具体的なコード例を示します。 jQuery の導入 まず、HTML ファイルに jQuery ライブラリを導入する必要があります。 CDN リンクを通じて導入することも、ダウンロードすることもできます

jQueryでPUTリクエストメソッドを使用するにはどうすればよいですか? jQueryでPUTリクエストメソッドを使用するにはどうすればよいですか? Feb 28, 2024 pm 03:12 PM

jQueryでPUTリクエストメソッドを使用するにはどうすればよいですか? jQuery で PUT リクエストを送信する方法は、他のタイプのリクエストを送信する方法と似ていますが、いくつかの詳細とパラメータ設定に注意する必要があります。 PUT リクエストは通常​​、データベース内のデータの更新やサーバー上のファイルの更新など、リソースを更新するために使用されます。以下は、jQuery の PUT リクエスト メソッドを使用した具体的なコード例です。まず、jQuery ライブラリ ファイルが含まれていることを確認してから、$.ajax({u

jQuery のヒント: ページ上のすべての a タグのテキストをすばやく変更する jQuery のヒント: ページ上のすべての a タグのテキストをすばやく変更する Feb 28, 2024 pm 09:06 PM

タイトル: jQuery ヒント: ページ上のすべての a タグのテキストをすばやく変更する Web 開発では、ページ上の要素を変更したり操作したりする必要がよくあります。 jQuery を使用する場合、ページ内のすべての a タグのテキスト コンテンツを一度に変更する必要がある場合があります。これにより、時間と労力を節約できます。以下では、jQuery を使用してページ上のすべての a タグのテキストをすばやく変更する方法と、具体的なコード例を紹介します。まず、jQuery ライブラリ ファイルを導入し、次のコードがページに導入されていることを確認する必要があります: &lt

jQuery を使用してすべての a タグのテキスト コンテンツを変更する jQuery を使用してすべての a タグのテキスト コンテンツを変更する Feb 28, 2024 pm 05:42 PM

タイトル: jQuery を使用して、すべての a タグのテキスト コンテンツを変更します。 jQuery は、DOM 操作を処理するために広く使用されている人気のある JavaScript ライブラリです。 Web 開発では、ページ上のリンク タグ (タグ) のテキスト コンテンツを変更する必要が生じることがよくあります。この記事では、この目標を達成するために jQuery を使用する方法を説明し、具体的なコード例を示します。まず、jQuery ライブラリをページに導入する必要があります。 HTML ファイルに次のコードを追加します。

jQueryで要素の高さ属性を削除するにはどうすればよいですか? jQueryで要素の高さ属性を削除するにはどうすればよいですか? Feb 28, 2024 am 08:39 AM

jQueryで要素の高さ属性を削除するにはどうすればよいですか?フロントエンド開発では、要素の高さ属性を操作する必要が生じることがよくあります。要素の高さを動的に変更する必要がある場合や、要素の高さ属性を削除する必要がある場合があります。この記事では、jQuery を使用して要素の高さ属性を削除する方法と、具体的なコード例を紹介します。 jQuery を使用して高さ属性を操作する前に、まず CSS の高さ属性を理解する必要があります。 height 属性は要素の高さを設定するために使用されます

jQuery における eq の役割と応用シナリオを理解する jQuery における eq の役割と応用シナリオを理解する Feb 28, 2024 pm 01:15 PM

jQuery は、Web ページでの DOM 操作やイベント処理を処理するために広く使用されている人気のある JavaScript ライブラリです。 jQueryではeq()メソッドを利用して指定したインデックス位置の要素を選択しますが、具体的な使い方と応用シーンは以下の通りです。 jQuery では、 eq() メソッドは、指定されたインデックス位置にある要素を選択します。インデックス位置は 0 からカウントされます。つまり、最初の要素のインデックスは 0、2 番目の要素のインデックスは 1 などとなります。 eq() メソッドの構文は次のとおりです。 $("s

プログラムのパフォーマンスを最適化するための一般的な方法は何ですか? プログラムのパフォーマンスを最適化するための一般的な方法は何ですか? May 09, 2024 am 09:57 AM

プログラムのパフォーマンスの最適化方法には、次のようなものがあります。 アルゴリズムの最適化: 時間の複雑さが低いアルゴリズムを選択し、ループと条件文を減らします。データ構造の選択: ルックアップ ツリーやハッシュ テーブルなどのデータ アクセス パターンに基づいて、適切なデータ構造を選択します。メモリの最適化: 不要なオブジェクトの作成を回避し、使用されなくなったメモリを解放し、メモリ プール テクノロジを使用します。スレッドの最適化: 並列化できるタスクを特定し、スレッド同期メカニズムを最適化します。データベースの最適化: インデックスを作成してデータの取得を高速化し、クエリ ステートメントを最適化し、キャッシュまたは NoSQL データベースを使用してパフォーマンスを向上させます。

jQueryを使用してテーブルに新しい行を追加する方法の紹介 jQueryを使用してテーブルに新しい行を追加する方法の紹介 Feb 29, 2024 am 08:12 AM

jQuery は、Web 開発で広く使用されている人気の JavaScript ライブラリです。 Web 開発中は、JavaScript を使用してテーブルに新しい行を動的に追加することが必要になることがよくあります。この記事では、jQuery を使用してテーブルに新しい行を追加する方法を紹介し、具体的なコード例を示します。まず、jQuery ライブラリを HTML ページに導入する必要があります。 jQuery ライブラリは、次のコードを通じてタグに導入できます。

See all articles