20道DOM相關前端面試題

DOM 相關面試題及答案

  1. 什么是 DOM?DOM 樹的結構是怎樣的?

    DOM(文檔對象模型,Document Object Model)是 HTML/XML 文檔的編程接口,將文檔結構化為樹形節點集合,允許程序動態訪問和修改文檔內容、結構和樣式。

    DOM 樹結構:以document為根節點,包含htmlheadbody等元素節點,元素內的文本為文本節點,屬性為屬性節點,節點間存在父子、兄弟關系(如bodyhtml的子節點,divp可能是兄弟節點)。

  2. DOM 節點有哪些類型?如何區分它們?

    常見 DOM 節點類型:
    ① 元素節點(Node.ELEMENT_NODE,值為 1,如<div>);
    ② 文本節點(Node.TEXT_NODE,值為 3,如標簽內的文本);
    ③ 屬性節點(Node.ATTRIBUTE_NODE,值為 2,元素的屬性);
    ④ 注釋節點(Node.COMMENT_NODE,值為 8,<!-- 注釋 -->);
    ⑤ 文檔節點(Node.DOCUMENT_NODE,值為 9,即document)。

    區分方式:通過節點的nodeType屬性判斷(如element.nodeType === 1表示元素節點)。

  3. 如何獲取 DOM 元素?請列舉至少 5 種方法。

  • document.getElementById('id'):通過 ID 獲取唯一元素(效率高)。

  • document.getElementsByClassName('class'):通過類名獲取元素集合(HTMLCollection,動態更新)。

  • document.getElementsByTagName('tag'):通過標簽名獲取元素集合(HTMLCollection)。

  • document.querySelector(selector):通過 CSS 選擇器獲取第一個匹配元素。

  • document.querySelectorAll(selector):通過 CSS 選擇器獲取所有匹配元素(NodeList,靜態集合)。

  • document.getElementsByName('name'):通過name屬性獲取元素集合(如表單元素)。

  • 元素節點方法:parentNode.children(獲取子元素)、element.querySelector()(獲取子元素)。

  1. 什么是 DOM 的節點屬性nodeValuetextContent?它們有什么區別?
  • nodeValue:返回或設置節點的值,僅對文本節點、注釋節點有效(元素節點的nodeValuenull)。

  • textContent:返回或設置元素及其所有后代的文本內容(忽略 HTML 標簽,僅保留文本)。

    區別:
    ① 適用節點:nodeValue針對文本 / 注釋節點,textContent針對元素節點;
    ② 范圍:textContent包含所有后代文本,nodeValue僅當前節點文本。

    示例:<div>hello <span>world</span></div>中,div.textContent"hello world"div.firstChild.nodeValue"hello "

  1. 如何創建、添加和刪除 DOM 節點?
  • 創建節點:

  • document.createElement(tagName):創建元素節點(如 document.createElement('div'));

  • document.createTextNode(text):創建文本節點;

  • document.createComment(comment):創建注釋節點。

  • 添加節點:

  • parentNode.appendChild(child):添加到父節點末尾;

  • parentNode.insertBefore(newNode, referenceNode):插入到參考節點之前;

  • element.replaceChild(newNode, oldNode):替換子節點。

  • 刪除節點:parentNode.removeChild(child):從父節點中刪除子節點(需先獲取父節點);或child.remove()(直接刪除自身,IE 不支持)。

  1. 什么是 DOM 的事件流?它包含哪些階段?

    DOM 事件流指事件從產生到處理的完整過程,分為三個階段:
    ① 事件捕獲階段:事件從window向下傳播到目標元素;
    ② 目標階段:事件到達目標元素;
    ③ 事件冒泡階段:事件從目標元素向上傳播到window

    示例:點擊div內部的span,捕獲階段為window → document → html → body → div,目標階段為span,冒泡階段為span → div → body → html → document → window

  2. 如何阻止事件冒泡和事件默認行為?

  • 阻止事件冒泡:

  • ① 標準瀏覽器:event.stopPropagation()

  • ② IE8 及以下:event.cancelBubble = true

  • 阻止默認行為(如鏈接跳轉、表單提交):

  • ① 標準瀏覽器:event.preventDefault()

  • ② IE8 及以下:event.returnValue = false

  • ③ 函數中返回false(僅在onxxx屬性中有效,如<a href="#" onclick="return false">)。

    注意:event.stopImmediatePropagation()可同時阻止冒泡和當前元素后續事件監聽器執行。

  1. 什么是事件委托?它的原理和優勢是什么?

    事件委托指將子元素的事件監聽器綁定到父元素,利用事件冒泡觸發父元素的監聽器,再通過event.target判斷具體子元素。

    原理:事件冒泡機制(子元素事件會向上傳播到父元素)。

    優勢:
    ① 減少事件監聽器數量(尤其列表等動態元素),優化性能;
    ② 自動支持動態添加的子元素(無需重新綁定事件)。

    示例:

ul.addEventListener('click', (e) => {if (e.target.tagName === 'LI') { // 判斷點擊的是liconsole.log(e.target.textContent);}});
  1. event.targetevent.currentTarget的區別是什么?
  • event.target:觸發事件的具體元素(事件源,如點擊列表中的某個litarget是該li)。

  • event.currentTarget:綁定事件監聽器的元素(如事件綁定在ul上,currentTargetul)。

    區別:target是實際觸發事件的元素,currentTarget是事件綁定的元素(this在監聽器中等于currentTarget)。

  1. 如何獲取元素的樣式?element.stylegetComputedStyle有什么區別?
  • element.style:獲取或設置元素的內聯樣式(style屬性中的樣式),僅能獲取內聯樣式,返回值帶單位(如"10px")。

  • getComputedStyle(element):獲取元素的計算樣式(包含內聯、內部、外部樣式,最終渲染的樣式),返回CSSStyleDeclaration對象,IE8 及以下用element.currentStyle

    區別:
    ① 范圍:style僅內聯,getComputedStyle包含所有樣式;
    ② 可寫性:style可讀寫,getComputedStyle只讀;
    ③ 偽元素:getComputedStyle可獲取偽元素樣式(如getComputedStyle(div, '::before'))。

  1. 什么是 DOM 重繪(Repaint)和回流(Reflow)?如何減少它們的發生?
  • 重繪:元素樣式改變但不影響布局(如colorbackground),瀏覽器重新繪制元素,開銷較小。

  • 回流(重排):元素布局改變(如widthposition、添加子元素),瀏覽器重新計算布局,開銷較大(可能觸發多個元素的重繪)。

    減少方法:
    ① 合并樣式修改(如用class替換多個style屬性);
    ② 操作脫離文檔流的元素(如display: none后修改,再顯示);
    ③ 使用documentFragment批量添加節點;
    ④ 避免頻繁讀取offsetWidth等布局屬性(緩存結果);
    ⑤ 用transformopacity實現動畫(僅觸發合成,無回流)。

  1. 如何獲取元素的偏移量、客戶區大小和滾動偏移量?
  • 偏移量(相對于 offsetParent):

  • element.offsetTop:上邊緣距離;

  • element.offsetLeft:左邊緣距離;

  • element.offsetWidth:寬度(含邊框、內邊距);

  • element.offsetHeight:高度(含邊框、內邊距)。

  • 客戶區大小(元素可視區域):

  • element.clientWidth:寬度(含內邊距,不含邊框、滾動條);

  • element.clientHeight:高度(同上);

  • element.clientTop:上邊框寬度;

  • element.clientLeft:左邊框寬度。

  • 滾動偏移量:

  • element.scrollTop:元素內容向上滾動的距離;

  • element.scrollLeft:元素內容向左滾動的距離;

  • element.scrollWidth:內容總寬度(含不可見部分);

  • element.scrollHeight:內容總高度(含不可見部分)。

  1. documentFragment的作用是什么?它有什么優勢?

    documentFragment是輕量級文檔對象,用于臨時存儲 DOM 節點,不屬于 DOM 樹。

    作用:批量操作 DOM 時,先將節點添加到documentFragment,再一次性插入 DOM 樹,減少回流次數。

    優勢:
    ① 減少回流(多次添加節點變為一次);
    ② 不影響頁面渲染(未插入 DOM 樹時不可見)。

    示例:

const fragment = document.createDocumentFragment();for (let i = 0; i < 100; i++) {const li = document.createElement('li');fragment.appendChild(li);}ul.appendChild(fragment); // 僅觸發一次回流
  1. 如何判斷一個元素是否包含另一個元素?
  • element.contains(otherElement):返回布爾值,判斷otherElement是否為element的后代(包括自身)。

  • 比較node.parentNode:遞歸向上查找父節點,判斷是否等于目標元素。

    示例:document.body.contains(div) → 判斷div是否在body內。

  1. 什么是 DOM 遍歷?常用的 DOM 遍歷方法有哪些?

    DOM 遍歷指按一定順序訪問 DOM 樹中的節點。

    常用方法:
    parentNode:獲取父節點;
    childNodes:獲取所有子節點(NodeList,含文本、注釋節點);
    children:獲取所有子元素節點(HTMLCollection);
    firstChild/lastChild:第一個 / 最后一個子節點;
    firstElementChild/lastElementChild:第一個 / 最后一個子元素;
    nextSibling/previousSibling:下一個 / 上一個兄弟節點;
    nextElementSibling/previousElementSibling:下一個 / 上一個兄弟元素。

  2. 如何克隆 DOM 節點?cloneNode的參數有什么作用?

    使用element.cloneNode(deep)克隆節點,參數deep為布爾值:
    deep = true:深度克隆,復制節點及其所有后代;
    deep = false:淺克隆,僅復制節點本身,不包含后代。

    注意:
    ① 克隆節點不包含事件監聽器(除非用addEventListener綁定且瀏覽器支持);
    ② 克隆的元素沒有父節點,需手動添加到 DOM 樹;
    ③ ID 屬性會被復制,可能導致文檔中 ID 重復(需手動修改)。

  3. 什么是 DOMParser 和 XMLSerializer?它們的作用是什么?

    作用:在不操作頁面 DOM 的情況下,處理字符串形式的 HTML/XML(如動態生成 DOM 結構)。

  • DOMParser:將 XML 或 HTML 字符串解析為 DOM 文檔。

    示例:

const parser = new DOMParser();const doc = parser.parseFromString('\<div>hello\</div>', 'text/html');const div = doc.body.firstChild;
  • XMLSerializer:將 DOM 節點序列化為 XML 或 HTML 字符串。

    示例:

const serializer = new XMLSerializer();const htmlString = serializer.serializeToString(div); // '\<div>hello\</div>'
  1. 如何檢測 DOM 節點的可見性?
  • 方法 1:檢查offsetParent是否為null(隱藏元素的offsetParent通常為null,但position: fixed元素例外)。

  • 方法 2:通過計算樣式判斷:

function isVisible(element) {const style = getComputedStyle(element);return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';}
  • 方法 3:使用IntersectionObserver監測元素是否進入視口(可見于頁面)。
  1. 什么是 DOM Level 0、Level 1、Level 2、Level 3?它們的主要區別是什么?

    DOM 標準分為多個級別,逐步擴展功能:

  • Level 0:非官方標準,指早期瀏覽器支持的基本 DOM 操作(如element.innerHTMLonclick事件)。

  • Level 1:1998 年發布,分為 Core(核心,處理 XML)和 HTML(擴展 HTML),定義基本節點操作(如getElementById)。

  • Level 2:2000 年發布,新增事件模型(捕獲 / 冒泡、addEventListener)、樣式操作(getComputedStyle)、遍歷 API 等。

  • Level 3:2004 年發布,新增 XPath 支持、事件類型擴展(如鍵盤事件)、加載 / 保存模塊等。

    現代瀏覽器主要支持 Level 2 和 Level 3 的核心功能。

  1. 如何優化 DOM 操作的性能?
  • 減少回流重繪:

  • ① 批量修改樣式(用class或脫離文檔流操作);

  • ② 緩存布局屬性(如const width = element.offsetWidth);

  • ③ 使用transform/opacity實現動畫。

  • 減少 DOM 查詢:

  • ① 緩存查詢結果(const div = document.querySelector('div'));

  • ② 避免在循環中查詢 DOM。

  • 批量添加節點:

  • ① 使用documentFragment

  • ② 先element.innerHTML拼接字符串,再一次性渲染。

  • 避免深層嵌套:簡化 DOM 結構,減少遍歷層級。

  • 使用高效選擇器:優先用getElementByIdquerySelector(基于 CSS 選擇器引擎,效率高)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93367.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CVE-2021-4300漏洞復現

Adminer是一個PHP編寫的開源數據庫管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等數據庫。在其版本1.12.0到4.6.2之間存在一處因為MySQL LOAD DATA LOCAL導致的文件讀取漏洞。 一、偽造服務器 利用mysql-fake-serve…

【LeetCode題解】LeetCode 35. 搜索插入位置

【題目鏈接】 35. 搜索插入位置 【題目描述】 【題解】 通過題目可以知道這是一道經典的二分查找的題目&#xff0c;對于二分查找的題目&#xff0c;根據需要查找的兩個邊界點&#xff0c;分為兩個不同的模板&#xff0c;如下圖所示。 這道題要求在數組中查找目標值并返回其索…

RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理

文章目錄1、前言2、目標3、安裝RKNN-ToolKit-lite23.1、安裝環境3.2、安裝RKNN-ToolKit-lite23.3、驗證4、完整的測試程序5、運行測試程序6、程序拆解7、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 之前提到過&#xff0c;RKNN-Toolkit2-…

二分查找。。

1 二分查找二分查找前提是數組有序。先令&#xff0c;left 0 , right 7mid (right left) / 2;如果mid的值大于要查找的值&#xff0c;則right mid - 1&#xff1b;如果小于&#xff0c;left mid 1&#xff1b;如果mid的值等于要查找的值&#xff0c;查找成功。重復步驟2…

Spring Ai 如何配置以及如何搭建

Spring Ai 如何配置以及如何搭建 解釋什么是Spring ai 首先&#xff0c;我們用Spring ai 其實不是去了解他的LLM,以及底層用的一些東西&#xff0c;Spring AI,提供給我們的其實是對各種大模型快速調用&#xff0c;提供了大模型API的作用&#xff0c;Spring AI 的核心定位是提…

FCC認證三星XR頭顯加速全球量產,微美全息AI+AR技術引領智能眼鏡硬件創新

據悉&#xff0c;三星(SSNGY.US)XR頭顯Project Moohan目前已獲得美國FCC認證&#xff0c;FCC認證表明該款頭顯即將上市&#xff0c;之前三星財報會議也表明確認將于今年年底推出XR頭顯。此前有報道稱&#xff0c;該設備將采用索尼旗艦級 OLEDoS 顯示屏&#xff0c;像素密度高達…

洛谷P1595講解(加強版)+錯排講解

前言接我原先的文章&#xff0c;因為一場考試&#xff0c;讓我對這道題記憶深刻注&#xff1a;&#xff08;因為那道題&#xff0c;所以80分&#xff09;正文1.分析題目題目&#xff1a;某人寫了 n 封信和 n 個信封&#xff0c;如果所有的信都裝錯了信封。求所有信都裝錯信封共…

提升化工制造質量的 7 種方法

盡管化工制造屬于制造業的一個子類別&#xff0c;但它是一個廣泛的范疇&#xff0c;涵蓋了基礎化學品、樹脂和合成纖維、農藥和化肥、涂料和粘合劑&#xff0c;甚至消費類化合物&#xff08;如肥皂和清潔化學品&#xff09;等所有領域。盡管這些細分領域差異巨大&#xff0c;但…

從“數據壟斷”到“全民共建”:Dataparts如何重構智能時代的數據流通規則?

從“數據壟斷”到“全民共建”&#xff1a;Dataparts如何重構智能時代的數據流通規則&#xff1f;在杭州某科技園區的會議室里&#xff0c;一場關于“AI大模型訓練數據”的討論正在激烈進行。某頭部AI企業的技術總監指著屏幕上的“對話場景零件庫”說&#xff1a;“過去我們花3…

31 HTB Union 機器 - 中等難度

第一階段 偵查nmap掃描oxdfparrot$ nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.128 Starting Nmap 7.80 ( https://nmap.org ) at 2021-11-19 08:29 EST Nmap scan report for 10.10.11.128 Host is up (0.092s latency). Not shown: 65534 filtered ports POR…

【數據分享】上市公司創新韌性數據(2007-2023)

數據介紹核心看點&#xff1a; 在復雜多變的市場環境中&#xff0c;企業如何通過創新維持競爭力&#xff1f;創新韌性是衡量企業在外部沖擊下保持創新活力的關鍵指標。本文分享2007-2023年上市公司創新韌性數據&#xff0c;為研究企業抗風險能力提供核心支持。數據概覽數據名稱…

服務器配置開機自啟動服務

一、配置啟動文件sudo vim /etc/systemd/system/smartailab-backend.service sudo vim /etc/systemd/system/reall3d-frontend.servicesudo vim /etc/systemd/system/Culture_Liquor-backend.servicevim /etc/systemd/system/Culture_Liquor-backend.service內容&#xff1a;[U…

Ubuntu 25.04更新了哪些內容揭秘

2025年4月,Canonical正式推出Ubuntu 25.04 版本,代號"Plucky Puffin(勇敢的海鸚)"。此次發布圍繞AI算力強化、桌面交互革新與跨架構支持三大核心方向展開,為開發者、創作者及企業用戶帶來多項突破性升級。 一、核心系統更新 systemd v257.4帶來了重要的上游更新…

PHP反序列化的CTF題目環境和做題復現第2集_POP鏈構造

1 通過pop參數get方式提交反序列信息 2 題目 http://192.168.1.8/fxl2/fxl2_pop.php <?php highlight_file(__FILE__);class a {protected $var;public function hello(){echo $this->var;} }class b {public $cla;public function __destruct(){$this->cla->…

攻防世界—fakebook(兩種方法)

一.審題這邊先進行測試&#xff0c;login和join都失敗了&#xff0c;所以沒獲取到什么消息。二.dirsearch工具掃描所以拿dirsearch掃一下&#xff0c;看看有沒有什么文件可以訪問。python3 dirsearch.py -u url可以看到當前目錄下存在flag.php,robots.txt等&#xff0c;訪問fla…

AI+物聯網如何重塑倉儲供應鏈?3個落地場景與系統架構設計思路

一、引言 在科技飛速發展的當下&#xff0c;AI與物聯網技術的融合為倉儲供應鏈領域帶來了革新契機。這種融合不僅優化了傳統運作模式&#xff0c;還催生出更智能、高效的管理方案&#xff0c;業財一體管理軟件也在其中發揮著關鍵作用。 二、AI物聯網在倉儲供應鏈的落地場景 &am…

C++ 內存管理(內存分布 , 管理方式 , new和delete實現原理)

目錄 1. C/C內存分布 練習: 2. C語言動態內存管理方式 2.1 malloc/calloc/realloc的區別 2.2 malloc的實現原理 2.3 內存塊分布與擴容 3. C動態內存管理方式 3.1 new/delete操作類內置類型 1. new操作內置類型 2. delete操作內置類型 3.2 new/delete操作類自定義類型…

1.2. qemu命令起虛擬機增加網絡配置

1. 網絡配置 常見的網絡模式分為tap網絡和基礎網絡模式兩種。 1.1. TAP網絡&#xff08;橋接模式&#xff09; 虛擬機直接接入宿主機物理網絡&#xff0c;獲得獨立IP 1.1.1. 使用tap方式起虛擬機網絡-netdev tap,idhostnet0,ifnametap0 \-device virtio-net-pci,netdevhostnet0…

分享一個Oracle表空間自動擴容與清理腳本

一、基礎環境準備&#xff08;首次執行&#xff09; -- 1. 創建表空間監控表&#xff08;存儲使用率、容量等信息&#xff09; create table monitor_tablespace_rate (tbs_name varchar2(50), -- 表空間名total_gb number, -- 總容量(GB)used_gb number, …

Flink Sql 按分鐘或日期統計數據量

一、環境版本 環境版本Flink1.17.0Kafka2.12MySQL5.7.33 【注意】Flink 1.13版本增加Cumulate Window&#xff0c;之前版本Flink Sql 沒有 Trigger 功能&#xff0c;長時間的窗口不能在中途觸發計算&#xff0c;輸出中間結果。比如每 10S 更新一次截止到當前的pv、uv。只能用T…