jQuery學習筆記

想要在網路上學習jQuery,可是資料都很零散,這裡我就順便整理我的學習筆記。

JQ基礎參考網址:http://goo.gl/ErgYc

JQ AJAX參考網址:https://goo.gl/f8qf3N

JQuery 學習筆記

 

一、JQuery基本 

1. 一些符號 

2. 點擊改變CSS 

3. 可以連續地使用函數 (Chaining) 

4. 取得selector語法 

(1).   tag selector 

(2).   id selector 

(3).   class selector 

(4).   仿CSS使用於JQ 

二、JQuery函數 

1. 選取到幾個<a>? 

2. 要在JQ裡面寫CSS 

(1).   JQ設定CSS .css()  

(2).   jQuery 物件 → HTML DOM 元素 

(3).   DOM 物件 → jQuery 物件 

3. 用JQ來設定tag屬性 

(1).   替所有的圖片設定 src、title 及 alt 屬性 .attr()  

(2).   移除所有連結的 title .removeAttr()  

(3).   增加 class .addClass()  

(4).   移除 class .removeClass()  

4. JQ取值 & 塞值 

(1).   Way1 .val() 

(2).   Way2 .html() 

(3).   Way3 .append() .prepend() .before() .after() 

5. JQ設定元素寬高 .height() 

6. 取得第n個元素 (n從0開始) .eq() 

7. 取得類別下的所有元素 . filter() 

8. JQ查訪元素 .find()  

9. 取得html的純文字內容 .text()  

10.刪除元素 .empty()  

11.複製元素 .clone()  

三、事件處理 

1. JQ Events 事件處理 

    jQuery 事件函式 

2. 常用事件 .ready() .load() 

3. jQuery一般性的事件函式 (參考) 

四、動畫效果 

1. 顯示出隱藏的元素 . show()  

2. 隱藏顯示的元素 . hide()  

3. 縮放效果 . slideDown() . slideUp() 

4. 淡入淡出 .fadeIn() 

5. 調整元素透明度 . fadeTo()  

6. 自己設定動畫 . animate() 

五、    JQuery ajax 基礎 

1. . load(url, [data], [callback])  

(1).   Ex1: 用load()導入txt  

(2).   Ex2: 用load()導入別的html  

(3).   Ex3: 用load()傳接值給php (較少使用,多用post&get)  

2. $.get() & $.post()  

(1).   Ex1: 取txt內容放入html  

(2).   Ex2: 傳接php值 

3. $.ajax() 可直接用此速度最快 

(1).   Ex: 同以上$.get() 加上 error事件 

    ajax詳細參數選項 (Options)  

六、    JQuery ajax 進階 

1. eval() 用於取JSON格式 (非ajax函數)  

(1).   Ex1: 取得JSON格式的資料 

(2).   Ex2: 取得JSON格式資料條列li出來 

2. .ajaxStart() & .ajaxStop 放loading圖 

3. ajax中文亂碼問題 

4. .serialize() 快速取得ajax傳送的data 

5. .ajaxError(function(){ }) 

七、    JQuery Class撰寫 

 

一、 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"),或
動畫間隔的毫秒數值(如一秒、1000).

callback

Function

每個元素在完成動畫後要執行的函數
function callback() {this; //dom element}

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

返回的資料類型
"xml", "html", "script", "json", "jsonp", "text"

 

(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。
function (XMLHttpRequest) { this; // the options for this ajax request }

cache

Boolean

true
false (dataType "script")

1.2版加入的新功能,設定成flase就不會從瀏覽器中抓cache住的舊資料。

complete

Function

請求完成時執行的函式(不論結果是success或error)。
function (XMLHttpRequest, textStatus) { this; // the options for this ajax request }

contentType

String

application/x-www-form-urlencoded

傳送資料至Server的編碼類型

data

Object,
String

傳送至Server的資料,會自動轉為query string的型式,如果是GET請求還會幫你附加到URL。可用processData選項禁止此自動轉換。物件型式則為一Key/Value pairs。

dataFilter

Function

過濾Server回傳的資料。函式中第一個參數為資料,第二個則為dataType。
function (data, type) {  ......
return data;
}

dataType

String

自動判斷 (xml or html)

預期Server傳回的資料類型,如果沒指定,jQuery會根據HTTP MIME Type自動選擇以responseXML或responseText傳入你的success callback。可選的資料類型有:
xml:傳回可用jQuery處理的XML
html:傳回HTML,包含jQuery會自動幫你處理的script tags。
script:傳回可執行的JavaScript。(script不會被自動cache,除非cache設為true)
json:傳回JSON
jsonp:在URL加上?callback=?參數,並在Server端配合送回此jsonp callback。(JSONP?)
text:傳回純文字字串

error

Function

請求發生錯誤時執行函式。
function (XMLHttpRequest, textStatus, errorThrown) {
// 通常textStatus或errorThrown只有一個有值
this;// the options for this ajax request
}

global

Boolean

true

設定是否觸發全域Ajax事件。

ifModified

Boolean

false

由Last-Modified header判斷,僅在Server更新文件時才下載。

processData

Boolean

true

設定是否自動將data轉為query string。

success

Function

請求成功時執行函式。
function (data, textStatus) {
// data could be xmlDoc, jsonObj, html, text, etc... 
this; // the options for this ajax request 
}

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:

https://www.youtube.com/watch?v=8tuMOJwJBMQ