第1章,認識jQuery 目前流行的JavaScript庫 Prototype(http://www.prototypejs.org),成型早,面向對象的思想把握不到位,導致結構鬆散 Dojo(http://dojotoolkit.org),學習曲線陡,文檔不全,最嚴重的是API不穩定 YUI(ht ...
第1章,認識jQuery
註意:使用的jQuery版本為1.7.1
目前流行的JavaScript庫
Prototype(http://www.prototypejs.org),成型早,面向對象的思想把握不到位,導致結構鬆散 Dojo(http://dojotoolkit.org),學習曲線陡,文檔不全,最嚴重的是API不穩定 YUI(http://developer.yahoo.com/yui/) Ext JS(http://www.extjs.com),側重界面,比較臃腫,用於商業用途需要付費 MooTools(http://mootools.net/) jQuery(http://jquery.com)jQuery優勢
1、輕量級 2、強大的選擇器 3、出色的DOM操作 4、可靠的事件處理機制 5、完善的Ajax 6、不污染頂級變數 7、出色的瀏覽器相容性,支持IE6.0+、Firefox3.6+、Safari5.0+、Opera、Chrome 8、鏈式操作方式 9、隱式迭代 10、行為層與結構層的分離 11、豐富的插件支持 12、完善的文檔 13、開源jQuery代碼的編寫
在jQuery庫中,$就是就jQuery的一個簡寫形式,$("#foo")和jQuery("#foo")是等價的 規範: 1、對於同一個對象不超過3個操作的,可以直接寫在一行 2、對於同一個對象的較多操作,建議每行寫一個操作 3、對於多個對象的少量操作,可以每個對象寫一行,涉及子元素的,可以考慮縮進 建議:jQuery對象使用$開頭,例:var $variable = jQuery對象,var variable= DOM對象jQuery對象和DOM對象的相互轉換
1、jQuery對象轉成DOM對象 jQuery對象不能使用DOM中的方法,jQuery提供了兩種方法將jQuery對象轉成DOM對象,即使用[index]和get(index) (1)jQuery對象是一個類似數組的對象,可以通過[index]得到相應DOM對象var $cr = $("#cr"); //jQuery對象 var cr = $cr[0]; //DOM對象(2)通過get(index)得到
var $cr = $("#cr"); //jQuery對象 var cr = $cr.get(0); //DOM對象2、DOM對象轉成jQuery對象 只需要使用$()將DOM對象包裝起來即可得到jQuery對象
var cr = document.getElementById("cr"); //DOM對象 var $cr = $(cr); //jQuery對象註:DOM對象只能使用DOM方法,jQuery對象只能使用jQuery的方法 註:平時用到的jQuery對象都是通過$()函數製造出來的,$()就是一個jQuery對象製造工廠,也可以使用jQuery()函數,因為$和加jQuery等價
解決jQuery和其它庫的衝突
註:預設情況下,jQuery用$作為自身的快捷方式 1、jQuery庫在其他庫之後導入 (1)在其他庫和jQuery庫載入完畢之後,可以在任何時候調用jQuery.noConflict()函數將變數$的控制權移交其他的JavaScript庫 例:<!-- 引入prototype庫 --> <script type="text/javascript" src="lib/prototype.js"></script> <!-- 引入jQuery庫 --> <script type="text/javascript" src="lib/jQuery.js"></script> <script type="text/javascript"> jQuery.noConflict(); //將變數$的控制權移交給prototype.js jQuery(function(){ //使用jQuery jQuery("p").click(function(){ alert(jQuery(this).text()); }); }); $('pp').style.display = 'none'; //使用prototype.js隱藏元素 </script>
(2)想確保jQuery不與其他庫衝突,又想自定義快捷方式:
<script type="text/javascript"> var $j = jQuery.noConflict(); //自定義快捷方式 $j(function(){ //使用jQuery,利用自定義快捷方式 $j $j("p").click(function(){ alert.($j(this).text()); }); }); $('pp').style.display = 'none'; //使用prototype.js隱藏元素 </script>(3)若不想自定義備用名稱,又想使用$,還希望不衝突 <1>
<script type="text/javascript"> jQuery.noConflict(); //將變數$的控制權移交給prototype.js jQuery(function($){ //使用jQuery設定頁面載入時執行的函數 $("p").click(function(){ //函數內部繼續使用$() alert.($(this).text()); }); }); $('pp').style.display = 'none'; //使用prototype.js隱藏元素 </script>
<2>
<script type="text/javascript"> jQuery.noConflict(); //將變數$的控制權移交給prototype.js (function($){ //定義匿名函數 $(function(){ //匿名函數內部的$均為jQuery $("p").click(function(){ alert.($(this).text()); }); }); })(jQuery); //執行匿名函數且傳遞實參jQuery $('pp').style.display = 'none'; //使用prototype.js隱藏元素 </script>2、jQuery在其他庫之前導入 直接使用jQuery而非$來做jQuery的工作,$()方法作為其他庫的快捷方式,無需調用jQuery.noConflict()方法
第2章,jQuery選擇器
jQuery選擇器的優勢
1、簡潔的寫法 使用$("#ID")代替document.getElementById(),使用$("tagName")代替document.getElementsByTagName()函數 2、支持CSS1到CSS3選擇器 3、完善的處理機制,即,使用jQuery獲取不存在的元素也不會報錯 註:$("#tt")獲取的永遠是對象,即使網頁上沒有元素,因此當要使用jQuery檢查某個元素在網頁上是否存在,不能使用如下代碼:if($("#tt")){ /* do something */ }
應根據獲取的元素長度來判斷:
if($("#tt").length > 0){ /* do something */ }
或轉換成DOM對象:
if($("#tt")[0]){ /* do something */ }基本選擇器
選擇器 | 描述 | 返回 | 示例 |
#id | 根據給定id匹配一個元素 | 單個元素 | $("#test")選取id為test的元素 |
.class | 根據給定類名匹配元素 | 集合元素 | $(".test")選取所有class為test的元素 |
element | 根據給定元素名匹配元素 | 集合元素 | $("p") |
* | 匹配所有元素 | 集合元素 | $("*") |
selector1,selector2... | 將每個選擇器匹配到的元素合併後一起返回 | 集合元素 | $("div,span,p.myClass") |
選擇器 | 描述 | 返回 | 示例 |
$("ancestor descendant") | 選取ancestor元素里所有descendant(後代)元素 | 集合元素 | $("div span")選取div里所有span元素 |
$("parent>child") | 與CSS的子選擇器一樣 | 集合元素 | $("div>span") |
$("prev+next") | 與CSS的相鄰同胞選擇器一樣 | 集合元素 | $(".one+div") |
$("prev~sibling") | 與CSS的通用的同胞組合選擇器一樣 | 集合元素 | $("#two~div") |
選擇器 | 描述 | 返回 | 示例 |
:first | 選取第一個元素 | 單個元素 | $("div:first")選取所有<div>元素中第1個<div>元素 |
:last | 選取最後一個元素 | 單個元素 | $("div:last")解釋類似:first |
:not(selector) | 去除所有與給定選擇器匹配的元素 | 集合元素 | $("input:not(.myClass)") |
:even | 選取索引是偶數的元素,索引從0開始 | 集合元素 | $("input:even") |
:odd | 選取索引是奇數的元素,索引從0開始 | 集合元素 | $("input:odd") |
:eq(index) | 選取索引是index的元素,index從0開始 | 單個元素 | $("input:eq(1)") |
:gt(index) | 選取索引大於index的元素,index從0開始 | 集合元素 | $("input:gt(1)") |
:lt(index) | 選取索引小於index的元素,index從0開始 | 集合元素 | $("input:lt(1)") |
:header | 選取所有標題元素,例h1,h2 | 集合元素 | $(":header") |
:animated | 選取正在執行動畫的元素 | 集合元素 | $("div:animated") |
:focus | 選取獲得焦點的元素 | 集合元素 | $(":focus") |
選擇器 | 描述 | 返回 | 示例 |
:contains(text) | 選取含有文本內容為“text”的元素 | 集合元素 | $("div:contains('me')")選取所有含有文本"me"的div元素 |
:empty | 選取不包含子元素或文本的空元素 | 集合元素 | $("div:empty") |
:has(selector) | 選取含有選擇器所匹配的元素的元素 | 集合元素 | $("div:has(p)")選取含有p元素的div元素 |
:parent | 選取含有子元素或文本元素的元素 | 集合元素 | $("div:parent") |
選擇器 | 描述 | 返回 | 示例 |
:hidden | 選取所有不可見元素 | 集合元素 | $(":hidden")選取所有不可見元素 |
:visible | 選取所有可見元素 | 集合元素 | $("div:visible")選取可見的div元素 |
選擇器 | 描述 | 返回 | 示例 |
[attribute] | 選擇擁有此屬性的元素 | 集合元素 | $("div[id]")選取擁有id屬性的div元素 |
[attribute=value] | 選擇擁有屬性值為value的元素 | 集合元素 | $("div[title=test]") |
[attribute!=value] | 選擇屬性值不等於value的元素 | 集合元素 | $("div[title!=test]"),沒有屬性title的元素也會被選取 |
[attribute^=value] | 選擇屬性值以value開始的元素 | 集合元素 | $("div[title^=test]") |
[attribute$=value] | 選擇屬性值以value結束的元素 | 集合元素 | $("div[title$=test]") |
[attribute*=value] | 選擇屬性值含有value的元素 | 集合元素 | $("div[title*=test]") |
[attribute|=value] | 選擇屬性等於給定字元串或以該字元串為首碼(該字元串後 跟一個連字元‘-’)的元素 |
集合元素 | $("div[title|="en"]")選取title屬性等於en 或以en為首碼的元素 |
[attribute~=value] | 選取屬性用空格分隔的值中包含一個給定值的元素 | 集合元素 | $("div[title~="uk"]") |
[attribute1] [attribute2] ... |
用屬性選擇器合併成複合選擇器,滿足多個條件,縮小範圍 | 集合元素 | $("div[id][title$="test"]")選取擁有屬性 id並且屬性title以"test"結束的div元素 |
選擇器 | 描述 | 返回 | 示例 |
:nth-child(index/even /odd/equatioin) |
選取每個父元素下第index個子元素或奇偶元素, index從1開始 |
集合元素 | 將為每一個父元素匹配子元素 |
:first-child | 選取每個父元素的第一個子元素 | 集合元素 | 將為每一個父元素匹配子元素 |
:last-child | 選取每個父元素的最後一個子元素 | 集合元素 | 將為每一個父元素匹配子元素 |
:only-child | 若某個元素是其父元素唯一的子元素,則被匹配 | 集合元素 | $("ul li:only-child")在<ul>中選取是唯一 子元素的<li>元素 |
選擇器 | 描述 | 返回 | 示例 |
:enabled | 選取所有可用元素 | 集合元素 | $("#form1 :enabled") |
:disabled | 選取所有不可用元素 | 集合元素 | $("#form1 :disabled") |
:checked | 選取所有被選中元素,單選,覆選 | 集合元素 | $("input:checked") |
:selected | 選取所有被選中選項元素,下來列表 | 集合元素 | $("select option:selected") |
:input | 選取所有<input><textarea><select><button> | 集合元素 | $(":input") |
:text | 選取所有單行文本框 | 集合元素 | $(":text") |
:password | 選取所有密碼框 | 集合元素 | $(":password") |
:radio | 選取所有單選框 | 集合元素 | $(":radio") |
:checkbox | 選取所有覆選框 | 集合元素 | $(":checkbox") |
:submit | 選取所有提交按鈕 | 集合元素 | $(":submit") |
:image | 選取所有圖像按鈕 | 集合元素 | $(":image") |
:reset | 選取重置按鈕 | 集合元素 | $(":reset") |
:button | 選取所有按鈕 | 集合元素 | $(":button") |
:file | 選取所有上傳域 | 集合元素 | $(":file") |
:hidden | 選取所有不可見元素 | 集合元素 | $(":hidden") |
選擇器中的註意事項
1、選擇器中含有".","#","(","]"等特殊符號,需要轉義,例:$("#id\\#b") 2、屬性選擇器中的@符號需要去掉第3章,jQuery中的DOM操作
DOM操作分類
1、DOM Core(核心) 2、HTML-DOM 3、CSS-DOMjQuery中的DOM操作
1、查找節點 (1)查找元素節點,使用選擇器 (2)查找屬性節點,再找到元素之後,可以使用attr()方法獲取元素屬性 2、創建節點 (1)創建元素節點 使用工廠函數$()來完成,$(html),根據傳入的HTML標記字元串,創建一個DOM對象,並轉成jQuery對象返回 例:$("<li></li>") (2)創建文本節點,與(1)類似,將文本內容一起包含在HTML標記字元串中 (3)創建屬性節點,與(1)類似,將節點屬性一起包含在HTML標記字元串中 3、插入節點方法 | 描述 | 示例 |
append() | 向每個匹配的元素內部追加內容 | <p>我想說:</p> $("p").append("<b>你好</b>"); <p>我想說:<b>你好</b></p> |
appendTo() | 將所有匹配元素追加到指定元素中,與append方法顛倒 | <p>我想說:</p> $("<b>你好</b>").appendTo("p"); <p>我想說:<b>你好</b></p> |
prepend() | 向每個元素內部前置內容 | <p>我想說:</p> $("p").prepend("<b>你好</b>"); <p><b>你好</b>我想說:</p> |
prependTo() | 將所有匹配元素前置到指定元素中,與prependTo方法顛倒 | <p>我想說:</p> $("p").prependTo("<b>你好</b>"); <p><b>你好</b>我想說:</p> |
after() | 在每個匹配元素之後插入內容 | <p>我想說:</p> $("p").after("<b>你好</b>"); <p>我想說:</p><b>你好</b> |
insertAfter() | 將所有匹配元素插入到指定元素之後 | <p>我想說:</p> $("<b>你好</b> ").insertAfter("p"); <p>我想說:</p><b>你好</b> |
before() | 在每個匹配的元素之前插入內容 | <p>我想說:</p> $("p").before("<b>你好</b>"); <b>你好</b> <p>我想說:</p> |
insertBefore() | 將所有匹配元素插入到指定元素之前 | <p>我想說:</p> $("<b>你好</b> ").insertBefore("p"); <b>你好</b> <p>我想說:</p> |
$("ul li:eq(1)").remove();也可以通過傳遞參數來選擇性刪除:
$("ul li").remove("li[title!=test]");(2)datach方法 與remove一樣,但不會清除綁定的事件、附加的數據 (3)empty方法 並不能算是刪除節點,而是清空節點,清空指定元素的所有後代節點 5、複製節點 使用clone方法,使用參數true可以同時複製元素所綁定事件 6、替換節點 replaceWith()和replaceAll()
$("p").replaceWith("<strong>hello</strong>");
$("<strong>hello</strong>").replaceAll("p");
以上兩句是一樣的效果
註:元素綁定事件一樣會被清掉
7、包裹節點
使用wrap()方法
<strong>hello</strong>
$("strong").wrap("<b></b>"); //用b標簽把strong元素包裹起來
<b><strong>hello</strong></b>wrapAll()和wrapInner() (1)wrapAll 將所有匹配元素用一個元素來包裹,與wrap不同,wrap是將所有匹配元素單獨包裹:
<strong>hello</strong> <strong>hello</strong>
$("strong").wrap("<b></b>");
<b><strong>hello</strong></b> <b><strong>hello</strong></b>而使用wrapAll之後:
<b> <strong>hello</strong> <strong>hello</strong> </b>註:若被包裹元素之間有其他元素,則其他元素會被放到包裹元素之後 (2)wrapInner方法 該方法將每一個匹配的元素的子內容用其他結構化標記包裹起來:
<strong>hello</strong>
$("strong").wrapInner("<b></b>");
<strong><b>hello</b></strong>8、屬性操作 (1)獲取和設置屬性 使用attr()方法 獲取屬性
var $p = $("p"); var p_txt = $p.attr("title");設置屬性
$("p").attr("title","value"); //用於設置單個屬性 $("p").attr({"title":"you title","name":"you name"}); //用於設置多個屬性,使用對象傳遞(2)刪除屬性 使用removeAttr()方法
$("p").removeAttr("title");9、樣式操作 (1)獲取和設置樣式 使用attr()方法 (2)追加樣式 使用addClass()方法
$("p").addClass("another");(3)移除樣式 使用removeClass 參數為要移除的class名,不帶參數則把所有class移除 (4)切換樣式 toggle()方法
$toggleBtn.toggle(function(){ //代碼1 },function(){ //代碼2 });toggle的作用是,交替執行代碼1和代碼2,主要是用於控制行為上的重覆切換 toggleClass()方法 用於控制樣式上的切換,類名存在則刪除,不存在則添加
$("p").toggleClass("another");(5)判斷是否含有某個樣式 hasClass()方法用於判斷是否含有某個class,有返回true,沒有返回false 10、設置和獲取HTML、文本和值 (1)html()方法,可用於XHTML,不可用於XML 類似於JavaScript的innerHTML屬性,可以用於獲取和設置元素(傳遞參數)的HTML內容 (2)text()方法 類似於JavaScript的innerText屬性,用於獲取和設置元素(傳遞參數)的文本內容 (3)val()方法 類似於JavaScript的value屬性,用於設置和獲取元素的值,無論元素是文本框,下來列表還是單選框,都可以返回元素值,若為多選,返回一個包含所有選擇的值的數組 11、遍歷節點 (1)children()方法 取得匹配元素的子元素集合,只考慮子元素,不考慮後代元素,$("p").children(); (2)next()方法 用於取得匹配元素後面緊鄰的同輩元素,$("p").next(); (3)prev()方法 用於取得匹配元素前面緊鄰的同輩元素,$("p").prev(); (4)siblings()方法 用於取得匹配元素前後所有同輩元素,$("p").siblings(); (5)closest()方法 該方法用於取得最近的匹配元素。首先檢查元素本身,接著逐級向上往祖先元素查找,沒找到則返回空jQuery對象 (6)parent(),parents(),closest()區別 parent(),獲取集合中每個匹配元素的父元素 parents(),獲取集合中每個匹配元素的祖先元素 closese(),從元素本身開始,逐級向上級元素匹配,並返回最先匹配的祖先元素 12、CSS-DOM操作 可以直接利用css()方法獲取元素的樣式屬性:$("p").css("color"); 無論是外部CSS導入,還是直接拼接在HTML元素中,都可以通過css()方法獲得 設置樣式與attr()方法類似
$("p").css("color","red"); //設置單個 $("p").css({"color":"red","fontSize":"30px"); //設置多個註:如果值是數字,則自動轉化為像素值 獲取元素高度,可以直接使用height屬性
$("p").height();註:1、jQuery1.2之後height可用於獲取window和document的高度 2、css方法獲取的高度值與樣式設置有關,而height獲取的是元素在頁面實際高度,與樣式設置無關,且不帶單位 與height對應的還有width()方法 其他幾個經常使用的方法: (1)offset()方法 用於獲取元素在當前視窗的相對偏移,返回對象包含兩個屬性,top,left,只對可見元素有效 (2)position()方法 用於獲取元素相對於最近一個position樣式屬性設置為relative或absolute的祖先節點的相對偏移,返回對象也包含連個屬性top,left (3)scrollTop()方法和scrollLeft()方法 分別用於獲取元素的滾動條距頂端和距左側的距離,還可以接受一個參數,指定滾動條滾動到指定位置