03. jQuery
一、jQuery介紹
jQuery,顧名思義,也就是JavaScript和查詢(Query),它就是輔助JavaScript開發的js類庫。它的核心思想是write less,do more(寫得更少,做得更多),所以它實現了很多瀏覽器的相容問題。jQuery是免費、開源的,jQuery的語法設計可以使開發更加便捷,例如操作文件物件、選擇DOM元素、製作動畫效果、事件處理、使用Ajax以及其他功能。
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="./library/jquery-1.7.2.js"></script> <script type="text/javascript"> //表示頁面載入完成之後,相當於window.onload = function(){} $(function(){ var $btnObj = $("#btn01"); //表示按id查新標籤物件 $btnObj.click(function(){ alert("jQuery的單擊事件"); }); }); </script> </head> <body> <button id="btn01">按鈕</button> </body> </html>
jquery-1.7.2.js放在下一級目錄【library】中;
二、jQuery核心函式
$是jQuery的核心函式,能完成jQuery的很多功能。$()就是呼叫$這個函式。
-
傳入引數為函式時
- 表示頁面載入完成之後。相當於 window.onload = function(){}
-
傳入引數為HTML字串時
- 會對我們建立這個html標籤物件
-
傳入引數為選擇器字串時
- $(“#id 屬性值”); id選擇器,根據id查詢標籤物件
- $(“標籤名”); 標籤名選擇器,根據指定的標籤名查詢標籤物件
- $(“.class 屬性值”); 型別選擇器,可以根據class屬性查詢標籤物件
-
傳入引數為DOM物件時
- 會把這個dom物件轉換為jQuery物件
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="./library/jquery-1.7.2.js"></script> <script type="text/javascript"> //傳入引數為函式時,表示頁面載入完成之後 $(function(){ alert("頁面載入完成之後,自動呼叫"); //傳入引數為HTML字串時,會對我們建立這個html標籤物件 $("<div>" + "<span>div-span1</span>" + "<span>div-span2</span>" + "</div>" ).appendTo("body"); //傳入引數為選擇器字串時 var $btnObj = $("#btn01"); //表示按id查新標籤物件 $btnObj.click(function () { alert("jQuery的單擊事件"); }); alert($("button").length); //傳入引數為DOM物件時,會把這個dom物件轉換為jQuery物件 var btnObj = document.getElementById("btn01"); alert(btnObj); alert($(btnObj)); }); </script> </head> <body> <button id="btn01">按鈕1</button> <button class="btn02">按鈕2</button> <button class="btn02">按鈕3</button> </body> </html>
三、jQuery物件和dom物件區分
3.1、什麼是jQuery物件,什麼是dom物件
-
Dom物件
- 通過getElementById()查詢出來的標籤物件是Dom物件
- 通過getElementsByName()查詢出來的標籤物件是Dom物件
- 通過getElementsByTagName()查詢出來的標籤物件是Dom物件
- 通過createElement()方法建立的物件,是Dom物件
-
jQuery物件
- 通過JQuery提供的API建立的物件,是JQuery物件
- 通過JQuery包裝的Dom物件,也是JQuery物件
- 通過JQuery提供的API查詢到的物件,是JQuery物件
DOM物件Alert出來的效果是:[object HTML 標籤名 Element]
jQuery物件Alert出來的效果是:[object Object]
jQuery物件的本質:jQuery物件是dom物件的陣列+jQuery提供的一系列功能函式。
jQuery物件不能使用DOM物件的屬性和方法;DOM物件也不能使用jQuery物件的屬性和方法;
3.2、Dom物件和jQuery物件互轉
- dom物件轉化為jQuery物件
- 先有DOM物件
- $(DOM物件)就可以轉換成為jQuery物件
- jQuery物件轉為dom物件
- 先有jQuery物件
- jQuery物件[下標]取出相應的DOM物件
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
//dom物件轉化為jQuery物件
alert($(document.getElementById("btn01")));
//jQuery物件轉為dom物件
alert($(document.getElementById("btn01"))[0]);
});
</script>
</head>
<body>
<button id="btn01">按鈕1</button>
</body>
</html>
四、jQuery選擇器
4.1、基本選擇器
-
ID選擇器:根據id查詢標籤物件
- .class選擇器:根據class查詢標籤物件
- element選擇器:根據標籤名查詢標籤物件
- *選擇器:表示任意的,所有的元素
- selector1,selector2組合選擇器:合併選擇器1,選擇器2的結果並返回
4.2、層級選擇器
- ancestor descendant 後代選擇器 :在給定的祖先元素下匹配所有的後代元素
- parent > child 子元素選擇器:在給定的父元素下匹配所有的子元素
- prev + next 相鄰元素選擇器:匹配所有緊接在prev元素後的next元素
- prev ~ sibings 之後的兄弟元素選擇器:匹配prev元素之後的所有siblings元素
4.3、過濾選擇器
4.3.1、基本過濾器
- :first 獲取第一個元素
- :last 獲取最後個元素
- :not(selector) 去除所有與給定選擇器匹配的元素
- :even 匹配所有索引值為偶數的元素,從0開始計數
- :odd 匹配所有索引值為奇數的元素,從0開始計數
- :eq(index) 匹配一個給定索引值的元素
- :gt(index) 匹配所有大於給定索引值的元素
- :lt(index) 匹配所有小於給定索引值的元素
- :header 匹配如h1,h2,h3 之類的標題元素
- :animated 匹配所有正在執行動畫效果的元素
4.3.2、內容過濾器
- :contains(text) 匹配包含給定文字的元素
- :empty 匹配所有不包含子元素或者文字的空元素
- :parent 匹配含有子元素或者文字的元素
- :has(selector) 匹配含有選擇器所匹配的元素的元素
4.3.3、屬性過濾器
- [attribute] 匹配包含給定屬性的元素
- [attribute=value] 匹配給定的屬性是某個特定值的元素
- [attribute!=value] 匹配所有不含有指定的屬性,或者屬性不等於特定值的元素
- [attribute^=value] 匹配給定的屬性是以某些值開始的元素
- [attribute$=value] 匹配給定的屬性是以某些值結尾的元素
- [attribute*=value] 匹配給定的屬性是以包含某些值的元素
- [attrSel1][attrSel2][attrSelN] 複合屬性選擇器,需要同時滿足多個條件時使用
4.3.4、表單過濾器
- :input 匹配所有input,textarea,select和button元素
- :text 匹配所有文字輸入框
- :password 匹配所有的密碼輸入框
- :radio 匹配所有的單選框
- :checkbox 匹配所有的複選框
- :submit 匹配所有提交按鈕
- :image 匹配所有img標籤
- :reset 匹配所有重置按鈕
- :button 匹配所有input type=button <button>按鈕
- :file 匹配所有input type=file檔案上傳
- :hidden 匹配所有不可見元素display:none或input type=hidden
4.3.5、表單物件屬性過濾器
- :enabled 匹配所有可用元素
- :disabled 匹配所有不可用元素
- :checked 匹配所有選中的單選,複選,和下拉列表中選中的option標籤物件
- :selected 匹配所有選中的option
五、jQuery 元素篩選
- eq() 獲取給定索引的元素,功能跟:eq()一樣
- first() 獲取第一個元素,功能跟:first一樣
- last() 獲取最後一個元素,功能跟:last一樣
- filter(exp) 留下匹配的元素
- is(exp) 判斷是否匹配給定的選擇器,只要有一個匹配就返回,true
- has(exp) 返回包含有匹配選擇器的元素的元素,功能跟:has一樣
- not(exp) 刪除匹配選擇器的元素,功能跟:not一樣
- children(exp) 返回匹配給定選擇器的子元素,功能跟parent>child一樣
- find(exp) 返回匹配給定選擇器的後代元素,功能跟ancestor descendant一樣
- next() 返回當前元素的下一個兄弟元素,功能跟prev + next功能一樣
- nextAll() 返回當前元素後面所有的兄弟元素,功能跟prev ~ siblings功能一樣
- nextUntil() 返回當前元素到指定匹配的元素為止的後面元素
- parent() 返回父元素
- prev(exp) 返回當前元素的上一個兄弟元素
- prevAll() 返回當前元素前面所有的兄弟元素
- prevUnit(exp) 返回當前元素到指定匹配的元素為止的前面元素
- siblings(exp) 返回所有兄弟元素
- add() 把add匹配的選擇器的元素新增到當前jquery物件中
六、jQuery的屬性操作
- html() 它可以設定和獲取起始標籤和結束標籤中的內容,跟dom屬性innerHTML一樣。
- text() 它可以設定和獲取起始標籤和結束標籤中的文字,跟dom屬性innerText一樣。
- val() 它可以設定和獲取表單項的value屬性值,跟dom屬性value一樣
- attr() 可以設定和獲取屬性的值,不推薦操作checked、readOnly、selected、disabled等等,attr()方法還可以操作非標準的屬性,比如自定義屬性。
- prop() 可以設定和獲取屬性的值,只推薦操作checked、readOnly、selected、disabled等等
template:
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
//全選
$("#checkedAllBtn").click(function() {
$(":checkbox").prop("checked", true);
});
//全不選
$("#checkedNoBtn").click(function () {
$(":checkbox").prop("checked", false);
});
//反選
$("#checkedRevBtn").click(function(){
$(":checkbox[name='items']").each(function(){
this.checked = !this.checked;
});
// 檢查是否滿選
var allCount = $(":checkbox[name='items']").length;
var checkedCount = $(":checkbox[name='items']:checked").length;
// if(allCount == checkedCount){
// $("#checkedAllBox").prop("checked",true);
// } else {
// $("#checkedAllBox").prop("checked",false);
// }
$("#checkedAllBox").prop("checked", allCount == checkedCount);
});
//提交
$("#sendBtn").click(function(){
$(":checkbox[name='items']:checked").each(function(){
alert(this.value);
})
});
//全選、全不選複選框
$("#checkedAllBox").click(function(){
$(":checkbox[name='items']").prop("checked",this.checked);
});
$(":checkbox[name='items']").click(function(){
var allCount = $(":checkbox[name='items']").length;
var checkedCount = $(":checkbox[name='items']:checked").length;
$("#checkedAllBox").prop("checked", allCount == checkedCount);
});
});
</script>
</head>
<body>
<form method="post" action=""> 你愛好的運動是?
<input type="checkbox" id="checkedAllBox" >全選/全不選<br>
<input type="checkbox" name="items" value="足球">足球
<input type="checkbox" name="items" value="籃球">籃球
<input type="checkbox" name="items" value="羽毛球">羽毛球
<input type="checkbox" name="items" value="乒乓球">乒乓球<br>
<input type="button" id="checkedAllBtn" value="全 選">
<input type="button" id="checkedNoBtn" value="全不選">
<input type="button" id="checkedRevBtn" value="反 選">
<input type="button" id="sendBtn" value="提 交">
</form>
</body>
</html>
七、DOM的增刪改
- 內部插入:
- appendTo() a.appendTo(b) 把a插入到b子元素末尾,成為最後一個子元素
- prependTo() a.prependTo(b) 把a插到b所有子元素前面,成為第一個子元素
- 外部插入:
- insertAfter() a.insertAfter(b) 得到ba
- insertBefore() a.insertBefore(b) 得到ab
- 替換:
- replaceWith() a.replaceWith(b) 用b替換掉a
- replaceAll() a.replaceAll(b) 用a替換掉所有b
- 刪除:
- remove() a.remove(); 刪除a標籤
- empty() a.empty(); 清空a標籤裡的內容
template:
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
select {
width: 100px;
height: 140px;
}
div {
width: 130px;
float: left;
text-align: center;
}
</style>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
//第一個按鈕【選中新增到右邊】
$("button:eq(0)").click(function(){
$("select:eq(0) option:selected").appendTo($("select:eq(1)"));
});
//第二個按鈕【全部新增到右邊】
$("button:eq(1)").click(function () {
$("select:eq(0) option").appendTo($("select:eq(1)"));
});
//第三個按鈕【選中刪除到左邊】
$("button:eq(2)").click(function(){
$("select:eq(1) option:selected").appendTo($("select:eq(0)"));
});
//第四個按鈕【全部刪除到左邊】
$("button:eq(3)").click(function () {
$("select:eq(1) option").appendTo($("select:eq(0)"));
});
});
</script>
</head>
<body>
<div id="left">
<select multiple="multiple" name="sel01">
<option value="opt01">選項 1</option>
<option value="opt02">選項 2</option>
<option value="opt03">選項 3</option>
<option value="opt04">選項 4</option>
<option value="opt05">選項 5</option>
<option value="opt06">選項 6</option>
<option value="opt07">選項 7</option>
<option value="opt08">選項 8</option>
</select>
<button>選中新增到右邊</button>
<button>全部新增到右邊</button>
</div>
<div id="rigth">
<select multiple="multiple" name="sel02"> </select>
<button>選中刪除到左邊</button>
<button>全部刪除到左邊</button>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
var deleFun = function(){
var $trObj = $(this).parent().parent();
var name = $trObj.find("td:first").text();
if (confirm("確定刪除[" + name + "]嗎?")) {
$trObj.remove();
}
return false;
}
$("#addEmpButton").click(function(){
var name = $("#empName").val();
var email = $("#email").val();
var salary = $("#salary").val();
var $trObj = $(
"<tr>"+
"<td>" + name + "</td>"+
"<td>" + email + "</td>"+
"<td>" + salary + "</td>"+
"<td><a href=\"deleteEmp?id=001\">Delete</a></td>"+
"</tr>"
);
$trObj.appendTo($("#employeeTable"));
$trObj.find("a").click(deleFun);
});
$("a").click(deleFun);
});
</script>
</head>
<body>
<table id="employeeTable">
<tr>
<th>Name</th>
<th>Email</th>
<th>Salary</th>
<th> </th>
</tr>
<tr>
<td>Tom</td>
<td>[email protected]</td>
<td>5000</td>
<td><a href="deleteEmp?id=001">Delete</a></td>
</tr>
<tr>
<td>Jerry</td>
<td>[email protected]</td>
<td>8000</td>
<td><a href="deleteEmp?id=002">Delete</a></td>
</tr>
<tr>
<td>Bob</td>
<td>[email protected]</td>
<td>10000</td>
<td><a href="deleteEmp?id=003">Delete</a></td>
</tr>
</table>
<div id="formDiv">
<h4>新增新員工</h4>
<table>
<tr>
<td class="word">name: </td>
<td class="inp"><input type="text" name="empName" id="empName"></td>
</tr>
<tr>
<td class="word">email: </td>
<td class="inp"> <input type="text" name="email" id="email"> </td>
</tr>
<tr>
<td class="word">salary: </td>
<td class="inp"> <input type="text" name="salary" id="salary" /> </td>
</tr>
<tr>
<td colspan="2" align="center"> <button id="addEmpButton" value="abc"> Submit </button> </td>
</tr>
</table>
</div>
</body>
</html>
八、CSS樣式操作
- addClass() 新增樣式
- removeClass() 刪除樣式
- toggleClass() 有就刪除,沒有就新增樣式。
- offset() 獲取和設定元素的座標。
九、jQuery動畫
- 基本動畫
- show() 將隱藏的元素顯示
- hide() 將可見的元素隱藏。
- toggle() 可見就隱藏,不可見就顯示。
- 淡入淡出動畫
- fadeIn() 淡入(慢慢可見)
- fadeOut() 淡出(慢慢消失)
- fadeTo() 在指定時長內慢慢的將透明度修改到指定的值。0 透明,1 完成可見,0.5 半透明
- fadeToggle() 淡入/淡出 切換
基本動畫方法都可以新增引數。第一個引數是動畫 執行的時長,以毫秒為單位;第二個引數是動畫的回撥函式 (動畫完成後自動呼叫的函式);
十、jQuery事件操作
10.1、$( function(){} );和window.onload = function(){}的區別
- $(function(){});
- jQuery的頁面載入完成之後是瀏覽器的核心解析完頁面的標籤建立好DOM物件之後就會馬上執行。
- window.onload = function(){}
- 原生js的頁面載入完成之後,除了要等瀏覽器核心解析完標籤建立好DOM物件,還要等標籤顯示時需要的內容載入完成。
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
window.onload = function(){
alert("原生js的頁面載入完成之後");
}
window.onload = function(){
alert("原生js的頁面載入完成之後");
}
window.onload = function(){
alert("原生js的頁面載入完成之後");
}
$(function(){
alert("jQuery的頁面載入完成之後");
});
$(function(){
alert("jQuery的頁面載入完成之後");
});
$(function(){
alert("jQuery的頁面載入完成之後");
});
</script>
</head>
<body>
<button>我是按鈕</button>
<iframe src="https://www.bilibili.com/" frameborder="0"></iframe>
</body>
</html>
jQuery頁面載入完成之後先執行,在執行原生js的頁面載入完成之後。jQuery的頁面載入完成之後是瀏覽器的核心解析完頁面的標籤建立好DOM物件之後馬上執行。原生js的頁面載入完成之後,除了要等瀏覽器核心解析完標籤建立好DOM物件,還要等標籤顯示是需要的內容載入完成。
原生js的頁面載入完成之後,只會執行最後一次的賦值函式。jQuery的頁面載入完成之後是全部把註冊的function函式,依次順序全部執行。
10.2、jQuery中其他的事件處理方法:
- click() 它可以繫結單擊事件,以及觸發單擊事件
- mouseover() 滑鼠移入事件
- mouseout() 滑鼠移出事件
- bind() 可以給元素一次性繫結一個或多個事件。
- one() 使用上跟 bind 一樣。但是one方法繫結的事件只會響應一次。
- unbind() 跟 bind 方法相反的操作,解除事件的繫結
- live() 也是用來繫結事件。它可以用來繫結選擇器匹配的所有元素的事件。哪怕這個元素是後面動態創建出來的也有效
10.3、事件的冒泡
事件的冒泡是指,父子元素同時監聽同一個事件。當觸發子元素的事件的時候,同一個事件也被傳遞到了父元素的事件裡去響應。在子元素事件函式體內,return false;可以阻止事件的冒泡傳遞。
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
body {
font-size: 13px;
line-height: 130%;
padding: 60px;
}
#content {
width: 220px;
border: 1px solid #0050D0;
background: #96E555;
}
span {
width: 200px;
margin: 10px;
background: #666666;
cursor: pointer;
color: white;
display: block;
}
p {
width: 200px;
background: #888;
color: white;
height: 16px;
}
</style>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
$("#content").click(function(){
alert("我是div");
});
$("span").click(function(){
alert("我是span");
return false;
});
});
</script>
</head>
<body>
<div id="content">
外層div元素
<span>內層span元素</span>
外層div元素
</div>
<div id="msg"></div>
<br><br>
<a href="http://www.hao123.com" onclick="return false;">WWW.HAO123.COM</a>
</body>
</html>
10.4、javaScript事件物件
事件物件,是封裝有觸發的事件資訊的一個javascript物件。如何獲取呢javascript事件物件呢?在給元素繫結事件的時候,在事件的function(event)引數列表中新增一個引數,這個引數名,我們習慣取名為event。這個event就是javascript傳遞參事件處理函式的事件物件。
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
#areaDiv {
border: 1px solid black;
width: 300px;
height: 50px;
margin-bottom: 10px;
}
#showMsg {
border: 1px solid black;
width: 300px;
height: 20px;
}
</style>
<script type="text/javascript" src="./library/jquery-1.7.2.js"></script>
<script type="text/javascript">
//1.原生JavaScript獲取事件物件
window.onload = function(){
document.getElementById("areaDiv").onclick = function(event){
console.log(event);
}
}
//2.jQuery程式碼獲取事件物件
$(function () {
$("#areaDiv").click(function(event){
console.log(event);
});
//使用bind同時對多個事件繫結同一個函式。怎麼獲取當前操作是什麼事件。
$("#areaDiv").bind("mouseover mouseout",function(event){
if(event.type == "mouseover"){
console.log("滑鼠移入");
} else if (event.type == "mouseout"){
console.log("滑鼠移出");
}
});
});
</script>
</head>
<body>
<div id="areaDiv"></div>
<div id="showMsg"></div>
<div id="showMsg2"></div>
</body>
</html>