DOM 對(duì)象和 BOM 對(duì)象

DOM對(duì)象

1. DOM 簡(jiǎn)介

DOM (Document Object Model)是 W3C 的標(biāo)準(zhǔn),是指文檔對(duì)象模型(樹結(jié)構(gòu))逝淹。

DOM 定義了訪問和操作 HTML 文檔的標(biāo)準(zhǔn)方法兵钮。通過它俏橘,可以訪問HTML文檔的所有元素睡榆。

2. HTML DOM 樹

3. DOM 節(jié)點(diǎn)

根據(jù) W3C 的 HTML DOM 標(biāo)準(zhǔn)卵牍,HTML 文檔中的所有內(nèi)容都是節(jié)點(diǎn)(NODE):

  • 文檔節(jié)點(diǎn):整個(gè)文檔(document對(duì)象)
  • 元素節(jié)點(diǎn):每個(gè) HTML 元素(element 對(duì)象)
  • 文本節(jié)點(diǎn):HTML 元素內(nèi)的文本(text對(duì)象)
  • 屬性節(jié)點(diǎn):每個(gè) HTML 屬性(attribute對(duì)象)
  • 注釋節(jié)點(diǎn):注釋(comment對(duì)象)

畫dom樹是為了展示文檔中各個(gè)對(duì)象之間的關(guān)系瓮栗,用于對(duì)象的導(dǎo)航削罩。這里只需要記住 Document 對(duì)象和 Element 對(duì)象即可瞄勾。

4. DOM 查找

直接查找

// 根據(jù)標(biāo)簽名獲取標(biāo)簽合集
const div1 = document.getElementsByTagName("div"); // div1 div2 div3 div4 div5 (元素集合 HTMLCollection)
const div2 = document.querySelectorAll("div"); // div1 div2 div3 div4 div5 (節(jié)點(diǎn)集合 NodeList)

// 根據(jù)class屬性獲取
const div3 = document.getElementsByClassName("div"); // div1 div2 (元素集合 HTMLCollection)
const div4 = document.querySelectorAll(".div"); // div1 div2 (節(jié)點(diǎn)集合 NodeList)

// 根據(jù)id屬性值獲取
const div5 = document.getElementById("div"); // div3 (一個(gè)標(biāo)簽)
const div6 = document.querySelectorAll("#div"); // div3 (節(jié)點(diǎn)集合 NodeList)

// 根據(jù)name屬性值獲取
const div7 = document.getElementsByName("div"); // div4 div5 (節(jié)點(diǎn)集合 NodeList)

// 根據(jù)標(biāo)簽名獲取標(biāo)第一個(gè)
const div8 = document.querySelector("div"); // div1 (一個(gè)標(biāo)簽)

間接查找

parentElement       //父節(jié)點(diǎn)標(biāo)簽元素
children           //所有子標(biāo)簽
firstElementChild     //第一個(gè)子標(biāo)簽元素
lastElementChild      //最后一個(gè)子標(biāo)簽元素
nextElementtSibling    //下一個(gè)兄弟標(biāo)簽元素
previousElementSibling  //上一個(gè)兄弟標(biāo)簽元素

// 示例:
var ele1=document.getElementsByTagName("a")[0];
var ele2=ele1.parentElement;
console.log(ele2);

5. DOM 操作

// 創(chuàng)建節(jié)點(diǎn)
var divEle = document.createElement("div");
var pEle = document.createElement("p");
var aEle = document.createElement("a");

// 添加節(jié)點(diǎn)
document.body.appendChild(divEle);  // 將上面創(chuàng)建的div元素加入到body的尾部
document.body.insertBefore(pEle, divEle);  // 在body下,將p元素添加到div元素前面

//替換節(jié)點(diǎn)
document.body.replaceChild(aEle, pEle);  // 在body下弥激,用a元素替換p元素

//設(shè)置文本節(jié)點(diǎn)
aEle.innerText = "在干嘛"
divEle .innerHTML = "<p>在干嘛<p/>"

//設(shè)置屬性
divEle .setAttribute("class","list"); // 給div元素加上class='list'屬性

//獲取class值
divEle.className // 獲取div元素上的class

// 設(shè)置style樣式
divEle.style.color = "red"; // 把div元素的color樣式設(shè)置成red
divEle.style.margin = "10px"
divEle.style.width = "10px"
divEle.style.left = "10px"
divEle.style.position = "relative"

6. DOM 事件

HTML 4.0 的新特性之一是有能力使 HTML 事件觸發(fā)瀏覽器中的動(dòng)作(action)进陡,比如當(dāng)用戶點(diǎn)擊某個(gè) HTML 元素時(shí)啟動(dòng)一段 JavaScript。下面是一個(gè)屬性列表微服,這些屬性可插入 HTML 標(biāo)簽來定義事件動(dòng)作趾疚。

常用事件:

onclick        當(dāng)用戶點(diǎn)擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄。
ondblclick     當(dāng)用戶雙擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄以蕴。

onfocus        元素獲得焦點(diǎn)糙麦。  //練習(xí):輸入框
onblur         元素失去焦點(diǎn)。  //應(yīng)用場(chǎng)景:用于表單驗(yàn)證丛肮,用戶離開某個(gè)輸入框時(shí)赡磅,代表已經(jīng)輸入完了,我們可以對(duì)它進(jìn)行驗(yàn)證宝与。
onchange       域的內(nèi)容被改變焚廊。//應(yīng)用場(chǎng)景:通常用于表單元素,當(dāng)元素內(nèi)容被改變時(shí)觸發(fā),(三級(jí)聯(lián)動(dòng))

onkeydown      某個(gè)鍵盤按鍵被按下习劫。//應(yīng)用場(chǎng)景: 當(dāng)用戶在最后一個(gè)輸入框按下回車按鍵時(shí)咆瘟,表單提交。
onkeypress     某個(gè)鍵盤按鍵被按下并松開诽里。
onkeyup        某個(gè)鍵盤按鍵被松開袒餐。
onload         一張頁(yè)面或一幅圖像完成加載。
onmousedown    鼠標(biāo)按鈕被按下须肆。
onmousemove    鼠標(biāo)被移動(dòng)匿乃。
onmouseout     鼠標(biāo)從某元素移開。
onmouseover    鼠標(biāo)移到某元素之上豌汇。
onmouseleave   鼠標(biāo)從元素離開

onselect       文本被選中。
onsubmit       確認(rèn)按鈕被點(diǎn)擊泄隔。

7. DOM 優(yōu)化

DOM 操作都是代價(jià)昂貴的操作拒贱,它會(huì)導(dǎo)致 WEB 應(yīng)用程序的 UI 反應(yīng)遲鈍。所以佛嬉,應(yīng)當(dāng)盡可能減少這類過程的發(fā)生逻澳。

// 不緩存 DOM 查詢結(jié)果
for (let i = 0; i < document.getElementsByTagName("div").length; i++) {
    // 每次循環(huán),都會(huì)計(jì)算length暖呕,頻繁進(jìn)行 DOM 查詢
}

// 緩存 DOM 查詢結(jié)果
const div = document.getElementsByTagName("div");
const length = div.length;
for (let i = 0; i < length; i++) {
    // 只進(jìn)行一次 DOM 查詢
}

將頻繁的 DOM 操作改成一次性操作:

var el = document.getElementById('mydiv');

// 未優(yōu)化前的DOM操作斜做,會(huì)導(dǎo)致三次重排
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';

// 優(yōu)化后的DOM操作,只會(huì)一次重排
el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';

BOM 對(duì)象

BOM(Browser Object Model)是指瀏覽器對(duì)象模型湾揽,可以對(duì)瀏覽器窗口進(jìn)行訪問和操作瓤逼。
使用 BOM笼吟,開發(fā)者可以移動(dòng)窗口、改變狀態(tài)欄中的文本以及執(zhí)行其他與頁(yè)面內(nèi)容不直接相關(guān)的動(dòng)作霸旗。
使 JavaScript 有能力與瀏覽器"對(duì)話"贷帮。

1. window 對(duì)象

window對(duì)象是客戶端JavaScript最高層對(duì)象之一,由于window對(duì)象是其它大部分對(duì)象的共同祖先诱告,在調(diào)用window對(duì)象的方法和屬性時(shí)撵枢,可以省略window對(duì)象的引用。例如:window.document.write()可以簡(jiǎn)寫成:document.write()精居。

  • 所有瀏覽器都支持 window 對(duì)象锄禽。它表示瀏覽器窗口;
  • 概念上講:一個(gè)html文檔對(duì)應(yīng)一個(gè)window對(duì)象靴姿;
  • 功能上講:控制瀏覽器窗口的沃但;
  • 使用上講:window對(duì)象不需要?jiǎng)?chuàng)建對(duì)象,直接使用即可空猜;
  • 所有 JavaScript 全局對(duì)象绽慈、函數(shù)以及變量均自動(dòng)成為 window 對(duì)象的成員;
  • 全局變量是 window 對(duì)象的屬性辈毯。全局函數(shù)是 window 對(duì)象的方法坝疼。

window對(duì)象方法:

alert()            顯示帶有一段消息和一個(gè)確認(rèn)按鈕的警告框。
confirm()          顯示帶有一段消息以及確認(rèn)按鈕和取消按鈕的對(duì)話框谆沃。
prompt()           顯示可提示用戶輸入的對(duì)話框钝凶。

open()             打開一個(gè)新的瀏覽器窗口或查找一個(gè)已命名的窗口。
close()            關(guān)閉瀏覽器窗口唁影。
setInterval()      按照指定的周期(以毫秒計(jì))來調(diào)用函數(shù)或計(jì)算表達(dá)式耕陷。
clearInterval()    取消由 setInterval() 設(shè)置的 timeout。
setTimeout()       在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式据沈。
clearTimeout()     取消由 setTimeout() 方法設(shè)置的 timeout哟沫。

2. Navigator 對(duì)象

Navigator 對(duì)象包含有關(guān)瀏覽器的信息。

const ua = navigator.userAgent;
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36

3. Screen 對(duì)象

Screen 對(duì)象包含有關(guān)客戶端顯示屏幕的信息锌介。

console.log(screen); // Screen {availWidth: 1920, availHeight: 1040, width: 1920, height: 1080, colorDepth: 24, …}
console.log(screen.width); // 1920
console.log(screen.height); //1080

4. Location 對(duì)象

Location 對(duì)象包含有關(guān)當(dāng)前 URL 的信息嗜诀。

Location 屬性:

// 獲取完整的url
location.href;   // "https://www.baidu.com/?id=123&num=456"

// 跳轉(zhuǎn)到指定頁(yè)面(可以返回上一個(gè)頁(yè)面)
location.;

// 獲取url的協(xié)議部分
location.protocol;  // "https:"

// 獲取url的主機(jī)名和端口
location.host; // "www.baidu.com"

// 獲取url的查詢部分(問號(hào) ? 之后的部分)
location.search; // "?id=123&num=456"

Location 方法:

// 重新加載頁(yè)面,即刷新
location.reload();  

// 載入一個(gè)新的文檔,跳轉(zhuǎn)到指定頁(yè)面(可以返回上一個(gè)頁(yè)面)
location.assign("https://www.baidu.com/");

// 跳轉(zhuǎn)到指定頁(yè)面(不可以返回上一個(gè)頁(yè)面)
location.replace("https://www.baidu.com/");

5. History 對(duì)象

History 對(duì)象包含用戶(在瀏覽器窗口中)訪問過的 URL孔祸。

History 對(duì)象方法:

history.forward()  // 前進(jìn)一頁(yè)
history.back()  // 后退一頁(yè)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隆敢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崔慧,更是在濱河造成了極大的恐慌拂蝎,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶室,死亡現(xiàn)場(chǎng)離奇詭異温自,居然都是意外死亡玄货,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門捣作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉结,“玉大人,你說我怎么就攤上這事券躁〕涂樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵也拜,是天一觀的道長(zhǎng)以舒。 經(jīng)常有香客問我,道長(zhǎng)慢哈,這世上最難降的妖魔是什么蔓钟? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮卵贱,結(jié)果婚禮上滥沫,老公的妹妹穿的比我還像新娘。我一直安慰自己键俱,他們只是感情好兰绣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著编振,像睡著了一般缀辩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪央,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天臀玄,我揣著相機(jī)與錄音,去河邊找鬼畅蹂。 笑死健无,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的液斜。 我是一名探鬼主播睬涧,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旗唁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹束,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤检疫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祷嘶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屎媳,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夺溢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洼哎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竭翠。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡船逮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出状勤,到底是詐尸還是另有隱情,我是刑警寧澤双泪,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布持搜,位于F島的核電站,受9級(jí)特大地震影響焙矛,放射性物質(zhì)發(fā)生泄漏葫盼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一村斟、第九天 我趴在偏房一處隱蔽的房頂上張望贫导。 院中可真熱鬧,春花似錦蟆盹、人聲如沸孩灯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钱反。三九已至,卻和暖如春匣距,著一層夾襖步出監(jiān)牢的瞬間面哥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工毅待, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尚卫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓尸红,卻偏偏與公主長(zhǎng)得像吱涉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容