close

需要上課的人員:

題目1:

HTML的DOM如下

下方的空格應填入什麼值才能取得上方的DOM。

用id取得DOM→$("   "),用class取得DOM→$("   ")

答案:用id取得DOM→$("#geren"),用class取得DOM→$(".selected")(答案已反白)

題目2:

假設有一個CSS Selector如下:

div#meanList > div

請試著寫出對應的DOM架構。

答案:<div id="meanList"> <div></div> </div>(答案已反白)

javascript與jQuery

Javascript是一種在前端(使用者端)執行的一種程式語言,而主要負責編譯與執行的工具,則是瀏灠器;不過瀏灠器有各個廠商在開發,例如:Chrom、Firefox、IE等,因為是由各個廠商開發自行開發,所以很有可能會發生「相同的javascript會有不同的結果」(實際真的發生過);所以開發人員在寫javascript時,必須先判斷目前使用者的瀏灠器為何,才能針對該瀏灠器撰寫對應的語法。

因為這個問題困擾了太多寫javascript的開發人員了,所以有善心人士開發了一套framework,讓它來對應各種瀏灠器版本,而開發人員則可以專心在程式的邏輯上,而這套語法,就是jQuery。

所以jQuery就是站在javascript的基礎上發展的一套framework。

CSS Selector

不管是javascript或是jQuery,重點都是在處理前端元素的DOM(Document Object Model,也可以理節為XML的節點),而HTML的DOM這麼多,要如何告訴程式去操控那一個DOM,就變得需要有點技巧。

jQuery使用了CSS Selector的方式來讓使用者指定要執行的DOM,所以在瞭解jQuery之前,必須先瞭解CSS Selector。

CSS Selector主要類別

CSS Selector簡單可以區分為三大類,分別為

  • HTML標籤

即是<body>,<div>這一類的標籤,在CSS Selector中是直接宣告即可選擇,範例:$("div"),回傳結果為DOM陣列。

  • class類

HTML中有屬性class的DOM,也可透過直接宣告的方式取得,不過宣告的前方必須帶「.」,範例:$(".myclass"),回傳結果為DOM陣列。

  • id類

HTML中有屬性id的DOM,也可透過直接宣告的方式取得,不過宣告的前方必須帶「#」,範例:$("#myid");這邊有一點要注意的,通常id在整頁HTML中是唯一值,所以在CSS Selector選擇後的回傳結果為單一的DOM,而非陣列;如果在HTML中有二個以上有相同id的DOM,則只會取最先抓到的DOM回傳

CSS Selector輔助類別

CSS除了主要類別外,還有一些輔助的功能,而這些輔助類別大多是符號或是符號開頭,簡單說明如下:

  • ,(逗號)

為「OR」的意思,例如$("body,.selected"),這個CSS Selector會回傳body與class為selected的DOM。

  • (無)

為「AND」的意思,例如:$(".selectd.myclass"),注意中間並無空格,此時會回傳包含class屬性有selected與myclass的DOM。

  • >(大於)

這個是「兒子」的意思,這個符號後方需要再接一個CSS Selector,例如:$(".selected > li"),回傳的DOM為li的DOM,要注意,是兒子的li,且它的父親必需有class屬性且包含selected。

  • [](中括號)

這個部份指的是屬性的意思,代表這個DOM需要有某個屬性,例如:$("input[name]"),則回傳的DOM為input的HTML標籤並含有name的屬性。

  • =(等於)

這個符號是用在[]裡面的,指的是這個屬性必需等於某一個值,例如:$("input[type=hidden]"),所以回傳的DOM為HTML的input標籤,並且type屬性為hidden的DOM。

  • *=(近似於)

這個符號跟=很接近,不過它多了一個*符號,所以它會查詢對應的屬性值,如果DOM的值包含我們宣告的值,那麼這個DOM就會被回傳;例如有DOM如下:

<input type="hidden" id="test1" value="test1" />

<input type="hidden" id="test2" value="test2" />

<input type="hidden" id="test3" value="test3" />

則可以利用$("input[id*=test]")來取得所有的

  • :(冒號)

:的用法比較特別,:後面必須要接關鍵字,例如::has、:nth-child等,因為可以接的東西不少,這邊只介紹比較常用的數種。

  • :has(CSS selector)

用來取出包含特定CSS Selector的DOM,例如:$("a:has(>img)"),回傳img標籤的DOM,並且其父親為a的標籤。

  • :not(CSS select)

與:has用法相同,不過回傳為不包含特定CSS Selector的DOM。

  • :nth-child(n)

回傳第n個child的DOM,例如:$("li:nth-child(2)")回傳第二個li的DOM。

  • :chekced

回傳包含checked屬性的DOM,通常用在取得使用者選擇的radio或checkbox上,例如:$("input:checked")。

  • 還有:first-child,:last-child,:selected等,有非常多這種:的CSS Selector可以使用,有請大自行Google。

常用的jQuery語法

簡單介紹完CSS Selector後,接下來我們就可以來看jQuery了。jQuery基本上也是javascript,所以在使用jQuery,必須先告知瀏灠器,這個網頁要使用jQuery,要如何告知呢?就是把jQuery官網上所提供的jQuery的JS檔import到網頁上,如下圖:

import完後,在這個網頁上即可使用jQuery的語法了,我們來介紹常用的jQuery語法。

val

取得或設定input的value。這個語法只能套用在input、sleect、textarea的DOM上,而根據有沒有帶參數,來決定要取得或是設定範例:

$("input[name=username]").val()→回傳這個input的值。

$("input[name=username]").val('myname') →設定這個input的值,並回傳DOM。

attr

取得或設定DOM屬性。根據傳入參數的數量,決定要取得或設定屬性,例如:

$("img").attr("src")→回傳img的src屬性內容。

$("img").attr("src","abc.jpg")→設定img的src屬性,並回傳DOM。


 

removeAttr

移除DOM的屬性,並回傳DOM。例如:$("a").removeAttr("target")。

css

取得或設定DOM的style。根據傳入參數的數量,決定要取得或設定,例如:
$("img").css('display')→回傳DOM中的style屬性內,display的值。
$("img").css('display','none')→設定DOM中的style屬性內,display的值,並回傳DOM。

 

addClass、removeClass、hasClass

操控DOM中class屬性的內容;因為一個DOM中可以有多個class,所以如果利用attr('class')這種方式設定的話,會將所有class屬性的值一次全部替換掉,所以需要利用addClass、removeClass的方式來實作,才不會影響class屬性中已存在的其他值。而hasClass則是用來判斷這個DOM中的class屬性是否有包含對應的值。範例:

$("img").addClass("myClass")→新增myClass的值至DOM的class屬性,並回傳DOM。

$("img").removeClass("myClass")→從DOM中的class屬性移除myClass的值,並回傳DOM。

$("img").hasClass("myClass")→判斷DOM中是否的class屬性是否包含myClass的值,回傳boolean值。

each

針對陣列的內容做操控,另一種迴圈的處理。有二種用法:

範例一:

$( "li" ).each(function( index ) {

console.log( index + ": " + $( this ).text() );

});

範例二:

$.each($("li"), function( index ) {

console.log( index + ": " + $( this ).text() );

});

data

data這個功能是HTML5才有的,主要是讓HTML中的DOM可以有自訂的內容;例如在一堆相似的DOM中,我們想要知道使用者指令的是那一筆資料,通常會在這個DOM中夾帶一些參數,讓我們程式有個依據,可以進行判斷。不過HTML的標籤是公訂的,所以自訂的標籤其實會在IDE(例如:Eclipse)中被判斷為不合法的,會被標示出來;為了讓使用者可以更廣泛在DOM中夾帶客制化的資料,所以發展了data這個屬性,用法如下:

<input type="text" data-mydata="forUserEmail" />

其中data-後方帶的內容為任意值,而資料也是開發人員自訂。

jQuery也幫data做了一個可以快速存取的方法,就是data,用法如下:

$("input").data("mydata")→回傳這個DOM的data-mydat屬性的值。

$("input").data("mydata","forUserEmail")→設定這個DOM的data-mydata的屬性,並回傳DOM。

ajax

jQuery將AJAX簡化為一個function,並接任對應的屬性,詳細可參考jQuery官網的AJAX說明

jQuery chain

看了上方的常用jQuery後,可能會有一個疑問,那就是:為什麼它要回傳DOM回來呢?其實是為了簡化程式。假設我們想要針對一個DOM操控二個動作,分別是設定css與設定attr,那麼正式的寫法要分成二段:
$("input").css('display','none');
$("input").attr("type","hidden");
不過因為第一行的程式回傳值即為$("input"),所以其實這二段寫法可以簡法為一段,變成:
$("input").css('display','none').attr("type","hidden");
變成像是chain(鏈)一樣。因為這樣的寫法可以節省很多程式碼,所以常常被使用,下方為一段較長的jQuery chain範例:

cloneVar.find('#replyFakeSubmit')
.attr("id", "replyFakeSubmit" + data.id)
.data("sentimentsId", data.id)
.click(function() {
var datas = {
"sentiments.id" : $(this).data("sentimentsId"),
"sentiment.message" : $("#replyMessage" + $(this).data("sentimentsId")).val()
};
ajaxPostSentiments(datas, true);
});

 

arrow
arrow
    創作者介紹
    創作者 JAVA Programmer 的頭像
    JAVA Programmer

    台灣的Web工程師

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()