jquery深造二....

一.什么是jQuery

jQuery是一個JavaScript庫,它通過封裝原生的JavaScript函數得到一整套定義好的方

法。它的作者是John Resig,于2006年創建的一個開源項目,隨著越來越多開發者的加入,jQuery已經集成了JavaScript、CSS、DOM和Ajax于一體的強大功能。它可以用最少的代碼,

二.jQuery的版本

2006年8月發布了jQuery1.0,第一個穩定版本,具有對CSS選擇符、事件處理和Ajax交互的支持。

2007年1月發布了jQuery1.1,極大的簡化API。合并了許多較少使用的方法。2007年7月發布了jQuery1.1.3,優化了jQuery選擇符引擎執行的速度。2007年9月發布了jQuery1.2,去掉了XPath選擇器,新增了命名空間事件。2008年5月發布了jQuery1.2.6,引入了Dimensions插件到核心庫中。

2009年1月發布了jQuery1.3,使用了全新的選擇符引擎Sizzle,性能進一步提升。

2010年1月發布了jQuery1.4,進行了一次大規模更新,提供了DOM操作,增加了很

多新的方法或是增強了原有的方法。

2010年2月發布了jQuery1.4.2,添加了.delegate()和.undelegate()兩個新方法,提升

了靈活性和瀏覽器一致性,對事件系統進行了升級。

2011年1月發布了jQuery1.5,重寫了AJAX組件,增強了擴展性和性能。

2011年5月發布了jQuery1.6,重寫了Attribute組件,引入了新對象和方法。

2011年11月發布了jQuery1.7,引入了.on()和.off()簡介的API解決事件綁定及委托容

易混淆的問題。

2012年3月發布了jQuery1.7.2,進行一些優化和升級。

2012年7月發布了jQuery1.8,8月發布了1.8.1,9月發布了1.8.2,重寫了選擇符引

擎,修復了一些問題。

2013年1月發布了jQuery1.9,CSS的多屬性設置,增強了CSS3。2013年5月發布了jQuery1.10,增加了一些功能。

2013年4月發布了jQuery2.0,5月發布了jQuery2.0.2,一個重大更新版本,不在支

持IE6/7/8,體積更小,速度更快。

jquery是一個庫,通過對原生js的函數得到整套完整的封裝好的方法!避免了js有些不兼容!簡化js繁瑣的!

版本的內容升級主要也有三種:

第一種是核心庫的升級,比如優化選擇符、優化DOM或者AJAX等;這種升級不影響開發者的使用。

第二種是功能性的升級,比如剔除一些過時的方法、新增或增強一些方法等等;這種升級需要了解和學習。第三種就是BUG修復之類的升級,對開發者使用沒有影響


其他JavaScript庫

目前除了jQuery,還有5個庫較為流行,他們分別是YUI、Prototype、Mootools、Dojo和ExtJS。

YUI,是雅虎公司開發的一套完備的、擴展性良好的富交互網頁工具集。Prototype,是最早成型的JavaScript庫之一,對JavaScript內置對象做了大量的擴展。Dojo,Dojo強大之處在于提供了其他庫沒有的功能。離線存儲、圖標組件等等。Mootools,輕量、簡潔、模塊化和面向對象的JavaScript框架。

ExtJS,簡稱Ext,原本是對YUI的一個擴展,主要創建前端用戶界面。(付費的)


一.代碼風格

$(function () {});

$(‘#box’);$(‘#box’).css(‘color’, ‘red’);

//執行一個匿名函數//進行執行的ID元素選擇//執行功能函數

二.加載模式

我們在之前的代碼一直在使用$(function () {});這段代碼進行首尾包裹,那么為什么必須

要包裹這段代碼呢?原因是我們jQuery庫文件是在body元素之前加載的,我們必須等待所

有的DOM元素加載后,延遲支持DOM操作,否則就無法獲取到。

在延遲等待加載,JavaScript提供了一個事件為load,方法如下:window.onload = function () {};//JavaScript等待加載$(document).ready(function () {});//jQuery等待加載

load和ready區別

1.執行時機? window.onload? ? 必須等待網頁全部加載完畢(包括圖片等),然后再執行包裹代碼,只能執行一次,如果第二次,那么第一次的執行會被覆蓋

2.$(document).ready()只需要等待網頁中的DOM結構加載完畢,就能執行包裹的代碼,可以執行多次,第N次都不會被上

在實際應用中,我們都很少直接去使用window.onload,因為他需要等待圖片之類的大型元素加載完畢后才能執行JS代碼。所以,最頭疼的就是網速較慢的情況下,頁面已經全面展開,圖片還在緩慢加載,這時頁面上任何的JS交互功能全部處在假死狀態。并且只能執行單次在多次開發和團隊開發中會帶來困難。

三.對象互換

jQuery對象雖然是jQuery庫獨有的對象,但它也是通過JavaScript進行封裝而來的。我

們可以直接輸出來得到它的信息。

alert($);//jQuery對象方法內部

alert($());//jQuery對象返回的對象,還是jQuery

alert($('#box'));//包裹ID元素返回對象,還是jQuery

從上面三組代碼我們發現:只要使用了包裹后,最終返回的都是jQuery對象。這樣的

好處顯而易見,就是可以連綴處理。但有時,我們也需要返回原生的DOM對象,比如:

alert(document.getElementById('box'));//[object HTMLDivElement]

jQuery想要達到獲取原生的DOM對象,可以這么處理:

alert($('#box').get(0));//ID元素的第一個原生DOM

四.多個庫之間的沖突

當一個項目中引入多個第三方庫的時候,由于沒有命名空間的約束(命名空間就好比同

一個目錄下的文件夾一樣,名字相同就會產生沖突),庫與庫之間發生沖突在所難免。

1.將jQuery庫在Base庫之前引入,那么“$”的所有權就歸Base庫所有,而jQuery可

以直接用jQuery對象調用,或者創建一個“$$”符給jQuery使用。

var $$ = jQuery;

$(function () {

alert($('#box').ge(0));

alert($$('#box').width());

});

2.如果將jQuery庫在Base庫之后引入,那么“$”的所有權就歸jQuery庫所有,而Base庫將會沖突而失去作用。這里,jQuery提供了一個方法:

jQuery.noConflict();

var $$ = jQuery;

$(function () {

alert($('#box').ge(0));

alert($$('#box').width());

});

//將$符所有權剔除

常規選擇器

jQuery最核心的組成部分就是:選擇器引擎。它繼承了CSS的語法,可以對DOM元素的標簽名、屬性名、狀態等進行快速準確的選擇,并且不必擔心瀏覽器的兼容性。jQuery選擇器實現了CSS1~CSS3的大部分規則之外,還實現了一些自定義的選擇器,用于各種特殊狀態的選擇


一.簡單選擇器

在使用jQuery選擇器時,我們首先必須使用“$()”函數來包裝我們的CSS規則。而CSS規則作為參數傳遞到jQuery對象內部后,再返回包含頁面中對應元素的jQuery對象。

隨后,我們就可以對這個獲取到的DOM節點進行行為操作了。

#box {//使用ID選擇器的CSS規則color:red;//將ID為box的元素字體顏色變紅}

在jQuery選擇器里,我們使用如下的方式獲取同樣的結果:

$('#box').css('color', 'red');//獲取DOM節點對象,并添加行為

那么除了ID選擇器之外,還有兩種基本的選擇器,分別為:元素標簽名和類(class):

選擇器

CSS模式

jQuery模式

描述

元素名div {}$('div')獲取所有div元素的DOM對象

ID#box {}$('#box')獲取一個ID為box元素的DOM對象

類(class).box{}$('.box')獲取所有class為box的所有DOM對象$('div').css('color', 'red');

$('#box').css('color', 'red');

$('.box').css('color', 'red');

//元素選擇器,返回多個元素//ID選擇器,返回單個元素//類(class)選擇器,返回多個元素

為了證明ID返回的是單個元素,而元素標簽名和類(class)返回的是多個,我們可以采

用jQuery核心自帶的一個屬性length或size()方法來查看返回的元素個數。

alert($('div').size());

alert($('#box').size());alert($('.box').size());

//3個

//1個,后面兩個失明了//3個

同理,你也可以直接使用jQuery核心屬性來操作:alert($('#box').length);//1個,后面失明了

警告:有個問題特別要注意,ID在頁面只允許出現一次,我們一般都是要求開發者要

遵守和保持這個規則。但如果你在頁面中出現三次,并且在CSS使用樣式,那么這三個元

素還會執行效果。但如果,你想在jQuery這么去做,那么就會遇到失明的問題。所以,開

發者必須養成良好的遵守習慣,在一個頁面僅使用一個ID。

$('#box').css('color', 'red');//只有第一個ID變紅,后面兩個失明

jQuery選擇器的寫法與CSS選擇器十分類似,只不過他們的功能不同。CSS找到元素

后添加的是單一的樣式,而jQuery則添加的是動作行為。最重要的一點是:CSS在添加樣

式的時候,高級選擇器會對部分瀏覽器不兼容,而jQuery選擇器在添加CSS樣式的時候卻

不必為此煩惱。

#box > p {//CSS子選擇器,IE6不支持color:red;

}

$('#box > p').css('color','red');//jQuery子選擇器,兼容了IE6

jQuery選擇器支持CSS1、CSS2的全部規則,支持CSS3部分實用的規則,同時它還有

少量獨有的規則。所以,對于已經掌握CSS的開發人員,學習jQuery選擇器幾乎是零成本。

而jQuery選擇器在獲取節點對象的時候不但簡單,還內置了容錯功能,這樣避免像JavaScript那樣每次對節點的獲取需要進行有效判斷。

$('#pox').css('color', 'red');//不存在ID為pox的元素,也不報錯document.getElementById('pox').style.color = 'red';//報錯了

因為jQuery內部進行了判斷,而原生的DOM節點獲取方法并沒有進行判斷,所以導

致了一個錯誤,原生方法可以這么判斷解決這個問題:

if (document.getElementById('pox')) {//先判斷是否存在這個對象document.getElementById('pox').style.color = 'red';

}

那么對于缺失不存在的元素,我們使用jQuery調用的話,怎么去判斷是否存在呢?因

為本身返回的是jQuery對象,可能會導致不存在元素存在與否,都會返回true。

if ($('#pox').length > 0) {//判斷元素包含數量即可$('#pox').css('color', 'red');

}

除了這種方式之外,還可以用轉換為DOM對象的方式來判斷,例如:

if ($('#pox').get(0)) {}或if ($('#pox')[0]) {}//通過數組下標也可以獲取DOM對象

二.進階選擇器

在簡單選擇器中,我們了解了最基本的三種選擇器:元素標簽名、ID和類(class)。那么

在基礎選擇器外,還有一些進階和高級的選擇器方便我們更精準的選擇元素。

選擇器

CSS模式

jQuery模式

描述

群組選擇器span,em,.box {}$('span,em,.box')獲取多個選擇器的DOM對象

后代選擇器ul li a {}$('ul li a')獲取追溯到的多個DOM對象

通配選擇器* {}$('*')

獲取所有元素標簽的DOM對象

//群組選擇器span, em, .box {color:red;}

$('span, em, .box').css('color', 'red');

//后代選擇器ul li a {color:red;}

$('ul li a').css('color', 'red');

//通配選擇器* {

color:red;

}

$('*').css('color', 'red');


目前介紹的六種選擇器,在實際應用中,我們可以靈活的搭配,使得選擇器更加的精準和快速:

$('#box p, ul li *').css('color', 'red');//組合了多種選擇器

警告:在實際使用上,通配選擇器一般用的并不多,尤其是在大通配上,比如:$('*'),

這種使用方法效率很低,影響性能,建議竟可能少用。

還有一種選擇器,可以在ID和類(class)中指明元素前綴,比如:

$('div.box');//限定必須是.box元素獲取必須是div$('p#box div.side');//同上

類(class)有一個特殊的模式,就是同一個DOM節點可以聲明多個類(class)。那么對于這

種格式,我們有多class選擇器可以使用,但要注意和class群組選擇器的區別。

.box.pox {//雙class選擇器,IE6出現異常color:red;

}

$('.box.pox').css('color', 'red');//兼容IE6,解決了異常

多class選擇器是必須一個DOM節點同時有多個class,用這多個class進行精確限定。

而群組class選擇器,只不過是多個class進行選擇而已。

$('.box, .pox').css('color', 'red');//加了逗號,體會區別

警告:在構造選擇器時,有一個通用的優化原則:只追求必要的確定性。當選擇器篩選

越復雜,jQuery內部的選擇器引擎處理字符串的時間就越長。比如:

$('div#box ul li a#link');//讓jQuery內部處理了不必要的字符串$('#link');//ID是唯一性的,準確度不變,性能提升

三.高級選擇器

在前面我們學習六種最常規的選擇器,一般來說通過這六種選擇器基本上可以解決所有

DOM節點對象選擇的問題。但在很多特殊的元素上,比如父子關系的元素,兄弟關系的元

素,特殊屬性的元素等等。在早期CSS的使用上,由于IE6等低版本瀏覽器不支持,所以

這些高級選擇器的使用也不具備普遍性,但隨著jQuery兼容,這些選擇器的使用頻率也越

來越高。

描述

后代選擇器ul li a {}$('ul li a')獲取追溯到的多個DOM對象

子選擇器div > p {}$('div p')只獲取子類節點的多個DOM對象

next選擇器div + p {}$('div + p')只獲取某節點后一個同級DOM對象

nextAll選擇器div ~ p {}$('div ~ p')獲取某節點后面所有同級DOM對象

在層次選擇器中,除了后代選擇器之外,其他三種高級選擇器是不支持IE6的,而jQuery卻是兼容IE6的。

//后代選擇器

$('#box p').css('color', 'red');//全兼容

jQuery為后代選擇器提供了一個等價find()方法

$('#box').find('p').css('color', 'red');

//子選擇器,孫子后失明#box > p {

color:red;

}

$('#box > p').css('color', 'red');

//和后代選擇器等價

//IE6不支持

//兼容IE6

jQuery為子選擇器提供了一個等價children()方法:$('#box').children('p').css('color', 'red');//和子選擇器等價

//next選擇器(下一個同級節點)

#box + p {//IE6不支持

color:red;

}

$('#box+p').css('color', 'red');//兼容IE6

jQuery為next選擇器提供了一個等價的方法next():

$('#box').next('p').css('color', 'red');

//nextAll選擇器(后面所有同級節點)#box ~ p {

color:red;

}

$('#box').nextAll('p').css('color', 'red');//和nextAll選擇器等價

層次選擇器對節點的層次都是有要求的,比如子選擇器,只有子節點才可以被選擇到,

孫子節點和重孫子節點都無法選擇到。next和nextAll選擇器,必須是同一個層次的后一個

和后N個,不在同一個層次就無法選取到了。

在find()、next()、nextAll()和children()這四個方法中,如果不傳遞參數,就相當于傳遞

了“*”,即任何節點,我們不建議這么做,不但影響性能,而且由于精準度不佳可能在復雜

的HTML結構時產生怪異的結果。

$('#box').next();//相當于$('#box').next('*');

為了補充高級選擇器的這三種模式,jQuery還提供了更加豐富的方法來選擇元素:$('#box').prev('p').css('color', 'red');//同級上一個元素$('#box').prevAll('p').css('color', 'red');//同級所有上面的元素

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容