1. DOM操作分類

1.1 DOM Core

DOM Core不專屬於JavaScript,任何支援DOM的程式設計語言都可以使用。JavaScript中的getElementById()、getElemetsByTagName()、getAttribute()和setAttribute()等方法,都是DOM Core的組成部分。

1.2 HTML DOM

在使用JavaScript和DOM為HTML檔案編寫指令碼時,有許多專屬於HTML-DOM的屬性。它提供了一些更簡明的記號來描述各種HTML元素的屬性,例如document.forms或element.src。有些方法即可以用DOM Core來實現,也可以使用HTML-DOM實現。

1.3 CSS DOM

CSS DOM 是針對CSS的操作。在JavaScript中,CSS DOM技術的主要作用是獲取和設定style物件的各種屬性,通過改變style物件的各種屬性,可以使網頁呈現出各種不同的效果。

2. DOM操作

2.1 查詢節點

使用jQuery在文件樹上查詢節點,可通過jQuery選擇器來完成,例如:

var $li = $("ul li:eq(1)");
var li_txt = $li.text();
alert(li_txt);

利用jQuery選擇器查詢到所需元素後,就可以使用attr()方法來獲取它的各種屬性值,例如:

var $para = $("p");
var p_txt = $para.attr("title");
alert(p_txt);

2.2 建立節點

如果要建立兩個<li>元素節點,並且要把它們作為<ul>元素節點的子節點新增到DOM節點樹上,可使用工廠函式$()來完成,格式如下:

$(html);

$(html)方法會根據傳入的HTML標記字串,建立一個DOM物件,並將這個DOM物件包裝成一個jQuery物件後返回,例如:

var $li_1 = $("<li></li>");
var $li_2 = $("<li></li>");
$("ul").append($li_1);
$("ul").append($li_2);

建立屬性節點與建立文字節點類似,也是直接在建立元素節點時一起建立,例如:

var $li_1 = $("<li title="t1">t1</li>");
var $li_2 = $("<li title="t2">t2</li>");
$("ul").append($li_1);
$("ul").append($li_2);

2.3 插入節點

將新建立的節點插入某個文件的方法有多種,如下表:

方法 描述 示例
append() 向每個匹配的元素內部追加內容。 $(“p”).append(“<b>me</b>”);
appendTo() 將所有匹配的元素追加到指定的元素中。 $(“<b>me</b>”).appendTo(“p”);
prepend() 向每個匹配的元素內部前置內容。 $(“p”).prepend(“<b>me</b>”);
prependTo() 將所有匹配的元素前置到指定的元素中。 $(“<b>me</b>”).prependTo(“p”);
after() 在每個匹配的元素之後插入內容。 $(“p”).after(“<b>me</b>”);
insertAfter() 將所有匹配的元素插入到指定元素的後面。 $(“<b>me</b>”).insertAfter(“p”);
before() 在每個匹配的元素之前插入內容。 $(“p”).before(“<b>me</b>”);
insertBefore() 將所有匹配的元素插入到指定的元素的前面。 $(“<b>me</b>”).insertBefore(“p”);

2.4 刪除節點

如果文件中某一個元素多餘,那麼應將其刪除。jQuery提供了兩種刪除節點的方法,即remove()和empty()。

remove()方法的作用是從DOM中刪除所有匹配的元素,例如:

$("ul li:eq(1)").remove();

當某個節點用remove()方法刪除後,該節點所包含的所有後代節點將同時被刪除,這個方法的返回值是一個指向已被刪除的節點的引用。

empty()方法的作用是清空節點,例如:

$("ul li:eq(1)").empty();

當執行程式碼後,第2個<li>元素的內容被清空了,只剩下<li>標籤預設的圓點符號。

2.5 複製節點

如果需要複製一個元素,可以使用clone()來完成,例如:

$("ul li").click(function(){
  $(this).clone().appendTo("ul");
})

複製節點後,被複制的新元素並不具有任何行為,如果需要新元素也具有複製功能,可以在clone()方法中傳遞一個引數true,例如:

$("ul li").click(function(){
  $(this).clone(true).appendTo("ul");
})

2.6 替換節點

如果要替換節點,jQuery提供了相應的方法,即replaceWith()和replaceAll()。replaceWith()方法的作用是將所有匹配的元素都替換成指定的HTML或者DOM元素,例如:

$("p").replaceWith("<strong>Name</strong>");

也可以使用另一個方法replaceAll()來實現,該方法與replaceWith()方法的作用相同,只是顛倒了replaceWith()操作,例如:

$("<strong>Name</strong>").replaceAll("p");

2.7 包裹節點

如果要將某個節點用其他標記包裹起來,jQuery提供了相應的方法,即wrap(),例如:

$("strong").wrap("<b></b>");

wrapAll()方法會將所有匹配的元素用一個元素來包裹,它不同於wrap()方法,wrap()方法是將所有的元素進行單獨的包裹,例如:

$("strong").wrapAll("<b></b>");

wrapInner()方法將每一個匹配的元素的子內容用其他結構化的標記包裹起來,例如:

$("strong").wrapInner("<b></b>");

2.8 屬性操作

在jQuery中,用attr()方法來獲取和設定元素屬性值,例如:

var p_txt = $("p").attr("title");

如果要設定元素屬性值,也可以使用同一個方法,不同的是,需要傳遞兩個引數,例如:

$("p").attr("title", "my title");

在某些情況下,要刪除文件中某個元素的特定屬性,可以使用removeAttr()方法來完成,例如:

$("p").removeAttr("title");

2.9 樣式操作

使用attr()方法可以獲取元素的class,例如:

var p_class = $("p").attr("class");

也可以使用attr()方法來設定class,例如:

$("p").attr("class", "high");

在大多數情況下,它是將原來的class替換為新的class,而不是在原來的基礎上追加新的class。jQuery提供了專門的addClass()方法來追加樣式,例如:

$("p").addClass("another");

如果使用者要刪除class的某個值,可以使用與addClass()方法相反的removeClass()方法來完成,例如:

$("p").removeClass("high");

當它不帶引數時,就會將class的值全部刪除,例如:

$("p").removeClass();

jQuery還提供了一個toggleClass()方法控制樣式上的重複切換,如果類名存在則刪除它,如果類名不存在則新增它,例如:

$("p").toggleClass("high");

hasClass()可以用來判斷元素中是否含有某個class,如果有,則返回true,否則返回false,例如:

$("p").hasClass("high");

2.10 設定和獲取HTML、文字和值

html()方法類似於javascript中的innerHTML屬性,可以用來讀取或者設定某個元素中的HTML內容,例如:

var p_html = $("p").html();

如果需要設定某元素的HTML,也可以使用該方法,例如:

$("p").html("<strong>Name</strong>");

text()方法類似於javascript中的innerText屬性,可以用來讀取或設定某個元素中的文字內容,例如:

var p_text = $("p").text();

val()方法類似於javascript中的value屬性,可以用來設定和獲取元素的值,例如:

$("#username").focus(function(){
  var text_value = $(this).val();
  alert(text_value);
});

2.11 遍歷節點

children()方法用於取得匹配元素的子元素集合,例如:

$("p").children();

next()方法用於取得匹配元素後面緊鄰的同輩元素,例如:

$("p").next();

prev()方法用於取得匹配元素前面緊鄰的同輩元素,例如:

$("p").prev();

siblings()方法用於取得匹配元素前後所有的同輩元素,例如:sli

$("p").siblings();

closet()方法用來取得最近的匹配元素,首先檢查當前元素是否匹配,如果匹配則直接返回,如果不匹配則向上查詢父元素,直到找到匹配選擇器的元素,如果沒有找到,則返回一個空的jQuery物件,例如:

$(e.target).closet("li").css("color", "red");

2.12 CSS-DOM操作

CSS-DOM技術簡單來說就是讀取和設定style物件的各種屬性,可以直接利用css()方法獲取元素的樣式屬性,例如:

$("p").css("color");

也可以直接利用css()方法設定某個元素的單個樣式,例如:

$("p").css("color", "red");

在jQuery中還有一個height()方法,可以取得匹配元素當前計算的高度值,例如:

$("p").height();

與height()方法對應的還有一個width()方法,可以取得匹配元素的寬度值,例如:

$("p").width();

CSS-DOM中,還有以下幾個經常使用的方法。offset()方法的作用是獲取元素在當前視窗的相對偏侈,其中返回的物件包含兩個屬性,即top和left,它只對可見元素有效,例如:

var offset = $("p").offset();
var left = offset.left;
var top = offset.top;

position()方法的作用是獲取元素相對於最近的一個position樣式屬性設定relative或absolute的祖父節點的相對偏移,它返回的物件也包括兩個屬性,即top和left,例如:

var position = $("p").position();
var left = position.left;
var top = position.top;

scrollTop()方法和scrollLeft()方法的作用分別是獲取元素的滾動條距頂端的距離和距左側的距離,例如:

var $p = $("p");
var scrollTop = $p.scrollTop();
var scrollLeft = $p.scrollLeft();

另外,可以為這兩個方法指定一個引數,控制元素的滾動條滾動到指定位置,例如:

$("textarea").scrollTop(300);
$("textarea").scrollLeft(300);