pushStack是jQuery核心中一個非常重要的函數,它是如此重要,以至於許多jQuery內部函數中都經常使用它。平常情況下,雖然很少用到它, 但是掌握這個函數,不僅有利於理解jQuery的運行原理,還方便我們做更加高級的jQuery操作。
顧名思義,pushStack是入棧, 棧作為一種資料結構,是一種只能在一端進行插入和刪除操作的特殊線性表。資料入棧時,類似與我們進電梯,後進而先出, 如下圖:
jQuery中的棧其實並不是真正的棧,而是給jQuery物件附加一個屬性,指向當前物件的上一個物件, 透過end方法就能返回上一個元素。如下:
<span>1</span> <span>2</span> <span>3</span> <script> $('span').eq(0).css('fontSize','20px').end().fadeOut(2000); </script>
上面的程式碼會使第一個span的字體大小為20px,並讓所有span在2秒鐘之內fadaout。
pushStack屬於jQuery的實例方法,透過jQuery物件調用,如透過$().pushStack(document.getElementsByTagName('div')).css('background','blue')把所有div的背景都設定為藍色。那麼pushStack的原理是什麼,為什麼傳入的DOM物件可以用css方法操作呢?先來看jQuery中pushStack的源碼:
pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; // Return the newly-formed element set return ret; } //jQuery.merge merge: function( first, second ) { var l = second.length, i = first.length, j = 0; if ( typeof l === "number" ) { for ( ; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }
pushStack的實作比較簡單,主要涉及到jQuery的靜態方法merge, 這個方法用來合併物件, 設計思路是在第一個物件的基礎上,把第二個物件的屬性(0至n)附加上去, 理解這一點很重要。再回到pushStack這個函數,先定義一個局部變數ret儲存合併對象,然後給這個對象儲存prevObject和context屬性,最後回傳合併之後的ret對象。這裡有幾點要注意:
1, this.constructor 就是jQuery的建構子init,所以this.constructor()回傳一個jQuery物件.
2, 由於jQuery merge函數傳回的物件是第二個函數附加到第一個上面,所以ret也是jQuery對象,這裡可以解釋為什麼pushStack出入的DOM物件也可以用CSS方法來運作。
3, 返回的對象的prevObject屬性指向上一個對象,所以可以透過這個屬性找到棧的上一個對象.

实现方法:1、用“$("img").delay(毫秒数).fadeOut()”语句,delay()设置延迟秒数;2、用“setTimeout(function(){ $("img").hide(); },毫秒值);”语句,通过定时器来延迟。

区别:1、axios是一个异步请求框架,用于封装底层的XMLHttpRequest,而jquery是一个JavaScript库,只是顺便封装了dom操作;2、axios是基于承诺对象的,可以用承诺对象中的方法,而jquery不基于承诺对象。

修改方法:1、用css()设置新样式,语法“$(元素).css("min-height","新值")”;2、用attr(),通过设置style属性来添加新样式,语法“$(元素).attr("style","min-height:新值")”。

增加元素的方法:1、用append(),语法“$("body").append(新元素)”,可向body内部的末尾处增加元素;2、用prepend(),语法“$("body").prepend(新元素)”,可向body内部的开始处增加元素。

在jquery中,apply()方法用于改变this指向,使用另一个对象替换当前对象,是应用某一对象的一个方法,语法为“apply(thisobj,[argarray])”;参数argarray表示的是以数组的形式进行传递。

删除方法:1、用empty(),语法“$("div").empty();”,可删除所有子节点和内容;2、用children()和remove(),语法“$("div").children().remove();”,只删除子元素,不删除内容。

去掉方法:1、用“$(selector).removeAttr("readonly")”语句删除readonly属性;2、用“$(selector).attr("readonly",false)”将readonly属性的值设置为false。

on()方法有4个参数:1、第一个参数不可省略,规定要从被选元素添加的一个或多个事件或命名空间;2、第二个参数可省略,规定元素的事件处理程序;3、第三个参数可省略,规定传递到函数的额外数据;4、第四个参数可省略,规定当事件发生时运行的函数。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

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

Atom編輯器mac版下載
最受歡迎的的開源編輯器

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