目錄
jQuery._Deferred
data部分
AJAX部分
其他细节
首頁 web前端 js教程 jQuery的一些改進細節的介紹

jQuery的一些改進細節的介紹

Jun 19, 2017 am 11:08 AM
jquery 介紹 改進 細節

jquery API」>jQuery 1.5 beta1出來了,從學習跟進上來說,這次已經比較晚了(我竟然不知道1.5什麼時候出的alpha,就這麼beta了)。

這個1.5版本最大的更新是AJAX的完全重寫,提供了更強的可擴展性。 但是受制於精力和篇幅,對新的AJAX的分析還是放到下回,本篇先簡單介紹一下細節方面的改進。有些問題根本沒辦法解釋。

入手,就能說明一大半的問題。 ,所以這大概是一個「透明提供延遲載入功能」的類型吧。 #簡單來說,

jQuery._Deferred

是一個函數佇列,他的作用有以下幾點:

##儲存若干個函數。 在特定的時刻把保存著的函數全部執行掉。 #感覺是不是跟啥東西很像? #jQuery._Deferred提供下面的介面:

#done

function(fn1, fn2, …)的形式,用於把函數加入佇列。 #指定

this
    對象,
  • args

    指定參數,呼叫佇列中所有函數。未來對

    done
  • 的呼叫不會再保存函數,而是直接呼叫函數。
  • resolve

    :相當於呼叫

    fire(this, arguments)
  • ,一個簡化的方法。

isResolved:用來判斷_Deferred是否在

isResolved
    狀態,具體參考前面的
  • fire

    函數的解釋。

    cancel
  • :取消掉整個隊列,這樣不管未來是不是
  • fire

    ,隊列中的函數都不會再被呼叫。 說明白了jQuery._Deferred,再來看看jQuery.Deferred。這個東西其實就是2個_Deferred組成的,第一個稱為deferred,用來保管「正常」狀態下的函數;第二個稱為failDeferred,用於保管「出錯」狀態下的函數。同時jQuery.Deferred提供了一些新的介面:

  • #then

    function(done, fail)的形式,把done加進

    deferred
  • ,把
  • fail

    加進failedDeferred

    fail
  • :相當於
  • failDeferred

    done函數。

fireReject

:相當於failDeferredfire函數。 reject:相當於

failDeferred
  • resolve

    函數。 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物件:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var parser = new DOMParser();   var xml = parser.parseFromString(text, 'text/html');</pre><div class="contentsignin">登入後複製</div></div>對於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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

jQuery中如何使用PUT請求方式? jQuery中如何使用PUT請求方式? Feb 28, 2024 pm 03:12 PM

jQuery中如何使用PUT請求方式?在jQuery中,發送PUT請求的方法與發送其他類型的請求類似,但需要注意一些細節和參數設定。 PUT請求通常用於更新資源,例如更新資料庫中的資料或更新伺服器上的檔案。以下是在jQuery中使用PUT請求方式的具體程式碼範例。首先,確保引入了jQuery庫文件,然後可以透過以下方式發送PUT請求:$.ajax({u

jQuery小技巧:快速修改頁面所有a標籤的文本 jQuery小技巧:快速修改頁面所有a標籤的文本 Feb 28, 2024 pm 09:06 PM

標題:jQuery小技巧:快速修改頁面所有a標籤的文字在網頁開發中,我們經常需要對頁面中的元素進行修改和操作。使用jQuery時,有時候需要一次修改頁面中所有a標籤的文字內容,這樣可以節省時間和精力。以下將介紹如何使用jQuery快速修改頁面所有a標籤的文本,同時給出具體的程式碼範例。首先,我們需要引入jQuery庫文件,確保在頁面中引入了以下程式碼:&lt

什麼是狗狗幣 什麼是狗狗幣 Apr 01, 2024 pm 04:46 PM

狗狗幣是一種基於網路迷因創建的加密貨幣,沒有固定的供應上限,交易時間快速,交易費用低,擁有龐大的迷因社群。用途包括小額交易、打賞和慈善捐贈。然而,其無限供應量、市場波動和作為笑話幣的地位也帶來風險和擔憂。什麼是狗狗幣?狗狗幣是一種基於網路迷因和笑話創建的加密貨幣。起源與歷史:2013年12月,兩位軟體工程師BillyMarkus和JacksonPalmer創立狗狗幣。靈感來自於當時流行的"Doge"模因,一個以一隻柴犬為特徵的滑稽照片加上破碎英語。特徵與優勢:無限供應量:與比特幣等其他加密貨

PHP7改進之處:不再出現undefined報錯 PHP7改進之處:不再出現undefined報錯 Mar 04, 2024 pm 06:15 PM

PHP7改进之处:不再出现undefined报错PHP7是PHP语言的一个重大版本更新,带来了许多重要的改进和优化。其中一个显著的改进之处是在处理未定义变量时不再出现undefined报错,这为开发者带来了更好的使用体验。在PHP7之前,如果代码中使用了未定义的变量,会导致出现undefined报错,需要开发者通过手动检查或者设置错误报告级别来避免这种情况。

使用jQuery修改所有a標籤的文字內容 使用jQuery修改所有a標籤的文字內容 Feb 28, 2024 pm 05:42 PM

標題:使用jQuery修改所有a標籤的文字內容jQuery是一款受歡迎的JavaScript庫,被廣泛用於處理DOM操作。在網頁開發中,經常會遇到需要修改頁面上連結標籤(a標籤)的文字內容的需求。本文將介紹如何使用jQuery來實現這個目標,並提供具體的程式碼範例。首先,我們需要在頁面中引入jQuery庫。在HTML檔案中加入以下程式碼:

霓虹深淵第八色武器介紹 霓虹深淵第八色武器介紹 Mar 31, 2024 pm 03:51 PM

第八色是霓虹深淵中的一把武器,很多的玩家都想了解一下關於武器第八色額彈道、武器強度好玩法這些內容。那麼下面就讓我們一起來看看霓虹深淵第八色武器彈道、武器強度、武器玩法詳細攻略吧。霓虹深淵第八色詳細攻略武器介紹:巫師的秘密武器!武器攻速:正常武器強度:適中武器玩法:第八色的攻擊方式為三次單體攻擊然後發射一道射線。彈道展示:

網上查成績平台介紹(方便快速的成績查詢工具) 網上查成績平台介紹(方便快速的成績查詢工具) Apr 30, 2024 pm 08:19 PM

快速的成績查詢工具、這為學生和家長提供了更方便,隨著網路的發展,越來越多的教育機構和學校開始提供線上查成績的服務。讓您輕鬆掌握孩子的學業進展,本文將介紹幾個常用的線上查成績平台。一、便捷-透過網路查詢成績平台可以隨時隨地查詢孩子的考試成績家長可以方便地隨時查詢孩子的考試成績,透過在電腦或手機登入對應的網路查詢成績平台。只要有網路連結、無論是在工作中或在外出時、家長都可以及時了解孩子的學習情況,對孩子進行針對性地輔導和幫助。二、多種功能-除了成績查詢,還提供課表、考試安排等資訊許多網路查成

三星S24ai功能詳細介紹 三星S24ai功能詳細介紹 Jun 24, 2024 am 11:18 AM

2024是AI手机的元年,越来越多的手机集成了多项ai功能,通过ai智能技术的赋能,让我们的手机使用更加高效便捷。近日,年初发布的GalaxyS24系列再度提升了其生成式AI的体验,下面下详细的功能介绍,一起来看看吧。一、生成式AI深度赋能三星GalaxyS24系列通过GalaxyAI的赋能,带来了诸多智能化应用,这些功能与SamsungOneUI6.1深度集成,让用户可以随时获得便利的智能体验,显著提升了手机的使用效率和便捷性。由GalaxyS24系列首创的即圈即搜功能是亮点之一,用户只需长按

See all articles