jQuery的一些改進細節的介紹
jquery API」>jQuery 1.5 beta1出來了,從學習跟進上來說,這次已經比較晚了(我竟然不知道1.5什麼時候出的alpha,就這麼beta了)。
這個1.5版本最大的更新是AJAX的完全重寫,提供了更強的可擴展性。 但是受制於精力和篇幅,對新的AJAX的分析還是放到下回,本篇先簡單介紹一下細節方面的改進。有些問題根本沒辦法解釋。
入手,就能說明一大半的問題。 ,所以這大概是一個「透明提供延遲載入功能」的類型吧。 #簡單來說,jQuery._Deferred
是一個函數佇列,他的作用有以下幾點:##儲存若干個函數。 在特定的時刻把保存著的函數全部執行掉。
#感覺是不是跟啥東西很像? #jQuery._Deferred
提供下面的介面:
:function(fn1, fn2, …)
的形式,用於把函數加入佇列。 #指定
- 對象,
- args
指定參數,呼叫佇列中所有函數。未來對
done 的呼叫不會再保存函數,而是直接呼叫函數。 - resolve
:相當於呼叫
fire(this, arguments) ,一個簡化的方法。
isResolved
:用來判斷_Deferred是否在
- 狀態,具體參考前面的
- fire
函數的解釋。
cancel :取消掉整個隊列,這樣不管未來是不是 - fire
,隊列中的函數都不會再被呼叫。
說明白了
jQuery._Deferred
,再來看看jQuery.Deferred。這個東西其實就是2個_Deferred組成的,第一個稱為deferred
,用來保管「正常」狀態下的函數;第二個稱為failDeferred
,用於保管「出錯」狀態下的函數。同時jQuery.Deferred提供了一些新的介面: - #then
:
deferredfunction(done, fail)
的形式,把done
加進 ,把 - fail
加進
failfailedDeferred
。 :相當於 - failDeferred
的
done
函數。
:相當於failDeferred
的fire
函數。 reject
:相當於
- 的
- resolve
函數。
isRejected
:相當於failDeferred
的isResolved
函數。 同時 - jQuery.Deferred
取消了
cancel
函數。那麼這個是啥用的呢?有「正常」和「出錯」2個狀態,同時又是異步的,很容易就能想到……對,給AJAX用的,在下一篇分析中再詳細說明。
jQuery.ready的變化
因為有了 - jQuery._Deferred
這個東西,
jQuery._DeferredjQuery.ready
函數變成依賴函數佇列,具體的變化有:原來的
readyList
變數已經不再是數組,而變成了 物件。 -
原本在
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,使用
物件:
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操作部分
原本的hasClass
、addClass
、removeClass
函数都需要将元素的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
函数已经有非常多的回调函数,其触发过程如下:
根据返回的状态码,触发
success
或者error
回调。根据状态码,触发对应的statusCode回调。
触发
complete
回调。触发全局
ajaxComplete
回调。如果此时没有正在执行的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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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