11.1.2 DOM

DOM 概念

所謂DOM,全稱 Docuemnt Object Model 文檔對象模型,毫無疑問,此時要操作對象,什麼對象?

在文檔中一切皆對象,比如html,body,div,p等等都看做對象,那麼我們如何來點擊某個盒子讓它變色呢?

DOM 爲文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。目的其實就是爲了能讓js操作html元素而制定的一個規範。

解析過程

HTML加載完畢,渲染引擎會在內存中把HTML文檔,生成一個DOM樹,getElementById是獲取內中DOM上的元素節點。然後操作的時候修改的是該元素的屬性。

DOM樹(一切皆是節點)

在這裏插入圖片描述
在HTML當中,一切都是節點:(非常重要)

元素節點:HMTL標籤。
文本節點:標籤中的文字(比如標籤之間的空格、換行)
屬性節點::標籤的屬性

DOM可以做什麼

找對象(元素節點)
設置元素的屬性值
設置元素的樣式
動態創建和刪除元素
事件的觸發響應:事件源、事件、事件的驅動程序

清楚DOM的結構

獲取文檔對象:document
獲取html:document.documentElement
獲取body: document.body

獲取其它DOM(事件源)的三種方式

var oDiv1 = document.getElementById("box1");      //方式一:通過id獲取單個標籤

var oDiv2 = document.getElementsByTagName("div")[0];     //方式二:通過 標籤名 獲得 標籤數組,所以有s

var oDiv3 = document.getElementsByClassName("box")[0];  //方式三:通過 類名 獲得 標籤數組,所以有s

事件

JS是事件驅動爲核心的一門語言。

事件的三要素

事件的三要素:事件源、事件、事件驅動程序。

代碼書寫步驟如下:(重要)

(1)獲取事件源:document.getElementById(“box”); //類似與ios語言的UIButton *adBtn = [UIButton buttonWithType:UIButtonTypeCustom];

(2)綁定事件: 事件源box.事件onclick = function(){ 事件驅動程序 };

(3)書寫事件驅動程序:關於DOM的操作
在這裏插入圖片描述

綁定事件的方式

JavaScript入口函數 window.onload()

函數調用,是當頁面加載完畢(文檔和圖片)的時候,觸發onload()函數,文檔先加載,圖片資源後加載。

有一點我們要知道:js的加載是和html同步加載的。因此,如果使用元素在定義元素之前,容易報錯。這個時候,onload事件就能派上用場了,我們可以把使用元素的代碼放在onload裏,就能保證這段代碼是最後執行。

window.onload()方法存在的問題

  • 圖片加載完成才調用onload方法,大家想個問題,如果現在用戶訪問JD商城頁面,如果JD商城中的腳本文件在window.onload()方法調用,如果此時用戶網速卡了,然後圖片資源加載失敗了,此時用戶是做不了任何操作的,所以winodw.onload()方法有很大問題。
  • window.onload()方法 如果腳本中書寫兩個這樣的方法,那麼會有事件覆蓋現象。

樣式屬性操作

所謂樣式屬性,就是對之前所講解的style標籤中的屬性進行操作,並且通過js控制盒模型的屬性(width,height等),控制盒子的顯示隱藏(display:none|block),控制盒子的顏色切換(background:red|green)等等

首先,大家明確一點,你是要操作文檔對象了,要遵循事件三步走

獲取事件源
事件
事件驅動程序

值的操作

所謂值的操作,就是對前閉合標籤和後閉合標籤中間的文本內容的設置和獲取。

雙閉合標籤: innerText或者innerHTML
單閉合標籤:除了img標籤,就剩input了,使用value進行賦值

標籤屬性操作

所謂標籤屬性,就是對標籤中(字面上看到的)屬性的操作。比如像每個標籤中id,class,title、img

標籤的src屬性和alt屬性、a標籤的href屬性、input標籤中的name、type屬性等等

節點的操作

插入節點

方式1:

 父節點.appendChild(新的子節點);

解釋:父節點的最後插入一個新的子節點。

方式2:

父節點.insertBefore(新的子節點,作爲參考的子節點);

刪除節點

  父節點.removeChild(子節點);

如果我想刪除自己這個節點,可以這麼做:

node1.parentNode.removeChild(node1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章