想要在網路上學習jQuery,可是資料都很零散,這裡我就順便整理我的學習筆記。
JQ基礎參考網址:http://goo.gl/ErgYc
JQ AJAX參考網址:https://goo.gl/f8qf3N
JQuery 學習筆記
(1). 替所有的圖片設定 src、title 及 alt 屬性 .attr()
(2). 移除所有連結的 title .removeAttr()
(3). Way3 .append() .prepend() .before() .after()
3. 縮放效果 . slideDown() . slideUp()
1. . load(url, [data], [callback])
(3). Ex3: 用load()傳接值給php (較少使用,多用post&get)
(1). Ex: 同以上$.get() 加上 error事件
2. .ajaxStart() & .ajaxStop 放loading圖
4. .serialize() 快速取得ajax傳送的data
一、 JQuery基本
教學網站網址:http://webdesign.kerthis.com/jquery/
1. 一些符號
$符號:要取得 jQuery 物件可以透過它提供的的一個縮寫符號 (別名)-錢字號「$」。而 jQuery(elements);
就等於$(elements); 。
DOM:例如html DOM是指html的tag, ex: div, input 這種。
2. 點擊改變CSS
$("#demo").click(function(){
$("#demo").css("background-color","gray");
});
3. 可以連續地使用函數 (Chaining)
以下我們用一個範例來說明 Chaining 是怎麼一回事:
$("#container").css("color", "blue").css("background-color", "red");
4. 取得selector語法
(1). tag selector
jQuery 中:$("a"); // 取得頁面中所有的<a>標籤元素
JS DOM 中:document.getElementsByTagName("a");
CSS 中:a {}
(2). id selector
jQuery 中:$("#container"); // 取得id為container的元素
JS DOM 中:document.getElementById("container");
CSS 中:#container {}
(3). class selector
jQuery 中:$(".content"); // 取得class name為content的所有元素
JS DOM 中:document.getElementsByClassName("content");
CSS 中:.content {}
(4). 仿CSS使用於JQ
jQuery 中 $('#container a'); // 取得id為container之元素其內部的所有連結
CSS 中 #container a {}
jQuery 中 $("div > p"); // 取得div父元素其下所有的p子元素
CSS 中 div > p {}
jQuery 中 $("tr:first"); // 取得第一個找到的tr標籤元素
CSS 中 tr:first {}
jQuery 中 $("input[name='newsletter']"); // 取得其name屬性值為newsletter的input元素
CSS 中 input[name='newsletter'] {}
二、 JQuery函數
1. 選取到幾個<a>?
$('a').length;
$('a').size();
2. 要在JQ裡面寫CSS
(1). JQ設定CSS .css()
替所有段落的字體設為紅色,背景設為藍色
$("p").css({color:"red","background-color":"blue"});
//若屬性中包含「-」,記得加上引號,沒有的話則可有可無。
(2). jQuery 物件 → HTML DOM 元素
$("#container").get(0).style.display = "none";
$("#container").get().style.display = "none";
$("#container")[0] .style.display = "none";
//三這相等
(3). DOM 物件 → jQuery 物件
jQuery(elements);
或
$(elements);
3. 用JQ來設定tag屬性
(1). 替所有的圖片設定 src、title 及 alt 屬性 .attr()
$("img").attr({
src: "logo.gif",
title: "jQuery",
alt: "jQuery Logo" });
(2). 移除所有連結的 title .removeAttr()
$("a").removeAttr("title");
(3). 增加 class .addClass()
例. 幫所有的段落加入 selected 和 highlight 類別:
$("p").addClass("selected highlight");
(4). 移除 class .removeClass()
例. 移除 id 為 wrapper 的元素其 blue 這個類別:
$("#wrapper").removeClass("blue");
4. JQ取值 & 塞值
(1). Way1 .val()
取值:$(selectors).val();
給值:$(selectors).val(val);
Ex:
/* jQuery codes */ $("input").val("Hello World!");
/* 設定後的 HTML */ <input type="text" value="Hello World!" />
(2). Way2 .html()
取得匹配元素的HTML內容 - 無參數:$(selectors).html();
設定匹配元素的HTML內容 - 有參數:$(selectors).html(val);
EX:
/* HTML */ <div></div>
/* jQuery codes */ $("div").html("<p>Hello World</p>");
/* 得到的結果 */ [<div><p>Hello World</p></div>]
(3). Way3 .append() .prepend() .before() .after()
- .append() 內部最後面加入
Ex:
/* HTML */ <p>I would like to say: </p>
/* jQuery codes */ $("p").append("<b>Hello</b>");
/* 得到的結果 */ [<p>I would like to say: <b>Hello</b></p>]
- .prepend() 內部最前面加入
Ex:
/* HTML */ <p>I would like to say: </p>
/* jQuery codes */ $("p").prepend("<b>Hello</b>");
/* 得到的結果 */ [<p><b>Hello</b>I would like to say: </p>]
- .before() 匹配的元素前面加入
Ex:
/* HTML */ <p>I would like to say: </p>
/* jQuery codes */ $("p").before("<b>Hello</b>");
/* 得到的結果 */ [<b>Hello</b><p>I would like to say: </p>]
- .after() 匹配的元素後面加入
Ex:
/* HTML */ <p>I would like to say: </p>
/* jQuery codes */ $("p").after("<b>Hello</b>");
/* 得到的結果 */ [<p>I would like to say: </p><b>Hello</b>]
5. JQ設定元素寬高 .height()
$("p").height(); //取得第一個段落的高度
$("p").height(20); //將所有段落的高度設作20px
6. 取得第n個元素 (n從0開始) .eq()
取得匹配的第3個元素
$("p").eq(2);
7. 取得類別下的所有元素 . filter()
filter(expr) (可用逗號「,」分開多個 expr)
取得類別為highlight的所有段落元素
$("p").filter(".highlight");
8. JQ查訪元素 .find()
例如我們想取得段落下的span元素:
/* HTML */ <p><span>Hello</span> World</p>
/* jQuery codes */ $("p").find("span");
/* 得到的結果 */ [<span>Hello</span>]
9. 取得html的純文字內容 .text()
取得文字:$(selectors).text();
塞入文字:$(selectors).text(val);
/* HTML */ <p><em>Test1.</em>Test12.</p><p>Test3</p>
/* jQuery codes */ $("p").text();
/* 得到的結果 */ Test1.Test2.Test3
10. 刪除元素 .empty()
empty() - 刪除匹配到的元素其所有子節點
/* HTML */ <p>Hello, <span>Person</span> <a href="#">and person</a></p>
/* jQuery codes */ $("p").empty();
/* 得到的結果 */ [<p></p>]
11. 複製元素 .clone()
/* HTML */ <b>Hello</b><p>, how are you?</p>
/* jQuery codes */ $("b").clone().prependTo("p");
/* 得到的結果 */ [<b>Hello</b><p><b>Hello</b>, how are you?</p>]
三、 事件處理
1. JQ Events 事件處理
帶有參數:
$("p").click(function() {
$(this).css("background-color","blue"); //「this」為被觸發的「DOM元素」
});
不帶有參數:
$("p").click();
l jQuery 事件函式
事件 |
觸發條件 |
(on) blur |
物件失去焦點時 |
(on) change |
物件內容改變時 |
(on) click |
滑鼠點擊物件時 |
(on) dblclick |
滑鼠連點二下物件時 |
(on) error |
當圖片或文件下載產生錯誤時 |
(on) focus |
當物件被點擊或取得焦點時 |
(on) keydown |
按下鍵盤按鍵時 |
(on) keypress |
按下並放開鍵盤按鍵後 |
(on) onkeyup |
按下並放開鍵盤按鍵時 |
(on) onload |
網頁或圖片完成下載時 |
(on) mousedown |
按下滑鼠按鍵時 |
(on) mousemove |
介於over跟out間的滑鼠移動行為 |
(on) mouseout |
滑鼠離開某物件四周時 |
(on) mouseover |
滑鼠離開某物件四周時 |
(on) mouseup |
放開滑鼠按鍵時 |
(on) resize |
當視窗或框架大小被改變時 |
(on) scroll |
當捲軸被拉動時 |
(on) select |
當文字被選取時 |
(on) submit |
當按下送出按紐時 |
(on) unload |
當使用者關閉網頁時 |
2. 常用事件 .ready() .load()
- .ready(function(){})
ready event是等HTML DOM準備好就可以開始執行程式,不像一般常用的window.onload要連圖片、外部檔案等全部都下載完畢才會觸發onload事件。
$(document).ready(function() { //執行程式 }); 相等於 $(function() { //執行程式 });
- .load(function(){})
在頁面初始階段改變 CSS 屬性,這問題我們可以利用 load 事件來避開,以確定事件的觸發會在外部樣式表下載完畢之後。
$(element).load(function() { //執行程式 });
3. jQuery一般性的事件函式 (參考)
- hover(fn1, fn2)
hover = mouseover + mouseout。當滑鼠移動到一個匹配的元素上面時,會觸發第一個函數 (fn1);當滑鼠移出該元素時,會觸發第二個函數 (fn2)。
- toggle(fn1, fn2, [fn3,fn4,...])
綁定元素每當觸發「click 事件」時輪流切換執行函數。如點第 1 次執行fn1;點第 2 次執行 fn2····。
- bind(eventType, fn)、unbind(eventType)
事件的綁定與移除。bind 及 unbind 還可以讓我們達到自訂事件處理的功能:
$('#sth').bind('myEvent', doSomething);
如上,我們自訂一個叫作 myEvent 的事件,但這不是 DOM 標準事件啊,怎麼觸發它?答案是用接著會談到的「trigger」函式來觸發 myEvent。
- trigger(eventType, [data])
觸發事件,其中 data 為要傳給事件處理函式的參數 (一個陣列)。
- one(eventType, [data], fn)
如果只是觸發「一次」事件,就使用 one 函式來作 bind 的動作,當該事件被觸發一次之後就會自己自動 unbind。
四、 動畫效果
1. 顯示出隱藏的元素 . show()
show()
/* HTML */ <p style="display: none">Hello</p>
/* jQuery */ $("p").show();
show(speed,[callback]) - 多了動畫效果,且可在開關完畢後執行一函式
/* HTML */ <p style="display: none">Hello</p>
/* jQuery */ $("p").show(5000);
函式說明:
參數 |
型別 |
說明 |
speed |
String,Number |
三種預定的速度("slow", "normal", "fast"),或 |
callback |
Function |
每個元素在完成動畫後要執行的函數 |
Ex:
<input type="button" value="按我看效果" onclick="$('#test2').show(5000);" />
<div id="test2" style="background-color:#FFC;display:none">這是特效 Demo<br />這是特效 Demo<br />這是特效 Demo</div>
2. 隱藏顯示的元素 . hide()
hide()、hide(speed,[callback])
相對於 show 函式,用法一樣。
3. 縮放效果 . slideDown() . slideUp()
展開:slideDown(speed,[callback])
縮起:slideUp(speed,[callback])
Ex:
<input type="button" value="展開來" onclick="$('#test2').slideDown(5000);" />
<input type="button" value="縮起來" onclick="$('#test2').slideUp(5000);" />
<div id="test2" style="background-color:#FFC;display:none">這是特效 Demo<br />這是特效 Demo<br />這是特效 Demo</div>
4. 淡入淡出 .fadeIn()
淡入:fadeIn( (speed,[callback])
淡出:fadeOut (speed,[callback])
參數同 show。
Ex:
<input type="button" value="淡入" onclick="$('#test3').fadeIn(5000);" />
<input type="button" value="淡出" onclick="$('#test3').fadeOut(5000);" />
<div id="test3" style="background-color:#FFC;display:none">這是特效 Demo<br />這是特效 Demo<br />這是特效 Demo</div>
5. 調整元素透明度 . fadeTo()
/* HTML */ <p style="display: none">Hello</p>
/* jQuery */ $("p").fadeTo("slow", 0.33); // opacity(Number):不透明度值0~1
6. 自己設定動畫 . animate()
animate 這個函式可以讓你自行定義動態效果
animate只支援「可數字化」的屬性,如height、width、left、top、opacity等。
Ex:
<input id="go" type="button" value="按我看效果" />
<div id="block" style="background-color:#bca;width:100px;border:1px solid green">Hello!</div>
<script>
$("#go").click(function () {
$("#block").animate({
width: "70%",
opacity: 0.4,
marginLeft: "0.6in",
fontSize: "3em",
borderWidth: "10px"
}, 1500);
});
</script>
點擊改變 ->
可以在屬性值前面指定「+=」或「-=」來做相對運動。
$("#go").click(function(){
$(".block").animate({left: '+=100px'}, 2000);
});
五、JQuery ajax 基礎
教學影片網址:https://www.youtube.com/watch?v=0J_z5KBizGE
Ajax可以即時與用戶互動,例如用戶註冊帳戶時確認帳號是否重複,
並且可以用最少的需求去詢問server,不造成server負擔。
1. . load(url, [data], [callback])
此函式預設是以 GET 的方式來發送請求,但是如果有設參數 data 則會自動轉為 POST
參數說明:
url |
要資料的來源 |
Data |
送值:向server發送資料(存值) |
callback |
接值:資料回來後會做的function |
(1). Ex1: 用load()導入txt
<input type="button" value="讀入資料" />
<div class="myID"></div>
<script>
$("input[type=button]").click(function(){
$(".myID").load("test.txt");
});
</script>
補充:
IE緩存比較嚴重,防止txt修改後IE資料還是沒變,可改為以下語法
$(".myID").load('test.txt?date=' + Math.random());
(2). Ex2: 用load()導入別的html
<input type="button" value="讀入資料" />
<div class="myID"></div>
<script>
$("input[type=button]").click(function(){
$(".myID").load('test.html #myID2'); //指定我要讀入此html檔裡的某selector
});
</script>
-> 結果
(3). Ex3: 用load()傳接值給php (較少使用,多用post&get)
ajax傳前端值給php後端檢測帳號是否可以註冊,php再回傳驗證結果
<input type="text" name="username" id="username" />
<input type="button" value="上傳資料">
<script>
$('input[type=button]').click(function(){
//發送的參數格式必須是json格式
var send = {'username':$('username').val()}
$('div').load('process.php',send,function(data)){
//用send送值, function(data)接住此php(server)返回的值
alert(data);
}
})
</script>
or
結果:
or
2. $.get() & $.post()
$.get(url, [data], [callback], [type])
$.post(url, [data], [callback], [type])
POST和GET相同,只是傳送資料的實際方式不同,不過使用參數皆相同。
參數說明:
參數 |
型別 |
說明 |
url |
String |
指定要進行呼叫的位址 |
data |
Map |
送值:要傳給server的Key/value值對 |
callback |
Callback |
接值:Ajax 請求完成時(必需是success)呼叫的callback |
type |
String |
返回的資料類型 |
(1). Ex1: 取txt內容放入html
<input type="button" value="載入資料" />
<div class="myID"></div>
<script>
$('input[type=button]').click(function(){
$.get('test.txt?data='+Math.random(),function(data){ //?data~random是防止瀏覽器緩存
$('myID').html(data);
})
})
</script>
(2). Ex2: 傳接php值
傳送值必須為以下格式
$.get("test.php", { name: "John", time: "2pm" } );
<input type="text" name="username" id="username">
<input type="button" value="載入資料" />
<div class="myID"></div>
<script>
$('input[type=button]').click(function(){
var url = 'process.php';
var send = {'username':$('#username').val()}; // send傳送username給php後端
$.get(url , send , function(data){
if(data=='true'){
$('div').html('帳號可以使用');
}
else{
$('div').html('帳號不能是admin');
}
})
})
</script>
結果
3. $.ajax() 可直接用此速度最快
其實以上post & get都只是$.ajax的縮寫,不過若想在出錯時 (error) 能執行一些函式,那你得使用 $.ajax。
(1). Ex: 同以上$.get() 加上 error事件
<input type="text" name="username" id="username">
<input type="button" value="載入資料" />
<div class="myID"></div>
<script>
$('input[type=button]').click(function(){
var url = 'process,php';
var send = {'username':$('#username').val()};
$.ajax({
url: url,
type: 'get', //預設是get, 所以get可考慮不寫
data: send,
success: function(data){
if(data=='true'){
$('div').html('帳號可以使用');
}
else{
$('div').html('帳號不能是admin');
}
},
error: function(data, textStatus) {
alert("Error");
alert(data.statusText);
}
})
})
</script>
l ajax詳細參數選項 (Options)
參數名稱 |
型別 |
預設值 |
說明 |
async |
Boolean |
true |
是否同部請求 |
beforeSend |
Function |
- |
發送請求之前可在此修改XMLHttpRequest物件,如添加header等,你可以在此函式中return flase取消Ajax request。 |
cache |
Boolean |
true |
1.2版加入的新功能,設定成flase就不會從瀏覽器中抓cache住的舊資料。 |
complete |
Function |
- |
請求完成時執行的函式(不論結果是success或error)。 |
contentType |
String |
application/x-www-form-urlencoded |
傳送資料至Server的編碼類型 |
data |
Object, |
- |
傳送至Server的資料,會自動轉為query string的型式,如果是GET請求還會幫你附加到URL。可用processData選項禁止此自動轉換。物件型式則為一Key/Value pairs。 |
dataFilter |
Function |
- |
過濾Server回傳的資料。函式中第一個參數為資料,第二個則為dataType。 |
dataType |
String |
自動判斷 (xml or html) |
預期Server傳回的資料類型,如果沒指定,jQuery會根據HTTP MIME Type自動選擇以responseXML或responseText傳入你的success callback。可選的資料類型有: |
error |
Function |
- |
請求發生錯誤時執行函式。 |
global |
Boolean |
true |
設定是否觸發全域Ajax事件。 |
ifModified |
Boolean |
false |
由Last-Modified header判斷,僅在Server更新文件時才下載。 |
processData |
Boolean |
true |
設定是否自動將data轉為query string。 |
success |
Function |
- |
請求成功時執行函式。 |
url |
String |
目前URL |
指定要進行呼叫的位址 |
type |
String |
GET |
請求方式,POST/GET。 |
六、JQuery ajax 進階
1. eval() 用於取JSON格式 (非ajax函數)
eval可以解析字串(string)成為js函數
(1). Ex1: 取得JSON格式的資料
(2). Ex2: 取得JSON格式資料條列li出來
2. .ajaxStart() & .ajaxStop 放loading圖
當ajax讀取資料有點慢時,我想要在資料出來前放一個loading畫面
.ajaxStart(function(){ }):在AJAX 请求刚开始时执行一个处理函数。 这是一个 Ajax Event。
.ajaxStop(function(){ }):在AJAX 请求完成时执行一个处理函数。 这是一个 Ajax Event。
Loading圖可以去這裡下載:http://www.ajaxload.info/
Ex:
接續上面的程式,在php裡面放一個sleep(3);表示三秒後資料才出來,ajax如以下程式
結果
點擊 等待後
3. ajax中文亂碼問題
ajax寫在html檔案之中,而html格式為UTF-8,當讀取其他資料檔案時(.txt, .php…等)都必須要相同格式,若是讀取的資料不是與html格式相同,那ajax取出來的中文在網頁上就會呈現亂碼。
解決方式就是把讀取資料的檔案格式改為跟html相同的UTF-8格式。
4. .serialize() 快速取得ajax傳送的data
不用自己一個一個寫data,直接var data = S(‘#form’).serialize(); //教學測試得要用form才有效
接收到資料的後端php可以再決定要將資料做甚麼(可能存入資料庫之類的)。
5. .ajaxError(function(){ })
當ajax請求發生錯誤時,有兩種方式可以在頁面上報錯。
而當兩種都寫的時候,會以way 2為主,因為way 2是全域變數。
七、JQuery Class撰寫
我們自己寫jQuery class來用
Ex1:
Ex2: