深入JavaScript Day31 - 認(rèn)識(shí) DOM 架構(gòu)、利用架構(gòu)知識(shí)體系學(xué)習(xí)東西、EventTarget、Node、Element、Document、事件捕獲、事件冒泡、瀏覽器事件

一、認(rèn)識(shí) DOM 架構(gòu)

1、什么前端渲染?什么是后端渲染?

  • 【前端渲染】由前端拿到需要展示的數(shù)據(jù),然后再由前端轉(zhuǎn)換成HTML+CSS進(jìn)行渲染;
  • 【后端渲染】由后端直接返回需要展示的HTML+CSS進(jìn)行渲染;

2、DOM的全稱是什么?是什么之間的橋梁?(從架構(gòu)上理解DOM的定位)

  • Document Object Model;
  • 是 HTML 和 JavaScript 之間的橋梁;

3、【小細(xì)節(jié)】HTML里面的注釋,會(huì)被解析嗎?

  • 其實(shí)是會(huì)被解析的,我們打開Chrome調(diào)試工具的時(shí)候,可以在HTML里面看到注釋代碼。

4、認(rèn)識(shí)DOM架構(gòu)【這就是樹形結(jié)構(gòu)學(xué)習(xí)方式,一定要領(lǐng)悟,重要能力】

image.png

二、基于上面的架構(gòu)圖,然后逐個(gè)擊破(僅僅擊破重要的,常用的)

1、EventTarget 的定位是什么?主要有哪三個(gè)方法?

  • 【定位】是一個(gè) DOM 接口,由可以接受事件,并且可以創(chuàng)建監(jiān)聽器的對(duì)象實(shí)現(xiàn);
  • 【補(bǔ)充】Element、document、Node 和 window 是最常見的 event targets;
  • 【方法】addEventListener()、removeEventListener()、dispatchEvent();
  • 【內(nèi)部實(shí)現(xiàn)】在MDN上有EventTarget的簡(jiǎn)單實(shí)現(xiàn)代碼,可以學(xué)習(xí)下;
document.addEventListener("click", () => {
  console.log("document 被點(diǎn)擊了");
});

const boxDiv = document.querySelector(".box");
boxDiv.addEventListener("click", () => {
  console.log("box 被點(diǎn)擊");
});

2、Node的定位是什么?Node的父類是誰(shuí)?

  • 【定位】Node 是一個(gè)接口,各種類型的DOM API對(duì)象會(huì)從這個(gè)接口繼承;
  • 【父類】Node 的父類是EventTarget;
  • 【Node的子類常見的是哪些】Document、Element 等等都是Node的子類;
const divEl = document.querySelector(".container");
const spanEl = document.querySelector(".box");

// 常見的屬性
console.log(divEl.nodeName, spanEl.nodeName);
console.log(divEl.nodeType, spanEl.nodeType);
console.log(divEl.nodeValue, spanEl.nodeValue);

// childNodes
const spanChildNodes = spanEl.childNodes;
const textNode = spanChildNodes[0];
console.log(textNode.nodeValue);

// 常見的方法
const strongEl = document.createElement("strong");
strongEl.textContent = "我是strong元素";
divEl.appendChild(strongEl);

// 注意事項(xiàng):document對(duì)象
document.body.appendChild(strongEl);
image.png

3、Document的定位是什么?常見方法有哪些?

  • 【定位】Document也就是DOM樹,包含了像<body>、<table>這樣的元素。它還向網(wǎng)頁(yè)文檔提供了全局操作功能,能解決如何獲取頁(yè)面的URL,如何在文檔中創(chuàng)建一個(gè)新的元素這樣的問題。
// 獲取document的一些屬性
console.log(document.location);

// 創(chuàng)建元素
const imageEl = document.createElement("img");

// 獲取元素
const divEl1 = document.getElementById("box");
const divEl2 = document.getElementsByTagName("div");
const divEl3List = document.getElementsByName("title");
const divEl4 = document.querySelector(".content");
const divEl5List = document.querySelectorAll(".content");
image.png

4、Element的定位是什么?Element常見的屬性和方法?

  • 【定位】Element是一個(gè)通用性非常強(qiáng)的基類,所有 Document 對(duì)象下的對(duì)象都繼承自它。這個(gè)接口描述了所有相同種類的元素所普遍具有的方法和熟悉。


    image.png

三、瀏覽器事件

1、事件主要包括哪些?事件來(lái)自哪里?

-【事件】瀏覽器在某個(gè)時(shí)刻可能會(huì)發(fā)生一些事件,比如鼠標(biāo)點(diǎn)擊、移動(dòng)、滾動(dòng)、獲取、失去焦點(diǎn)、輸入內(nèi)容等等一系列的事件;
-【來(lái)源】在web中,事件在瀏覽器窗口中被觸發(fā),并且通過綁定某些元素上或者瀏覽器窗口本身,那么我們就可以給這些元素或者window窗口來(lái)綁定事件的處理程序,來(lái)對(duì)事件進(jìn)行監(jiān)聽。

2、事件監(jiān)聽主要哪兩種方式?【代碼角度】

  • 【GlobalEventHandlers.onclick】onclick只能定義一個(gè)監(jiān)聽回調(diào),后面的定義會(huì)覆蓋前面的
  • 【EventTarget.addEventListener()】// addEventListener可以有多個(gè)同時(shí)監(jiān)聽回調(diào)
// onclick只能定義一個(gè)監(jiān)聽回調(diào),后面的定義會(huì)覆蓋前面的
const divEl = document.querySelector(".container");
divEl.onclick = () => {
  console.log("onclick1");
};
divEl.onclick = () => {
  console.log("onclick2");
};

// addEventListener可以有多個(gè)同時(shí)監(jiān)聽回調(diào)
const spanEl = document.querySelector(".box");
spanEl.addEventListener("click", () => {
  console.log("addEventListener1");
});
spanEl.addEventListener("click", () => {
  console.log("addEventListener2");
});

3、什么是事件冒泡?什么是事件捕獲?

-【event bubble】默認(rèn)情況下事件是從內(nèi)層向外層傳遞(span > body),這個(gè)順序我們稱之為事件冒泡;
-【event capture】另一種監(jiān)聽事件流的方式是從外層到內(nèi)存(body > span),這種稱之為事件捕獲;

const bodyEl = document.body;
const divEl = document.querySelector(".box");
const spanEl = document.querySelector(".span");

bodyEl.addEventListener("click", () => {
  console.log("事件冒泡:", "body被點(diǎn)擊");
});
divEl.addEventListener("click", () => {
  console.log("事件冒泡:", "div被點(diǎn)擊");
});
spanEl.addEventListener("click", () => {
  console.log("事件冒泡:", "span被點(diǎn)擊");
});

bodyEl.addEventListener(
  "click",
  () => {
    console.log("事件捕獲:", "body被點(diǎn)擊");
  },
  true
);
divEl.addEventListener(
  "click",
  () => {
    console.log("事件捕獲:", "div被點(diǎn)擊");
  },
  true
);
spanEl.addEventListener(
  "click",
  () => {
    console.log("事件捕獲:", "span被點(diǎn)擊");
  },
  true
);
image.png
image.png
image.png

4、如果想拿到事件相關(guān)信息怎么辦?currentTarget和target區(qū)別?preventDefault、stopPropagation作用?

-【event】通過該對(duì)象可以拿到具體信息
-【currentTarget】當(dāng)前處理事件的元素;(一般用這個(gè))
-【target】當(dāng)前事件發(fā)生的元素;(一般不使用這個(gè))
-【preventDefault】取消事件的默認(rèn)行為;(比如表單驗(yàn)證失敗,阻止提交)
-【stopPropagation】阻止事件的捕獲或者冒泡;

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容