2013年2月5日 星期二

jQuery DOM操作

jQuery Manipulation 主要是用來操作 DOM 元素的新增、刪除與修改等。

變更元素內容 (Changing Contents)

.html() :取得或變更元素內容,這個功能類似 JavaScript 中的 innerHTML

.text() :取得或變更元素內容(純文字)

<p>改變<b>元素</b>內容</p>
<script type="text/javascript">
    var p = $("p:last");

    //取得物件的 innerHTML
    var html = p.html()     //改變<b>元素</b>內容

    //變更物件的 innerHTML
    p.html("<b style='color:red'>元素內容已變</b>");

    //取得物件的 innerText
    var html = p.text();    //元素內容已變

    //變更物件的 innerText
    p.text("內容<b style='color:blue'>已變</b>");   //內容<b style='color:blue'>已變</b>
</script>

.replaceWith() :removes content from the DOM and replaces it with something

$("h2").replaceWith("<h1>Page Title</h1>");  //使用 <h1> 標籤取式 <h2> 標籤

插入元素 (Inserting)

.append() :將指定的元素插入到集合中的元素(內部插入)

.prepend() :在每個匹配的元素內部最前面加入(內部插入)

.before() :在每個匹配的元素前面加入(外部插入)

.after() :在每個匹配的元素後面加入(外部插入)

<p class="insert">插入1</p>
<p class="insert">插入2</p>
<script type="text/javascript">
    var p = $(".insert");
    p.append("元素");           //<p>插入1元素</p>
    //<p>插入2元素</p>
    p.prepend("在前面");        //<p>在前面插入1元素</p>
    //<p>在前面插入2元素</p>
    p.before("(1)");            //(1)<p>在前面插入1元素</p>     
    //(1)<p>在前面插入2元素</p>    
    p.after("(...)");           //(1)<p>在前面插入1元素</p>(...)  
    //(1)<p>在前面插入2元素</p>(...)  
</script>

.appendTo() :將集合中的元素插入指定的元素中,做為最後的子元素

.prependTo() :將集合中的元素插入指定的元素中,當做最前的子元素

.insertBefore() :將集合中的元素插入到指定元素之前

.insertAfter() :將集合中的元素插入到指定元素之後

<p class="appendTo">appendTo插入</p>
<p class="prependTo">prependTo插入</p>
<script type="text/javascript">
    var obj1 = $("<a href='http://abc'>xyz</a>");
    obj1.appendTo($(".appendTo"));

    var obj2 = $("<a href='http://abc'>xyz</a>");
    obj2.prependTo($(".prependTo"));
</script>

移動元素 (moving)

同樣使用上面的函式,若參數值是一個 「jQuery」或「DOM」物件,則代表移動它們:

<span id='hello'> Hello </span>
<span id='hi' style="color:Red"> Hi </span>

將 Hello 移到 Hi 裡面的後頭

$("#hi").append($("#hello"));

將 Hello 移到 Hi 裡面的前頭

$("#hi").prepend($("#hello"));

將 Hello 移到 Hi 前面

$("#hi").before($("#hello"));

將 Hello 移到 Hi 後面

$("#hi").after($("#hello"));

包裹元素 (wraping)

.wrap() :Wrap an HTML structure around each element in the set of matched elements.

<span id='Span3'> Hello </span>
<span id='Span4'> Hello </span>
$("#Span1, #Span2").wrap("<span style='color:Red'></span>");
<span style="COLOR: red"><span id="Span1">Hello </span></span>
<span style="COLOR: red"><span id="Span2">Hello </span></span>

其他相關的方法還有:

$(X).wrapAll(Y) :將所有 X 元素集中在一起並用一個Y包起來

$(X).wrapInner(Y) :將 X 的子元素用 Y 包起來

$(X).replaceWith(Y) :將 X 置換成 Y

$(X).replaceAll(Y) :以 X 去置換 Y

刪除元素 (Removing)

.empty() :Remove all child nodes of the set of matched elements from the DOM.

<p>Hello, <span>Person</span> <a href="#">and person</a></p>
$("p").empty(); //結果:<p></p>

.remove() :Remove the set of matched elements from the DOM.

<p>Hello</p> how are <p>you ?</p>
$("p").remove(); //結果:how are

.detach() :removes the found elements from the DOM.

複製元素 (Copying)

.clone() :Create a deep copy of the set of matched elements.

這個方法預設不會複製資料和事件,如果須要,必須將 withDataAndEvents 參數設成 true 。

<b id='cp1'>☆</b>
<span id='cp2'> Hello </span>
$("#copy").click(
    function () {
        $("#cp2").after($("#cp1").clone());  //結果: ☆ Hello ☆
    }
);

暫建物件

以上的說明都是使用頁面中現有的元素,以進行插入、移動、刪除等操作。 jQuery 也可以利用暫建物件的做法,讓我們動態的建立元素。

<div id="Div1">Test Div </div>
<script type="text/javascript">
    var obj = $("<a href='http://abc'>xyz</a>");

    $("#dvDisp").append(obj);
</script>
<div id="dvDisp">Test Div <a href="http://abc/">xyz</a></div>

jQuery 共用方法

以下是幾個 jQuery 所提供的好用函式:

jQuery.browser :偵測瀏覽器版本

用以偵測瀏覽器版本,它是一個物件,會有 safari、opera、msie、mozilla 及 version 五個屬性,前四個屬性依瀏覽器不同,只有一個屬性會傳回 true,其餘都傳回 false,而 version 則會傳回版號。

jQuery.support :判斷瀏覽器的支援度

由於使用 jQuery.browser 的做法意味著我們要寫死何種瀏覽器支援哪些功能,一旦瀏覽器改版或特性改變時就要修校,因此從 jQuery 1.3 起,jQuery 核心不再用 jQuery.browser 判斷決定不同的做法,而是一律由 jQuery.support.* 傳回 true/flase 判斷瀏覽器的支援度,目前可測試的瀏覽器特性包含了: boxModel、cssFloat、hrefNormalized、htmlSerialize、leadingWhitespace、noCloneEvent、objectAll、opacity、scriptEval、style、tbody。但基於向前相容,jQuery.browser 仍會持續存在。

jQuery.each() :逐一處理 array 中的各元素

jQuery.extend() :將物件內容合併。

列舉集合物件

首先要知道的是, .each()jQuery.each() 是不同的。 前者是 jQuery 物件的列舉,用來列舉某個 jQuery 物件中的元素。 後者是用來列舉集合或陣列中的元素。

jQuery.each() 方法,可以讓我們逐一處理 array 或 obj 集合中的各元素。 若在 each 中 return false 時,若尚未處理到的其他陣列元素/物件屬性則略過不處理

  • jQuery.each(array, function() { ... })
    將 array 的各元素逐一送給 callback 函數處理,函數中以 this 取得陣列元素內容。
  • jQuery.each(object, function(i, val) { ... })
    逐一傳入集合物件中各屬性的名稱 (i) 以及值 (val) 給 callback 函數處理。

[例一]

下面範例,我們在一個 div 中,加入4個不同顏色的小 div 。

<script type="text/javascript">
    var colors = ["red", "green", "blue", "yellow"];

    //利用$.each跑迴圈,在callback中,透過 this 取得陣列中的元素
    $.each(colors, function () {
        $("<div class='Square' style='background-color:" + this + "'></div>").appendTo("#targetDiv");
    });
</script>

[例二]

<script type="text/javascript">
    $.each(colors, function (index, value) {
        alert(index + ': ' + value);
    });
    // 0: red
    // 1: green
    // 2: blue
    // 3: yellow
</script>

合併物件內容

jQuery.extend() :將物件內容合併。

jQuery.extend(obj1, obj2[, obj3])
這個方法會將後面的物件 (obj2, obj3, ...) 的屬性合併到 obj1 中(若同名屬性存在則覆寫之),很常用於指定參數的預設值,例如:

<script type="text/javascript">
    var finalSetting = {};
    var defaultSetting = { limit: 256, maxRows: 16, maxCols: 16 };
    var userOption = { maxRows: 10 };

    //第一個參數物件會被修改,為了保持 defaultSetting 不被更動,放在第二個參數   
    $.extend(finalSetting, defaultSetting, userOption);
    $.each(finalSetting, function (i, val) {
        alert(i + "->" + val);
    });
</script>

沒有留言:

張貼留言