2010年9月1日 星期三

jQuery神奇的選擇器(Selector)

就像正規運 算式(Regular Expression)的Pattern match一般,jQuery使用了CSS(Cascading Style Sheet)、XPath(XML Path Language)與自訂等三大類的選擇器(Selector)當做$( )函數的參數,讓我們由複雜多樣的DOM結構裡,快速的找出符合樣式的要素。

使用選擇器的三個基本格式是:
序 格式        範例        說明
1 $("HTML標籤")   $("div")      傳回表示所有div要素的jQuery物件
2 $("#要素的ID")   $("#linksLeft")   傳回表示<div id="linksLeft">要素的jQuery物件
3 $(".要素的類別")   $(".blogname")  傳回<div class="blogname">要素的jQuery物件

jQuery 怎麼用來「快速選取元素」並且「做一些事情」呢?請看看程式碼:
$("div").addClass("special");

$("div")        解釋:選取所有 <div>
$("#body")       解釋:選取 id 為 body 的元素
$("div#body")     解釋:選取 id 為 body 的 <div>
$("div.contents p")   解釋:選取 class 為 contents 的 <div> 所包住的所有下層的 <p>
$("div > div")     解釋:選取被 <div> 包住的下一層 <div>
$("div:has(div)")    解釋:和前一個範例相反,這邊是選取至少有包住一個 <div> 的 <div>

[範例1] 選取所有有 target 屬性的 <a>,並且在其節點下加入一段文字
$("a[target]").append(" (Opens in New Window)");  

這是一段原始的 HTML
jsGears  
Google
Amazon

選取有 target 屬性並加入文字後的結果:
jsGears  
Google (Opens in New Window)
Amazon (Opens in New Window)

[範例2] 選取 id 為 body 的元素,並且修改兩個 css 屬性。
$("#body").css({   
border: "1px solid green",
height: "40px"
});

這是一段原始的 HTML :

...

選取 id 為 body 的元素並修改 css 後的結果(示意):

...

[範例3] 在網頁上的表單送出時加入一個判斷,如果 username 這個欄位是空值的話,就顯示 help 這個區塊內的文字。
$("form").submit(function() {   
if ($("input#username").val() == "")
$("span.help").show();
});

可作用在類似以下的 HTML,一開始 span.help 是隱藏的,如果沒有輸入 username,才會顯示:
  



這個欄位必填喔

[範例4] 當 user 點選 id 為 open 的連結時,顯示 id 為 menu 的區塊,並回傳 false 避免瀏覽器真的換頁。
$("a#open").click(function() {   
$("#menu").show();
return false;
});

可作用在類似以下的 HTML:
  
控制面板

[範例5] 將 id 為 menu 的區塊以下拉布幕的動態效果快速顯示:
$("#menu").slideDown("fast");

可作用在類似以下的 HTML,原本隱藏的選單會以動態下拉的方式顯示出來:
  

[範例6] 將所有的 <div> 漸變為寬 300px、文字與邊界寬 20px
$("div").animate({   
width: '300px',
padding: '20px'
}, 'slow');

可作用在類似以下的 HTML:

Hello world!

PS. jQuery 核心程式的 animate 函數能改變的元素屬性並不多,但是可以透過其他 plugin 提供更多的動態效果。

[範例7] 動態效果的 callback 的範例,將所有的 <div> 以 0.5 秒的動態效果隱藏後,再以 0.5 秒的動態效果顯示。hide() 的第二個參數就是一個 callback 函數,其中 $(this) 是原本程式所處理的各個元素。
$("div").hide(500, function(){   
// $(this) 是每一個各別的 <div>
$(this).show(500);
});

可作用在類似以下的 HTML:

Hello world!


jsGears.com!

[範例8] 取得 sample.html 並將找出文件內所有 <div> 下一層的 <h1> 填入原本文件 id 為 body 的元素內
$("#body").load("sample.html div > h1");  

這是一段原始的 HTML :

sample.html 的片段:

Hello world!


This is H2


jsGears.com!



執行程式碼之後的結果:

Hello world!


jsGears.com!



[範例9] 透過 getJSON() 取得 JSON 格式的資料,並透過 callback 函數處理資料
$.getJSON("test.json", function(data){   
for (var idx in data)
$("#menu").append("
  • " + data[idx] + "
  • ");
    });

    這是一段原始的 HTML:
      

    test.json 的內容:
    [   
    "Hello world!",
    "jsGears.com!"
    ]

    執行程式碼之後的結果:
      

    [範例10]抓取DIV內容
    onclick="addition('DivSh_Year');"


    [範例11]抓取DIV內容
    onclick="addition(DivSh_Year);"

    沒有留言:

    張貼留言