jQuery入門筆記之(二)文檔對象模型

jopen 9年前發布 | 10K 次閱讀 HTML jQuery Ajax框架

基礎 DOM 和 和 CSS

一. 設置元素及內容

我們通過前面所學習的各種選擇器、過濾器來得到我們想要操作的元素。這個時候,我們就可以對這些元素進行 DOM 的操作。

那么,最常用的操作就是對元素內容的獲取和修改。 html() 和 text() 方法:

方法名 描述 區分
html() 獲取元素中 HTML 內容 連同標簽一起提取
html(value) 設置元素中 HTML 內容 清空原數據,設置html內容
text() 獲取元素中文本內容 自動清理html標簽
text(value) 設置元素中文本內容 自動轉義html標簽以文本形式呈現
val() 獲取表單中的文本內容 value屬性的值
val(value) 設置表單中的文本內容 設置value的值(有特殊用法)

注意:當我們使用 html() 或 text() 設置元素里的內容時,會清空原來的數據。而我們期望能夠追加數據的話,需要先獲取原本的數據。

$('#box').html($('#box').html() + '<em>guowenfh.github.io</em>'); //追加數據
//當然它還支持使用函數來進行更復雜的追加

val() 的特殊用法:

如果想設置多個選項的選定狀態,比如下拉列表、單選復選框等等,可以通過數組傳遞操作。

$("input").val(["check1","check2", "radio1"]); //value 值是這些的將被選定

二. 元素屬性操作

除了對元素內容進行設置和獲取,通過jQuery也可以對元素本身的屬性進行操作,包括獲取屬性的屬性值、設置屬性的屬性值,并且可以刪除掉屬性。

attr() 和 removeAttr() :

方法名 描述
attr(key) 獲取某個元素 key 屬性的屬性值
attr(key, value) 設置某個元素 key 屬性的屬性值
attr({key1:value2, key2:value2...}) 設置某個元素多個 key 屬性的屬性值
attr(key, function (index, value){}) 通過 fn 來設置設置某個元素 key屬性

注意:

  1. jQuery中很多方法都可以使用 function() {} 來返回出字符串,比如 html() 、 text() 、 val() 和上一章剛學過的 is() 、 filter() 方法。
    這些方法里的 function() {} ,可以不傳參數。可以只傳一個參數 index ,表示當前元素的索引(從0開始)。也可以傳遞兩個參數 index 、 value ,第二個參數表示屬性原本的值。
    (當然并不是所有方法都適合,有興趣可以自己逐個嘗試)。
  2. 刪除指定的屬性,這個方法就不可以使用匿名函數,傳遞 index 和 value 均無效。 $('div').removeAttr('title'); //刪除指定的屬性
  3. 當然因為 id 和 class 也是元素的屬性,自然也可以使用attr進行設置,但是建議不這樣使用,因為會導致整個頁面結構的混亂,有專門的屬性對它們進行設置。

三. 元素樣式操作

元素樣式操作包括了直接設置 CSS 樣式、增加 CSS 類別、類別切換、刪除類別這幾種操作方法。使用頻率極高!

方法名 描述
css(name) 獲取某個元素行內的 CSS 樣式
css([name1, name2, name3]) 獲取某個元素行內多個 CSS 樣式
css(name, value) 設置某個元素行內的 CSS 樣式
css(name, function (index, value) ) 設置某個元素行內的 CSS 樣式
css({name1 : value1, name2 : value2}) 設置某個元素行內多個 CSS 樣式,鍵值對
addClass(class) 給某個元素添加一個 CSS 類
addClass(class1 class2 class3...) 給某個元素添加多個 CSS 類
removeClass(class) 刪除某個元素的一個 CSS 類
removeClass(class1 class2 class3...) 刪除某個元素的多個 CSS 類
toggleClass(class) 來回切換默認樣式和指定樣式
toggleClass(class1 class2 class3...) 同上
toggleClass(class, switch) 來回切換樣式的時候設置切換頻率
toggleClass(function () {}) 通過匿名函數設置切換的規則
toggleClass(function () {}, switch) 在匿名函數設置時也可以設置頻率
toggleClass(function (i, c, s) {}, switch) 在匿名函數設置時傳遞三個參數

理解:

在獲取多個 CSS 樣式時,獲取到的是一個對象數組,如果用原生JS進行解析需要使用 for in 遍歷。

var box = $('div').css(['color', 'height', 'width']); //得到多個 CSS 樣式的數組對象
for (var i in box) { //逐個遍歷出來
    alert(i + ':' + box[i]);
}

在jQuery顯然不需要那么麻煩,因為它提供了一個遍歷工具專門來處理這種對象數組, $.each() 方法,這個方法可以輕松的遍歷對象數組。

/**
 * 遍歷對象數組
 * @param  {String} index 索引,鍵,屬性名
 * @param  {String} value  屬性值,值(相當于arr[i])
 */
//遍歷原生JS對象數組時,value為元素DOM。
$.each(box, function(index, value) {
    alert(index+":"+value);//效果和上面的一樣
});

如果想設置某個元素的 CSS 樣式的值,但這個值需要計算我們可以傳遞一個匿名函數。

$('div').css('width', function (index, value) {
return (parseInt(value) - 50) + 'px';//局部操作,不影響全局,避免沖突。
});

在使用 .toggleClass() 使用時,可以使用傳入匿名函數的方法,實現由默認到幾個class之間的切換。例如:

//注意這里必須要先刪除原有的樣式,不然只是被覆蓋了,而不是替換。
$('div').click(function() {
    $(this).toggleClass(function() {
        if ($(this).hasClass('red')) {
            $(this).removeClass('red');
            return 'blue';
        } else {
            $(this).removeClass('blue');
            return 'red';
        }
    });
});

對于 .toggleClass() 傳入匿名函數的方法,還可以可以傳遞 index 索引、 class 類兩個參數以及頻率布爾值,可以得到當前的索引、class類名和頻率布爾值。

四. CSS方法

(一)width()方法

方法名 描述
width() 獲取某個元素的寬度(number)
width(value) 設置某個元素的寬度(無單位時,默認px)
width(function (index, width) {}) 通過匿名函數設置某個元素的寬度

雖然可以不加單位,但是建議加上,使代碼更加清晰。index 是索引,value 是原本值。

(二)height()方法

方法名 描述
height() 獲取某個元素的高度
height(value) 設置某個元素的高度
height(function (index, height) {}) 通過匿名函數設置某個元素的高度

上述兩個方法不包括內外邊距和邊框

(三)內外邊距和邊框尺寸方法

方法名 描述
innerWidth() 獲取元素寬度,包含內邊距 padding
innerHeight() 獲取元素高度,包含內邊距 padding
outerWidth() 獲取元素寬度,包含邊框 border 和內邊距 padding
outerHeight() 獲取元素高度,包含邊框 border 和內邊距 padding
outerWidth(ture) 同上,且包含外邊距(注意里面的true)
outerHeight(true) 同上,且包含外邊距

(四)元素偏移方法

方法名 描述
offset() 獲取某個元素相對于視口的偏移位置(無論定位與否)
position() 獲取某個元素相對于父元素的偏移位置
scrollTop() 獲取垂直滾動條的位置
scrollTop(value) 設置垂直滾動條的位置
scrollLeft() 獲取水平滾動條的值
scrollLeft(value) 設置水平滾動條的值

注意:

前兩個方法,獲取得到的是一個對象,如: {left:12,top:32} ,所以需要獲取其中的一個值的時候,還需要進行選取,例如: $(div).offset.left 。獲取相對與視口的偏移。

在獲取滾動條的值時需要注意的是,對象為window且需要用$包裝轉化成jQ對象

$(window).scrollTop(); //獲取當前滾動條的位置
$(window).scrollTop(300); //設置當前滾動條的位置

DOM 節點操作

DOM中有一個非常重要的功能,就是節點模型,也就是DOM中的“M”。頁面中的元素結構就是通過這種節點模型來互相對應著的,我們只需要通過這些節點關系,可以創建、插入、替換、克隆、刪除等等一些列的元素操作。

一. 創建節點

為了使頁面更加智能化,有時我們想動態的在 html 結構頁面添加一個元素標簽,那么在插入之前首先要做的動作就是:創建節點。

在jQuery中創建節點異常簡單。

var box = $('<div id="box">節點</div>'); //創建一個節點
$('body').append(box); //將節點插入到<body>元素內部

二. 插入節點

在創建節點的過程中,其實我們已經演示怎么通過.append()方法來插入一個節點。但僅僅這個功能遠遠不能滿足我們的需求,除了這個方法,jQuery提供了其他幾個方法來插入節點。

內部插入節點方法

方法名 描述
append(content) 向指定元素內部后面插入節點content
append(function (index, html) {}) 使用匿名函數向指定元素內部后面插入節點
appendTo(content) 將指定元素移入到指定元素content 內部后面
prepend(content) 向指定元素content 內部的前面插入節點
prepend(function (index, html) {}) 使用匿名函數向指定元素內部的前面插入節點
prependTo(content) 將指定元素移入到指定元素 content 內部前面

需要注意的是 appendTo(content) 與 prependTo(content) 在使用方法上與其他兩個略微有些不同, $("<em>new</em>").appendTo("div"); ,它代表的是創建的節點傳入div內部。

匿名函數方式:

$('div').append(function (index, html) {
 //使用匿名函數插入節點index是獲取到的div的索引,html 是原節點
    if(index==1){
        return '<strong>節點</strong>';//在獲取到的第二個div內部添加節點
    }
});

外部插入節點方法

方法名 描述
after(content) 向指定元素的外部后面插入節點 content
after(function (index, html) {}) 使用匿名函數向指定元素的外部后面插入節點
before(content) 向指定元素的外部前面插入節點 content
before(function (index, html) {}) 使用匿名函數向指定元素的外部前面插入節點
insertAfter(content) 將指定節點移到指定元素 content 外部的后面
insertBefore(content) 將指定節點移到指定元素 content 外部的前面

與上面相同 insertAfter(content) 與 insertBefore(content) 也與其它兩個是相反的。

三.包裹節點

jQuery 提供了一系列方法用于包裹節點,那包裹節點是什么意思呢?其實就是使用字符串代碼將指定元素的代碼包含著的意思。

方法名 描述
wrap(html) 向指定元素包裹一層 html 代碼
wrap(element) 向指定元素包裹一層 DOM 對象節點
wrap(function (index) {}) 使用匿名函數向指定元素包裹一層自定義內容
unwrap() 移除一層指定元素包裹的內容(多層需移除多次)
wrapAll(html) 用 html 將所有元素包裹到一起
wrapAll(element) 用 DOM 對象將所有元素包裹在一起
wrapInner(html) 向指定元素的子內容包裹一層 html
wrapInner(element) 向指定元素的子內容包裹一層 DOM 對象節點
wrapInner(function (index) {}) 用匿名函數向指定元素的子內容包裹一層

wrap的多種用法:

$('div').wrap('<strong class="ing"></strong>'); //在 div 外層包裹一層 strong
$('div').wrap('<strong>123</strong>'); //包裹的元素可以帶內容
$('div').wrap('<strong><em></em></strong>'); //包裹多個元素
$('div').wrap($('strong').get(0)); //也可以包裹一個原生 DOM
$('div').wrap(document.createElement('strong')); //臨時的原生 DOM
$('div').wrap(function (index) { //匿名函數
    return '<strong></strong>';
});

注意: .wrap() 和 .wrapAll() 的區別在前者把每個元素當成一個獨立體,分別包含一層外層;后者將所有元素作為一個整體作為一個獨立體,只包含一層外層。這兩種都是在外層包含,而 .wrapInner() 在內層包含。

四. 節點操作

方法名 描述 參數解析
$('div').clone(true); 復制一個節點 true時表示同時復制事件行為,空或false都表示只復制元素及內容
$('div').remove("#box"); 刪除一個id=box的div元素 無參數時,表示直接刪除元素
$('div').detach(); 保留事件行為的刪除 同上
$('div').empty(); 情況節點里的內容 無參數
$('div').replaceWith('<span>節點</span>') 將 div 替換成 span 元素 HTML字符串,DOM元素,或者jQuery對象
$('<span>節點</span>').replaceAll('div'); 同上 同上

注意:

  1. .remove() 和 .detach() 都是刪除節點,而刪除后本身方法可以返回當前被刪除的節點對象,但區別在于前者在恢復時不保留事件行為,后者則保留。
  2. 節點被替換后,所包含的事件行為就全部消失了。

來自: http://guowenfh.github.io/2015/12/31/jQuery-02-DocumentObjectModel/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!