DOM&BOM

一.BOM
1.認識BOM

什麼是BOM

瀏覽器對象模型, Brower Object Model。

 

爲何須要BOM

咱們的html,css都是在瀏覽器中進行解析的。

當咱們想要實現一些特殊的效果,但願html和css的樣式可以動態的改變。

js是一門瀏覽器端的腳本語言。

咱們須要讓js和html,css之間架起一個橋樑。就js可以與瀏覽器進行交互。在這種狀況下:BOM就出現了。

 

瀏覽器對象模型使用JS有能力與瀏覽器進行「對話」。

 

 

BOM的組成

只要打開瀏覽器,就能夠看到當前的窗口,它的構成以下:

 

當前窗口,就是window對象,而window對象,又包含了6個子對象:

ü  navigator

ü  frames

ü  location

ü  histroy

ü  docuemnt

ü  screen

 
2.window對象

雙重角色:

在ECMAScript語言中的一個全局對象

js訪問瀏覽器的一個接口。是一個對象,對象提供了一些屬性和方法。

 

經常使用的一些window的方法:alert,confirm,prompt,settimeout,setinterval,cleartimeout,clearinterval,open,close

 

alert

彈出一個警告框,輸出相應信息

window有一個特色:就是在調用window的方法時,能夠把window省略掉。

 

confirm

彈出一個確認框,提醒用戶是否確認當前的操做

若是點擊了肯定,那就進行相關操做。

若是點擊了消失,那就什麼也不作。

 

prompt

彈出一個輸入框,容許用戶輸入內容

 

open

打開一個新窗口

 

具體應用:

執行代碼效果

HTML結構:

JS行爲:

 
3.frames對象

和HTML中的框架有關係(frameset frame iframe)

 

前提:若是頁面沒有frameset frameiframe,那麼frames這個對象就是空的,沒有意義。

 

 

父頁面訪問子頁面,使用frames[‘frame的name值’]或frames[索引]
4.其它對象

location

地址,定位

在編程語言中,表示重定位

和a標籤類比,a標籤裏面有個href屬性,能夠跳轉到相應的頁面

 

在實際開發中,有時候,咱們不須要a標籤,那麼這個時候,location也能完成跳轉功能:

注意:

1,a連接能夠控制是在當前窗口打開,仍是在新窗口打開

2,對於location只能在當前窗口打開

3,location還有一個reload方式,從新加載當前頁面(瞭解)

 

history

表示歷史

在js中,它是用來管理歷史記錄。如圖:

有三個方法:

ü  forward()

ü  back()

ü  go()

 

 

go能夠靈活指定是向前仍是後退

go(1) 等價於 forward()

go(-1) 等價於 back()

 

注意:

在使用history時,必須保證history裏面有歷史紀錄,不然確定就不能使用。相似於瀏覽器前進和後退是一個灰色的狀態,如圖:

 

代碼看課堂代碼。

 

navigator,   screen

ü  navigator,在開發時,基本不用,只是在某些框架中的底層代碼中才有使用

ü  在js中,screen沒有任何做用

ü  不講啦
二.DOM(重點)

需求:以開心網爲例

 

當咱們去點擊立既註冊時,須要去用戶輸入的信息進行一個驗證?

 

要驗證用戶填寫的信息是否正確?

ü  1,第一步,先獲得相應的元素

ü  2,第二步,根據元素獲得元素相應的內容,根據內容的不一樣,咱們又分爲兩種狀況,獲得標籤裏面的內容,或獲得標籤中的屬性。

 

以上須要如何知足?

這個時候,DOM出現了。
1.什麼是DOM

DOM:Document Object Model  文檔對象模型

 

DOM,文檔對象模型,是一組用來描述腳本怎樣與結構化文檔進行交互和訪問的web標準,它定義了一系列對象、方法和屬性,用於訪問、操做和建立文檔中的內容、結構、樣式和行爲。

 

ü  JavaScript是ECMA的產物,只是一門語言而已

ü  DOM 則是W3C的標準,只是提供了一個處理頁面的標準而已

ü  兩者的完美結合,可實現web開發中的任何需求。正所謂 1+1>2

ü  比如演員和劇本的關係

 

DOM的發展歷史:

2.DOM 0

W3C組織成立以前,DOM0就出現了,造成了一個所謂的標準。

 

ü  在W3C定義DOM標準以前,Netscape2支持一個簡單的DOM,它提供了僅僅對於連接/圖像和表單這樣的特殊文檔元素的訪問。

ü  這一遺留的DOM被全部瀏覽器廠商採用,而且已經做爲「0級別」DOM正式歸入到W3C標準中。它全部瀏覽器中有效。

ü  0級DOM其實就是定義的一些Document對象的屬性和方法。

 

 

簡單瞭解:

 

爲何還要了解這個DOM0呢?

DOM確實提供了一些簡單的方式來獲取頁面中的元素,並且的有瀏覽器都支持DOM0.

 
3.DOM1

98年10月,W3C推出了DOM 1.0,做爲推薦標準的第一個版本正式發佈,主要包括兩個子規範:

ü  DOM Core(核心部分),把xml文檔設計爲樹形節點結構,併爲這種結構的運行機制制訂了一套規範化標準。同時定義了建立、編輯、操縱這些文檔結構的屬性和方法。

ü  DOM HTML,針對HTML文檔、標籤集合,以及與個別HTML標籤相關的元素定義了對象、屬性和方法。

 

重點是DOM Core,其中的核心思想:

ü  樹形結構

ü  相關的屬性和方法

 
(1).樹形節點結構

 

對於以下這個文檔:

 

其對形結構,以下:

更進一步瞭解,火狐瀏覽器有一個插件--DOMinpector, 能夠查看DOM的詳細結構

 

在DOM造成的樹形結構中,都有哪些類型的節點?

實際上,在html樹形結構中,每個組成元素的都是節點(node),根據節點的信息不一樣,能夠分紅以下三種常見的節點:

ü  元素節點

ü  屬性節點

ü  文本節點

 

 

完整的節點分類以下:

 

節點類型,測試以下:

 

注意:

屬性節點,不會出現要樹形結構模型中。

 

 

 

 

節點之間的關係:

既然全部的節點(元素節點和文本節點)都在樹模型中,那麼他們之間應該存在某種關係。

咱們能夠利用這個關係快速找到某個元素,而後進行操做。

 

針對以下代碼,咱們看一下,它們之間的關係:

 

關係如圖:

 

咱們能夠經過它們之間的關係,來互相獲取相應的目標元素:

ü  parentNode:父節點

ü  childNodes:獲得的是個數組,咱們能夠經過索引來訪問就能夠

ü  firstChild:第一個孩子節點

ü  lastChild:最後一個孩子節點

ü  nextSibling: 下一個兄弟節點

ü  previousSibling:上一個兄弟節點

 

 

對於以下關係,代碼以下:

 

切記一點:

若是使用了節點之間的關係,有的是要考慮空白節點(換行符)

 

通常是不使用節點關係去獲取元素,緣由有二:

ü  寫起來費勁

ü  還可能會出錯,不一樣的瀏覽器,處理機制不同,ie對節點關係處理很正常

 

注意細節:

ü  1,有一個屬性沒有問題:parentNode

ü  2,針對某些兄弟節點,若是沒有換行,使用nextSibling和prviousSibling也沒有問題

ü  3,對於childNodes,firstChild, lastChild這三個節點關係不推薦使用

 
(2).DOM1 標準方法

在DOM中,可使用節點之間的關係,來獲取某個元素,可是關係關係使用的話,效果不太理想。

 

因此, DOM1,它提供了一些其它的標準方法用來獲取頁面中的元素,有兩個:

ü  getElementById       經過元素的ID屬性,來獲取元素

ü  getElementByTagName   經過標籤的名稱來獲取元素

 

 

基本使用:

 注意細節:

1,在使用這兩個標準方法時,對於代碼的解析是自上到下。

解決辦法:

1,將script代碼放到body最後

2,在headk ,添加onload事件, 以下:

 

2,id屬性是當前頁面中是惟一的。 針對getElementByTagName,無論有多少個標籤,獲得的結果是一個數組。
4.選取文檔元素

選取頁面中的元素有以下幾種方式:

ü  1,直接使用DOM0級方式

ü  2,節點之間的關係

ü  3,標準方法

 

代碼以下:

 

問:還有沒有其它的方式?

答案:有

 

getElementByName

根據name屬性來獲取元素

這個方法是能夠獲取到的,可是有兼容性問題,在ie9中不兼容。

 

getElementByClassName

也不推薦使用,有兼容性問題或不支持

 

h5中也有對應的新的方法,講到h5時再說

 

 
5.DOM2 和 DOM3

DOM2增長了以下功能:

ü  對樣式表的操做

ü  事件綁定

 

DOM3的變化:

ü   驗證功能
6.操做元素

ü  建立  createElement

ü  插入  appendChild,insertBefore

ü  複製  cloneNode

ü  刪除  removeChild

ü  替換  replaceChild

 
(1).建立

document.createElement(標籤的名稱)

     注意:建立元素後,只能確保在當前的文檔中有這麼一個h1元素,可是它並無補放到文檔樹裏。

(2).插入操做

appendChild: 在父元素的最後來追加,追加的元素做爲父元素的最後一個節點

insertBefore: 在父元素的某一個子元素以前插入新的元素

 

appendChild方法使用以下:

 

 

它就至關於將剛纔孤立的h1,放到了樹模型中,具體來講是做爲body的最後一個元素進行放置:

 

 

insertBefore方法使用以下:

(3).刪除

理解刪除的過程:父元素能夠刪除子元素

針對以下結構:

 

咱們須要刪除h2元素,分析以下:

 

使用以下:

 

分析,上述方法咱們能夠獲取父元素div和子元素h2.

它們之間存在父子關係,只須要找到子元素,經過parentNode找到父元素。

(4).複製

cloneNode: clone是克隆的意思

格式:要複製的元素.cloneNode(布爾值)

布爾值取值以下:

ü  false,表示淺拷貝,、、

 

 
(5).替換

 

在父元素中,將一個新的元素替換其子元素

格式:父元素.replaceChild(new,old);

 

基本使用:

在實際開發中,replaceChild使用較少。

 

 

 
(6).實際案例

案例:首頁彈廣告並消失

 

 
7.操做屬性

元素 = 標籤+屬性+內容

 

在DOM樹形結構中,節點主要有三種:

ü  元素節點

ü  屬性節點

ü  文本節點

 

首先,須要注意的是:在咱們的DOM中,屬性節點並無做爲節點出現。在DOM樹中,並無列出屬性節點。

因此,咱們不能經過節點關係去找到屬性節點,此路不通。

 

找其它出路:

屬性節點比較特殊,是依賴於標籤存在的,必須和某個具體的元素掛鉤。

咱們能夠根據這個特色,找到咱們想要的屬性節點。

 

獲取屬性節點,有兩種方式:

ü  直接使用對象.屬性

ü  使用DOM中提供一個方法:getAttribute()

 

使用以下:

 

上述兩種的區別:

1,直接使用屬性,是DOM0級提出的方法,getAttribute()是DOM1級提出的標準方法

2,直接使用屬性,只能獲取HTML中定義的標準屬性,若是是自定義屬性,是不能獲取,可是getAttribute()能夠獲取任何屬性:

 

 

 

在實際開發中,若是是html中的標準屬性,那麼咱們可使用對象.屬性來獲取,也可使用getAttribute()來獲取,可是若是是自定義屬性,只能經過getAttribute()來獲取。

 

還有一個細節:

ü  若是屬性名是關鍵字或保留字,使用屬性獲取時,須要換一個名稱

ü  若是使用getAttribute(),則不會出現這個問題

 

基本上就有兩個須要換名字:

ü  class  ---->   className (比較多)

ü  for   ----->   htmlFor (用的少)

 

設置

也有兩種方式:

ü  直接使用屬性的方式格式: 元素.屬性 = 值

ü  使用標準方法setAttribute, 格式:元素.setAttribute(屬性名,屬性值)

 

刪除

使用DOM中提供的標準方法,removeAttribute

格式:元素.removeAttribute(屬性名)

 

實際開發中,獲取和設置屬性經常使用,刪除屬性不經常使用。

 

注意細節:

1,在DOM樹中,屬性節點並無做爲主要的嘉賓列席,沒法經過父節點的childNode對象的列表中找到屬性節點。

2,使用getAttribute和setAttribue能夠讀寫自定義屬性。

3,使用對象的屬性來獲取屬性時,有些名稱須要特殊對待,class--->className

for--->htmlFor

 

 

小星星評分案例:

 

最終要達到的效果:

 

分析,總共用到了4種圖片:

 

搭建HTML結構以下:

 

顯示效果以下:

 

最終js代碼以下:

 

 
8.操做文本

在DOM樹形結構中,全部元素的內容都是一個文本節點。

 

如何獲取文本節點?

只要能獲取元素節點,就能夠獲取文本節點。

 文本節點和文本節點中的內容不是一個概念,咱們是要獲得文本節點的內容,而後對內容進行操做,這樣纔有意義。獲得文本節點自己是沒有用的,在開發中,咱們真正關心是的節點中的內容。

 如何獲得文本節點的內容?

 

方式一:經過文本節點的nodeValue屬性獲取

這種方式,效率很低,通常不用。

 

方式二:innerHTML, 是IE瀏覽器提出的,直接能夠獲取元素中的內容

 

innerHTML功能比較強大,除了能夠獲得節點的內容之年,它還能夠設置內容:

 

innerHTML也能夠進行設置:

 

createTextNode(瞭解)  :建立文本節點

 
9.操做表格(瞭解)

針對表格操做,徹底可使用DOM中標準方法來完成。

因爲表格操做涉及到的標籤較多,因此操做相對比較麻煩。

 

W3C, 針對表格操做又提供了一個新的方式,專用於操做表格。

 

案例:建立一個兩行兩列的表格,分別用傳。統的方式和新方式來實現

 

傳統的方式:

 

新的方式:

 

對於表格的操做,在開發中,並無那麼頻繁。瞭解就好。

 
10.DOM總結

D :

Document,文檔,說白了就是咱們的HTML文檔自己

 

O:

Object, 對象,有具體的操做中,咱們使用了大量的對象,好比docuemnt, element(具體的每個標籤對應的就是一個對象),利用對象的屬性和方式,完成相應的操做。

 

M:

Model,模型,就是樹模型,當頁面載入完畢以後,就會構建咱們的樹模型,在構建樹模型的時候,將文檔中的元素,轉成告終構中的對象。css

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息