目次
まず最初に、これら 2 つの新しいことについて説明しなければなりません。これら 2 つが明確に説明されていなければ、いくつかの問題はまったく説明できません。すべて、。jQuery.DeferredjQuery._Deferred の拡張バージョンであるため、この問題については、jQuery._Deferred から始めるとほとんどのことが説明できます。問題
jQuery.ready的变化
jQuery.parseXML函数
data部分
AJAX部分
其他细节

jQuery の改良された詳細の紹介

Jun 19, 2017 am 11:08 AM
jquery 導入 改善する 詳細

jquery API」>jQuery 1.5 beta1 がリリースされました。学習とフォローアップという点では、今回は比較的遅いです (1.5 がいつアルファ版として公開されたのかさえわからないので、あくまでベータ版です)。このアップデートは AJAX を完全に書き直し、より強力なスケーラビリティを提供します。ただし、エネルギーとスペースの制限のため、新しい AJAX の分析は別の機会に譲ります。この記事では、

jQuery の詳細な改善点を簡単に紹介します。 ._Deferred と jQuery.Deferred

まず最初に、これら 2 つの新しいことについて説明しなければなりません。これら 2 つが明確に説明されていなければ、いくつかの問題はまったく説明できません。すべて、。jQuery.DeferredjQuery._Deferred の拡張バージョンであるため、この問題については、jQuery._Deferred から始めるとほとんどのことが説明できます。問題

文字通り、私の最初の反応は「遅延ロード」であり、大文字の最初の文字は「タイプ」の定義であるはずなので、これはおそらく「遅延ロード機能を透過的に提供する」タイプです。これは多少の「遅延」を意味しますが、これは遅延読み込みの実装に使用されるものではありません

簡単に言うと、 jQuery._Deferred は関数キューであり、その機能は次のとおりです。 : jQuery.DeferredjQuery._Deferred的增强版,因此对于这个问题,从jQuery._Deferred入手,就能说明一大半的问题。

什么是Deferred?从字面上看,我的第一反应是“延迟加载”,首字母大写的应该是“类型”的定义,所以这大概是一个“透明提供延迟加载功能”的类型吧。然而实际上,虽然确实带有那么一点点“延迟”的意思,这个东西却不是用来实现延迟加载的。

简单来说,jQuery._Deferred是一个函数队列,他的作用有以下几点:

  • 保存若干个函数。

  • 在特定的时刻把保存着的函数全部执行掉。

  • 执行过后,新进来的函数会立刻执行。

感觉是不是和啥东西很像?对,jQuery的ready函数就是这样的逻辑,实际中jQuery 1.5中的ready函数也确实被嫁接到这上面去了。

jQuery._Deferred提供下面的接口:

  • donefunction(fn1, fn2, …)的形式,用于把函数添加到队列中。

  • firefunction(context, args)的形式,使用context指定this对象,args指定参数,调用队列中所有函数。fire被调用后,_Deferred会进入isResolved状态,未来对done的调用不会再保存函数,而是直接调用函数。

  • resolve:相当于调用fire(this, arguments),一个简化的方法。

  • isResolved:用来判断_Deferred是否在isResolved状态,具体参考前面的fire函数的解释。

  • cancel:取消掉整个队列,这样不管未来是不是fire,队列中的函数都不会再被调用。

说明白了jQuery._Deferred,再来看看jQuery.Deferred。这个东西其实就是2个_Deferred组成的,第一个称为deferred,用于保管“正常”状态下的函数;第二个称为failDeferred,用于保管“出错”状态下的函数。同时jQuery.Deferred提供了一些新的接口:

  • thenfunction(done, fail)的形式,把done添加进deferred,把fail添加进failedDeferred

  • fail:相当于failDeferreddone函数。

  • fireReject:相当于failDeferredfire函数。

  • reject:相当于failDeferredresolve函数。

  • isRejected:相当于failDeferredisResolved函数。

同时jQuery.Deferred取消了cancel函数。

那么这个是啥用的呢?有“正常”和“出错”2个状态,同时又是异步的,很容易就能想到……对,给AJAX用的,在下一篇分析中再详细说明。

jQuery.ready的变化

因为有了jQuery._Deferred这个东西,jQuery.ready函数变成依赖于函数队列,具体的变化有:

原来的readyList变量已经不再是一个数组,而变成了jQuery._Deferred对象。

原本在DOMContentLoaded时,调用readList中所有函数的逻辑,现在也使用了jQuery._Deferred中,原来的代码:

while ( (fn = ready[ i++ ]) ) {       fn.call( document, jQuery ); }
ログイン後にコピー

变成了:

readyList.fire( document , [ jQuery ] );
ログイン後にコピー

jQuery.parseXML函数

新增了静态函数jQuery.parseXML,用于提供浏览器兼容的从字符串转为XML文档的功能。

该函数的逻辑网上有很多,jQuery也没有特别的地方,大致分为以下2种:

对于标准浏览器,使用DOMParser对象:

var parser = new DOMParser();   var xml = parser.parseFromString(text, 'text/html');
ログイン後にコピー

对于IE,使用Microsoft.XMLDOM

  • 複数の関数を保存します 🎜
  • 🎜 保存されたすべての関数を特定の時間に実行します。実行後、新しく入力された関数がすぐに実行されます 🎜
🎜 何かに似ていますか? はい、jQuery の Ready 関数は実際にそのようなロジックを持っています。これに移植された 🎜🎜jQuery._Deferred は次のインターフェイスを提供します: 🎜
  • 🎜done: の形式function(fn1, fn2, …) はキューに関数を追加するために使用されます 🎜
  • 🎜fire : function の形式で。 (context, args)context を使用してこの オブジェクトを指定し、args を使用してパラメータを指定し、キュー内のすべての関数を呼び出します。 fire が呼び出された後、_Deferred は isResolved 状態になり、その後の done の呼び出しでは関数は保存されず、関数が直接呼び出されます。 🎜
  • 🎜resolve: 簡略化されたメソッドである fire(this, argument) を呼び出すのと同じです。 🎜
  • 🎜isResolved: _Deferred が isResolved 状態であるかどうかを判断するために使用されます。詳細については、前の の説明を参照してください。 fire 関数。 🎜
  • 🎜cancel: キュー全体をキャンセルします。これにより、将来 fire が発生するかどうかに関係なく、キュー内の関数はキャンセルされなくなります。再び呼ばれた。 🎜
🎜 jQuery._Deferred についてわかりやすく説明したので、jQuery.Deferred を見てみましょう。これは実際には 2 つの _Deferred で構成されています。最初の _Deferred は deferred と呼ばれ、関数を「通常」の状態で保存するために使用されます。2 つ目の _Deferred は failDeferred と呼ばれます。関数を「エラー」ステータスに保存するために使用されます。同時に、jQuery.Deferred はいくつかの新しいインターフェイスを提供します: 🎜
  • 🎜then: function (done 、fail)donedeferred に追加し、failfailedDeferred に追加します。 🎜
  • 🎜fail: failDeferreddone 関数と同等です。 🎜
  • 🎜fireReject: failDeferredfire 関数と同等です。 🎜
  • 🎜reject: failDeferredresolve 関数と同等です。 🎜
  • 🎜isRejected: failDeferredisResolved 関数と同等です。 🎜
🎜同時に、jQuery.Deferredcancel 関数をキャンセルします。 🎜🎜それで、これは何に使われるのでしょうか? 「正常」と「エラー」の 2 つの状態があり、同時に非同期であることは簡単に考えられます。はい、AJAX で使用されます。詳しくは次の分析で説明します。 🎜🎜jQuery.ready の変更点🎜🎜 jQuery._Deferred により、jQuery.ready 関数は関数キューに依存するようになります。具体的な変更点は次のとおりです。元の readyList 変数は配列ではなくなり、jQuery._Deferred オブジェクトになりました。 🎜🎜DOMContentLoaded のときに readList 内のすべての関数を呼び出す元のロジックは、jQuery._Deferred でも使用されるようになりました。元のコード: 🎜
var parser = new ActiveXObject('Microsoft.XMLDOM');   parser.async = 'false';   parser.loadXML(text);   var xml = parser.documentElement;
ログイン後にコピー
ログイン後にコピー
🎜 🎜
expando = "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( //D/g, "" );
ログイン後にコピー
ログイン後にコピー
🎜jQuery.parseXML 関数🎜🎜文字列をXMLドキュメントに変換します。 🎜🎜この関数のロジックはインターネット上に多数ありますが、jQuery には特別なロジックはありません。大まかに次の 2 つのタイプに分けられます。 🎜🎜 標準ブラウザの場合は、DOMParser オブジェクトを使用します。
$.each(['get', 'post'], function(i, method) {     $[method] = function() { ... }; });
ログイン後にコピー
ログイン後にコピー
🎜 IE の場合は、Microsoft.XMLDOM オブジェクトを使用します: 🎜
var parser = new ActiveXObject('Microsoft.XMLDOM');   parser.async = 'false';   parser.loadXML(text);   var xml = parser.documentElement;
ログイン後にコピー
ログイン後にコピー

data部分

添加了jQuery.hasData函数,用于判断一个元素是否有jQuery附加上去的数据。

修改了jQuery.expando的实现,在原来单纯地取当前时间的基础上,添加了一个随机数:

expando = "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( //D/g, "" );
ログイン後にコピー
ログイン後にコピー

这样保证在同一时间,引入多个jQuery副本,这几个副本之间的expando不会相互冲突,导致元素上的data变得错乱。一般来说,是不会引入多个jQuery副本的,但是使用SealJS等的时候,配置不当的话,也是很容易出现此类问题的。

DOM操作部分

原本的hasClassaddClassremoveClass函数都需要将元素的class属性分隔为数组,在1.4.4版本中,通过/n或/t进行分隔,在1.5中增加了一个/r,用于对应Windows平台下的换行符(/r/n)。

jQuery.fn.attr函数,1.4.4版本中拒绝从TextNode和CommentNode上获取属性,在1.5版本中添加了一个AttributeNode(noteType == 2)。

在1.4.4版本中,jQuery会在页面unload的时候清理掉由jQuery维护的所有DOM事件,这是为了避免IE的内存泄露问题。但是在1.5中这一段代码不见了,不知是出于什么考虑。

对于IE下使用cloneNode复制节点,会将事件也一起复制过来的问题,1.4.4中是采取复制innerHTML的方式给予解决,而在1.5中则采纳了mootools团队提供的方法,使用cloneFixAttribute函数修正该问题。

cloneFixAttribute函数们于jQuery 1.5 beta1源码文件的5388-5438行,处理IE的BUG的原理很简单,当然前端里一些看似简单的东西,都是很难发现的:

  • IE中有个叫clearAttributes的函数,会清除到节点上的所有属性,顺便把和事件相关的<a href="http://www.php.cn/wiki/1449.html" target="_blank">onclick</a>之类的属性也去掉了。在复制出来的节点上调用这个函数,就会把属性清得干干净净。

  • IE中还有一个叫mergeAttributes的函数,把一个节点的属性复制到另一个节点上,但他不会把和事件相关的属性复制过去。所以再把原始节点调用mergeAttributes,把属性重新放回复制出来的节点上,这就相当于起到了去除事件相关属性的作用。

另外cloneFixAttribute函数还处理了非常多IE6-8在cloneNode上的兼容性问题,非常值得详细研究。

AJAX部分

AJAX已经完全重写了,只留下一点边边角角保留着1.4.4版本的风采,这里只抽取一部分进行简单的说明。

原来版本中$.get$.post的实现非常相似,具体来说仅有一个method配置项不同,因此在1.5版本中被合并起来了:

$.each(['get', 'post'], function(i, method) {     $[method] = function() { ... }; });
ログイン後にコピー
ログイン後にコピー

ajaxSetup函数现在加了一行return this;,可以链式调用了。

serializeArray函数现在统一将value中的换行符替换成Windows的风格(/r/n)。

AJAX的回调函数中,作为参数的对象不再是原生的XMLHTTPRequest,而是jQuery自己封装的称为jXHR的对象,这个对象提供了XMLHTTPRequest的常用接口。

原本对于“请求成功”的浏览器状态码,除200-299以及304外,还有一个1223,来自于IE的一个BUG,会将204的状态码变成1223。现在因为有了jXHR对象,相当于中间多了一层,因此从jXHR对象获取statusCode不会出现1223的情况,已经被变回204了。

jQuery.ajax函数的配置项中多了一个statusCode项,其结构为map,用于指定返回特定状态码时的回调函数,大致形式如下:

jQuery.ajax({       url: 'xxx',     statusCode: {         200: function() { 处理请求成功 },         404: function() { 处理页面未找到 },         503: function() { 处理Service Unavailable }     } });
ログイン後にコピー

再添加了这个回调后,jQuery.ajax函数已经有非常多的回调函数,其触发过程如下:

  1. 根据返回的状态码,触发success或者error回调。

  2. 根据状态码,触发对应的statusCode回调。

  3. 触发complete回调。

  4. 触发全局ajaxComplete回调。

  5. 如果此时没有正在执行的AJAX,触发全局ajaxStop回调。

其他细节

入口函数jQuery.fn.init现在多了一个参数,值始终为rootjQuery,用于加速init函数中对rootjQuery变量的查找速度(减少了一层作用域):

// jQuery 1.5 beta1 源码23行 jQuery = function( selector, context ) {       // The jQuery object is actually just the init constructor 'enhanced'     return new jQuery.fn.init( selector, context, rootjQuery ); }
ログイン後にコピー

jQuery对象支持继承了,具体的修改是将几处直接调用jQuery的代码改为了对this.constructor的调用:

// 202行:     return this.constructor( context ).find( selector ); // 253行:     var ret = this.constructor(); // 334行: return this.prevObject || this.constructor(null);
ログイン後にコピー

同时还提供了jQuery.subclass函数用于创建一个继承自jQuery的类型,由于不是很常用jQuery,更是从来没有用到过需要继承jQuery的情况,因此也不方便说这个功能的作用有多大。

以上が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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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で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

ドージコインとは ドージコインとは Apr 01, 2024 pm 04:46 PM

Dogecoin は、インターネット ミームに基づいて作成された暗号通貨であり、固定供給上限がなく、速い取引時間、低い取引手数料、そして大規模なミーム コミュニティを備えています。用途には、少額の取引、チップ、慈善寄付が含まれます。しかし、その無限の供給、市場のボラティリティ、ジョークコインとしての地位は、リスクと懸念ももたらします。ドージコインとは何ですか? Dogecoin は、インターネットのミームやジョークに基づいて作成された暗号通貨です。起源と歴史: Dogecoin は、2 人のソフトウェア エンジニア、ビリー マーカスとジャクソン パーマーによって 2013 年 12 月に作成されました。当時人気だった「Doge」ミームからインスピレーションを得た、片言の英語を話す柴犬をフィーチャーしたコミカルな写真。特徴と利点: 無制限の供給: ビットコインなどの他の暗号通貨とは異なります。

Samsung S24aiの機能を詳しく紹介 Samsung S24aiの機能を詳しく紹介 Jun 24, 2024 am 11:18 AM

2024 年は AI 携帯電話元年です。AI スマート テクノロジーにより、携帯電話はますます効率的かつ便利に使用できるようになります。最近、今年の初めにリリースされたGalaxy S24シリーズは、生成AIエクスペリエンスを再び改善しました。以下で詳細な機能の紹介を見てみましょう。 1. 生成 AI は Samsung Galaxy S24 シリーズを強力に強化します。Galaxy S24 シリーズは、Galaxy AI によって強化され、多くのインテリジェント アプリケーションをもたらします。これらの機能は Samsung One UI6.1 と緊密に統合されており、ユーザーはいつでも便利なインテリジェントなエクスペリエンスを得ることができ、パフォーマンスが大幅に向上します。携帯電話の効率と使いやすさ。 Galaxy S24 シリーズで先駆けて開発されたサークルアンド検索機能は、長押しするだけで実現できる機能です。

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

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

ネオンアビスの8色武器紹介 ネオンアビスの8色武器紹介 Mar 31, 2024 pm 03:51 PM

ネオンアビスの8色目は武器の1つですが、8色目の武器の弾道や武器の強さの使い方を知りたいプレイヤーも多いと思います。それでは、Neon Abyss の 8 色の武器の軌道、武器の強さ、武器のゲームプレイに関する詳細なガイドを見てみましょう。ネオンアビスカラー8 詳細ガイド 武器紹介:魔法使いの秘密兵器!武器の攻撃速度: 普通 武器の強さ: 中程度 武器のゲームプレイ: 8 番目の色の攻撃方法は、3 回の単体攻撃とその後の光線の発射です。弾道表示:

PHP7 の改善: 未定義エラーがなくなりました PHP7 の改善: 未定義エラーがなくなりました Mar 04, 2024 pm 06:15 PM

PHP7 の改善: 未定義エラーがなくなりました PHP7 は PHP 言語のメジャー バージョン アップデートであり、多くの重要な改善と最適化が行われています。重要な改善点の 1 つは、未定義変数を処理するときに未定義エラーが表示されなくなったことで、開発者にとってより良いユーザー エクスペリエンスがもたらされます。 PHP7 より前では、コード内で未定義の変数が使用されている場合、未定義のエラーが発生するため、開発者はこの状況を回避するためにエラー報告レベルを手動で確認または設定する必要がありました。

オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 Apr 30, 2024 pm 08:19 PM

高速スコア照会ツールは、生徒と保護者にとって利便性を高めます。インターネットの発展に伴い、ますます多くの教育機関や学校がオンライン スコア チェック サービスを提供し始めています。お子様の学業の進歩を簡単に追跡できるように、この記事では、一般的に使用されているオンラインスコアチェックプラットフォームをいくつか紹介します。 1. 利便性 - 保護者は、オンラインスコア確認プラットフォームを通じて、いつでもどこでも子供のテストスコアを確認できます。保護者は、コンピュータまたは携帯電話で対応するオンラインスコア確認プラットフォームにログインすることで、いつでも簡単に子供のテストスコアを確認できます。インターネットに接続できる環境であれば、仕事中でも外出中でも、保護者は子どもの学習状況を把握し、的を絞った指導や支援を行うことができます。 2. 複数の機能 - スコアのクエリに加えて、コースのスケジュールや試験の手配などの情報をオンラインで検索することもできます。

See all articles