主頁 > 企業開發 > JavaScrip 之 DOM (回顧)

JavaScrip 之 DOM (回顧)

2020-10-08 06:01:22 企業開發

DOM 樹

HTML 檔案的骨干是標簽,
根據檔案物件模型(DOM),每個HTML標簽都是一個物件,同樣標簽內的文本也是一個物件,因此這些物件都可通過 JavaScript 操作
如果檔案中有空格(就像任何字符一樣),那么它們將成為 DOM 中的文本節點,如果我們洗掉它們,則不會有任何內容,
<head> 之前的空格和換行符被忽略
</body> 之后放置了一些東西,那么它會自動移動到 body 內部,因為 HTML 規范要求所有內容必須位于 <body> 內,所以 </body> 后面可能沒有空格,

通常再瀏覽器中的文本不會顯示開頭/結尾的空文本節點,標簽之間也不會顯示空文本節點,

如果瀏覽器遇到格式不正確的HTML,在形成DOM是會自動修復它
如:
<html> 即使不在檔案中,瀏覽器也會自動創建它

按DOM規范,table 必須具有 <tbody>,因此table中未使用<tbody> 形成DOM時會自動添加,

其它 節點:
注釋不會以任何方式影響視覺表示,但是必須遵循一條規則 —— 如果HTML中有東西,那么它必須在DOM樹中,
HTML中所有內容都是DOM的一部分,
注釋是一個節點甚至<!DOCTYPE...>也是一個節
DOM總有12種節點

遍歷DOM節點

所有對DOM的操作都是從document物件開始,將這個物件賦予一個變數,對其進行修改操作

最頂端的節點

DOM節點樹可以通過 document屬性使用
頂端的節點對應<html> 并且 <html> = document.documentElement
<body> = document.body,<head> = document.head
docment.body可能為null,如果將script腳本放入 <head>標簽種,那么此腳本無法訪問到document.body,即為null

childNodes

childNodes 集合提供對所有子節點包括文本節點的訪問,它看起來是一個數字,實際上只是一個可迭代的類陣列物件,因此沒有陣列的方法
所有的Dom 集合節點都是只讀的無法通過賦值來替換對應的節點
除小部分節點,幾乎所有的DOM集合都是實時的,它們反應的是DOM的實時狀態
不要是有 for...in來遍歷DOM集合,此方法會列出其所有的屬性,
注意此屬性只能訪問到當前script腳本之前對應的節點
可以通過elem.hasChildNodes()來檢測是否含有子節點

parentNOde / siblingNode

通過elem.parentNode可訪問當前節點的父節點
通過elem.previousSibling/elem.nextSibling可訪問對應節點的上/下兄弟節點

只訪問元素節點

  • children: 只獲取型別為元素節點的子節點
  • firstElementChild,lastElementChild:只獲取第一或最后一個子元素
  • previousElementSibling, nextElementSibling:兄弟元素
  • parentElement:父元素

parentElement 可能為null,因為其方法回傳的是父元素節點,而parentNode回傳的是任何型別的父節點,因此,document.documentElement.parentElement === null

HTMLCollection (動態)

通過元素查找子元素如果子元素是一個集合將回傳 HTMLCollection 類陣列

let tb = documet.querySelector('table')
let tbs = tb.tBodies  // HTMLCollection [tbody]
let trs =tbs.rows // HTMLCollection [tr,tr,tr,...]
let tr1 = trs[0]
    tr1.sectionRowIndex //0 當前 tr 在集合中的位置
    tr1.rowIndex // 1 當前 tr 在整張表中的 位置
let tds = tr1.cells // HTMLCollection [td,td,td,...]
    td[0].cellIndex //0 當前 td 在父元素 tr節點 中的位置

NodeList (靜態 如果使用回圈創建查詢的元素,新的元素不會實時加入到NodeList中)

通過 document 中的方法 document.querySelectorAllelem.querySelectorAll獲取的元素集合將回傳NodeList類陣列
getElement* 方法只能通過 document物件呼叫

let divs = document.querySelectorAll('div') // NodeList(4) [div.Owen, div#modal, div.main, div]
 document.getElementsByTagName('div')//HTMLCollection [div.Owen]

matches

elem.matches(css)會檢測 elem是否匹配到給定的css選擇器,回傳 true 或 false

closest

elem.closest(css)此方法會查找css選擇器匹配到的祖先HTML,包括自身,并回傳最先找到的元素

contains

elem.catains(dom) 判斷 dom 是否為 elem 的后代,或等于elem,回傳true 或false

節點屬性

所有的節點都繼承自根節點 EventTarget

  • EventTarget:作為基礎,讓所有DOM 節點都支持事件
  • Node:作為DOM 節點的基礎,提供DOM樹的核心功能:parentNodenextSiblingpreviousSiblingChildNodes等(只能讀取 getter);文本節點 Text,元素節點Element,注釋節點Comment都繼承自Node
  • Element:做為DOM 元素的基類,提供元素級導航: nextElementSiblingchildrengetElement*querySelector等等,瀏覽器不僅支持HTML,還支持 XML、SVG等,分別對應的基類 HTMLElementXMLElementSVGElement
  • HTMLElement:作為所有元素的基類,被各種元素繼承
innerHTML 和 outerHTML
  • innerHTML: 獲取或替換當前節點的所有子節點(不包含當前節點)
  • outerHTML: 替換當前節點

檔案片段 DocumentFragment

用于存盤節點的包裝器,不會再瀏覽器中展示,需要通過插值方法才能展示包裝器里面的內容

function creatEl(){
let frag = new DocumentFragment();
 for (let i=1;i<4;i++) {
let li = document.createElement('li')
  li.append(i)
  frag.append(li)
}

return frag
}
ul.append(creatEl())

類樣式的修改等操作

elem.className 對應元素的類名,多個類目以空格分隔

ul.className // "class1 class2 ..."

同時還要一個 elem.classList 物件可訪問類名,它以類陣列的方式存在,同時具有 add/remove/toggle/contains 等方法

ul.classList //  DOMTokenList(2) ["333", "444", value: "333 444"]
ul.classList.add('class1')
ul.classList.remove('class1')
ul.classList.toggle('class1') // true 新增
ul.classList.toggle('class1') // false 去除
ul.classList.contains('class1') //false 是否包含

通常我們使用 style.*單獨對樣式屬性進行修改,如果想要對多種樣式進行調整可使用 cssText此方法會直接替換之前的樣式

ul.style.cssText = `
    color: red ;
    background-color: skyblue;
    width: 20px;
    text-align: center;`

style 屬性僅針對 style 屬性值進行操作,無法讀取css類中的屬性值

<style>
body {margin:20 auto;}
</style>
<script>
document.body.style.margin // ""
</script>

這時我們需要使用 getComputedStyle(el,[,pseudo])方法來獲取對應的值
如果不傳參或值無意義,將回傳元素所有樣式,其屬性值都為決議值,如 font-size:1em 最后獲取的可能為決議后的值"16px"

let res = getComputedStyle(document.body)
res.marginTop // "20px"
res.margin // 谷歌 "20px 0px" 在火狐中為 ""  因此訪問確切屬性值須使用完整屬性名


獲取元素的尺寸和滾動距離

  • offsetTop/Left: 獲取相對于設定有position屬性為 absolute relative、fixed 的值或td、th、table、body的元素的距離
  • offsetWidth/Height:獲取外部寬度/高度,包含border,padding,scrollbar (display:none 或自身不在檔案中,其值為0或null,由此可判斷當前元素是否被隱藏)
  • clientTop/Left:獲取內側與外側的距離(滾動條在左邊時,包含滾動條的寬度)
  • clientWidth/Height:獲取可視區內容的寬高,即不包含滾動條和border
  • scrollWidth/Height:獲取全部內容(包含隱藏部分)的寬高
  • scrollTop/Left: 獲取 元素隱藏部分的上/左距離,包含border,這兩個屬性可修改,其它屬性能只讀取

HTML 檔案里如果沒有 <!DOCTYPE HTML> 上述的屬性可能會有所不同,這不是一個 JavaScript 的問題,但會影響到 JavaScript,

滾動瀏覽器視窗

pageXOffset/pageYOffset: 獲取可視視窗移動的距離 無法設值

可通過 window.scrollBy, window.scrollTo, elem.scrollIntoView來滾動視窗

  • scrollBy(x,y):滾動頁面至相對于現在位置的(x,y)位置
  • scrollTo(x,y):滾動到頁面相對于檔案左上方的(x,y),位置,類似于 scrollTop/scrollLeft
  • elem.scrollIntoView(truly):如果 truly 為真則使 當前元素 滾動至視窗頂部,元素頂部與視窗頂部對齊,如果truly 為false,則當前元素底部與視窗底部對齊,

如果禁止視窗滾動可使 樣式屬性 overflow 值為 hidden

坐標

getBoundingClientRect()`方法獲取相對于可視視窗的坐標物件

其所有屬性都是以可視視窗左端(X)和頂部(Y)為起點

ul.getBoundingClientRect()
/*

DOMRect {
    bottom: 829.59375  // 元素底部的Y坐標
    height: 210  // 元素真實高度
    left: 0 // 元素左邊 X 坐標
    right: 1903 // 元素右邊 X 坐標
    top: 619.59375 // 元素頂部 Y 坐標
    width: 1903 // 元素自身真實寬度即不包含滾動條
    x: 0
    y: 619.59375
}

*/
document.elementFromPoint

document.elementFromPoint(x,y)回傳可視視窗坐標(x,y),最頂層的元素

let elem = document.elementFromPoint(0,0) // <p>556666</p>

如果x,y不在正常范圍內將回傳 null,

相對于檔案坐標,JS并未提供原生標準方法,可自己寫一個出來:
function getDomCoords(el){
    let {top,left} = el.getBoundingClientRect()
  return {
    top:top+ window.pageYOffset,
    left:left+window.pageXOffest
  }
}

Owen 的個人博客
博客園

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/162514.html

標籤:JavaScript

上一篇:javascript for回圈+異步請求導致請求順序不一致

下一篇:vue組件初始化程序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more