主頁 > 企業開發 > JavaScript DOM初學筆記

JavaScript DOM初學筆記

2020-10-22 02:55:24 企業開發

1. DOM簡介

1. 1 什么是DOM

檔案物件模型Document Object Model,簡稱 DOM),是 W3C組織推薦的處理可擴展標記語言(HTML 或者XML)的標準編程介面

1.2 DOM樹

HTML DOM Node Tree

檔案:一個頁面就是一個檔案,DOM中使用 document 表示
元素:頁面中的所有標簽都是元素,DOM 中使用 element 表示
節點:網頁中的所有內容都是節點(標簽、屬性、文本、注釋等),DOM 中使用 node 表示

DOM 把以上內容都看做是物件

2. 獲取元素

2.1 根據ID獲取

document.getElementById('id');

使用 console.dir() 可以列印我們獲取的元素物件,更好的查看物件里面的屬性方法

2.2 根據標簽名獲取

document.getElementsByTagName('標簽名'); 

得到的是一個物件的集合(偽陣列)

element.getElementsByTagName('標簽名'); 

父元素必須是單個物件(必須指明是哪一個元素物件),獲取的時候不包括父元素自己

2.3 根據HTML5 新增的方法獲取

document.getElementsByClassName(‘類名’);// 根據類名回傳元素物件集合 
document.querySelector('選擇器');        // 根據指定選擇器回傳第一個元素物件 
document.querySelectorAll('選擇器');     // 根據指定選擇器回傳 

querySelectorquerySelectorAll里面的選擇器需要加符號

比如:document.querySelector('#nav');

2.4 獲取特殊元素(body,html)

doucumnet.body  // 回傳body元素物件 
document.documentElement  // 回傳html元素物件 

3. 事件基礎

3.1 事件三要素

  1. 事件源 (誰)
  2. 事件型別 (什么事件)
  3. 事件處理程式 (做啥)

3.2 滑鼠事件

image

4. 操作元素

4.1 改變元素內容

element.innerText

從起始位置到終止位置的內容, 但它去除 html 標簽, 同時空格和換行也會去掉

element.innerHTML

起始位置到終止位置的全部內容,包括 html 標簽,同時保留空格和換行

4.2 常用元素的屬性操作

1. innerText、innerHTML 改變元素內容

2. src、href

3. id、alt、title

4.3 表單元素的屬性操作

type、value、checked、selected、disabled 

4.4 樣式屬性操作

element.style        行內樣式操作
element.className    類名樣式操作

JS 里面的樣式采取駝峰命名法 比如 fontSize、 backgroundColor
JS 修改 style 樣式操作,產生的是行內樣式,CSS 權重比較高
className 會直接更改元素的類名,會覆寫原先的類名

4.5 總結

image

4.6 自定義屬性的操作

4.6.1 獲取屬性值

element.屬性            // 獲取內置屬性值(元素本身自帶的屬性)
element.getAttribute('屬性');       // 主要獲得自定義的屬性(標準),程式員自定義的屬性

4.6.2 設定屬性值

element.屬性 = '值'         // 設定內置屬性值
element.setAttribute('屬性', '值');         // 主要設定自定義的屬性(標準)

4.6.3 移除屬性

element.removeAttribute('屬性');          // 自定義的屬性

4.7 H5自定義屬性

4.7.1 設定屬性

(1)H5規定自定義屬性data-開頭做為屬性名并且賦值

<div data-index="1"></div>

(2)使用 JS 設定

element.setAttribute(‘data-index’, 2)

4.7.2 獲取屬性

(1)兼容性獲取

element.getAttribute(‘data-index’);

(2)H5新增

element.dataset.index
element.dataset['index']     // ie 11才開始支持 

5. 節點操作

5.1 節點概述

元素節點 nodeType 為 1
屬性節點 nodeType 為 2
文本節點 nodeType 為 3 (文本節點包含文字、空格、換行等)
我們在實際開發中,節點操作主要操作的是元素節點

5.2 節點層級

5.2.1 父級節點

node.parentNode

parentNode 屬性可回傳某節點的父節點,注意是最近的一個父節點
如果指定的節點沒有父節點回傳 null

5.2.2 子節點

1. parentNode.childNodes(標準)     // 不提倡

回傳包含指定節點的子節點的集合,該集合為即時更新的集合,包含了所有的子節點,包括元素節點,文本節點等

2. parentNode.children(非標準)     // 各個瀏覽器支持

只讀屬性,回傳所有的子元素節點,它只回傳子元素節點,其余節點不回傳

第一個子元素節點:parentNode.chilren[0]

最后一個子元素節點:parentNode.chilren[parentNode.chilren.length - 1]


3. parentNode.firstChild

回傳第一個子節點,找不到則回傳null,包含所有的節點

4. parentNode.lastChild

回傳最后一個子節點,找不到則回傳null,包含所有的節點

5. parentNode.firstElementChild        // IE9 以上才支持

回傳第一個子元素節點,找不到則回傳null

6. parentNode.lastElementChild        // IE9 以上才支持

回傳最后一個子元素節點,找不到則回傳null

5.2.3 兄弟節點

1. node.nextSibling

回傳當前元素的下一個兄弟節點,找不到則回傳null,包含所有的節點

2. node.previousSibling

回傳當前元素的上一個兄弟節點,找不到則回傳null,包含所有的節點

3. node.nextElementSibling              // IE9 以上才支持

回傳當前元素下一個兄弟元素節點,找不到則回傳null

4. node.previousElementSibling          // IE9 以上才支持

回傳當前元素上一個兄弟元素節點,找不到則回傳null

5.3 創建節點

document.createElement('tagName')

創建由 tagName 指定的 HTML 元素,因為這些元素原先不存在,是根據我們的需求動態生成的,所以我們也稱為動態創建元素節點

5.4 添加節點

1. node.appendChild(child)

將一個節點添加到指定父節點的子節點串列末尾,類似于 CSS 里面的 after 偽元素

2. node.insertBefore(child, 指定元素) 

將一個節點添加到父節點的指定子節點前面,類似于 CSS 里面的 before 偽元素

5.5 洗掉節點

node.removeChild(child)

從 DOM 中洗掉一個子節點,回傳洗掉的節點

5.6 克隆節點

node.cloneNode()

如果括號引數為或者為 false ,則是淺拷貝,即只克隆復制節點本身,不克隆里面的子節點

如果括號引數為 true ,則是深度拷貝,會復制節點本身以及里面所有的子節點

5.7 三種動態創建元素區別

document.write()
element.innerHTML
document.createElement()
  1. document.write 是直接將內容寫入頁面的內容流,但是檔案流執行完畢,會導致頁面全部重繪

  2. innerHTML 是將內容寫入某個 DOM 節點,不會導致頁面全部重繪

  3. innerHTML 創建多個元素效率更高(不要拼接字串,采取陣列形式拼接),結構稍微復雜

  4. createElement() 創建多個元素效率稍低一點點,但是結構更清晰

詳情:
[三種創建元素的方式]
[innerHTML和createElement效率對比]

6. 注冊事件(系結事件)

6.1 注冊事件概述

6.2 addEventListener

eventTarget.addEventListener(type, listener[, useCapture]);

type:事件型別字串,比如 click 、mouseover ,注意這里不要帶 on
listener:事件處理函式,事件發生時,會呼叫該監聽函式
useCapture:可選引數,是一個布林值,默認是 false

6.3 attachEvent

eventTarget.attachEvent(eventNameWithOn, callback);                // IE8 及早期版本支持

eventNameWithOn:事件型別字串,比如 onclick 、onmouseover ,這里要帶 on
callback: 事件處理函式,當目標觸發事件時回呼函式被呼叫

6.4 注冊事件兼容性解決方案

function addEventListener(element, eventName, fn) {
    // 判斷當前瀏覽器是否支持 addEventListener 方法 
    if (element.addEventListener) {
        element.addEventListener(eventName, fn); // 第三個引數 默認是false 
    } else if (element.attachEvent) {
        element.attachEvent('on' + eventName, fn);
    } else {
        // 相當于 element.onclick = fn; 
        element['on' + eventName] = fn;
    }

7. 洗掉事件(解綁事件)

7.1 洗掉事件的方式

(1)傳統注冊方式

eventTarget.onclick = null;

(2)方法監聽注冊方式

eventTarget.removeEventListener(type, listener[, useCapture]);
eventTarget.detachEvent(eventNameWithOn, callback);

7.2 洗掉事件兼容性解決方案

function removeEventListener(element, eventName, fn) {
    // 判斷當前瀏覽器是否支持 removeEventListener 方法 
    if (element.removeEventListener) {
        element.removeEventListener(eventName, fn); // 第三個引數 默認是false 
    } else if (element.detachEvent) {
        element.detachEvent('on' + eventName, fn);
    } else {
        element['on' + eventName] = null;
    }

8. DOM事件流

事件流描述的是從頁面中接收事件的順序

事件發生時會在元素節點之間按照特定的順序傳播,這個傳播程序即 DOM 事件流

DOM 事件流分為3個階段:

  1. 捕獲階段
  2. 當前目標階段
  3. 冒泡階段

注意:

  1. JS 代碼中只能執行捕獲或者冒泡其中的一個階段

  2. onclickattachEvent只能得到冒泡階段

  3. addEventListener(type, listener[, useCapture])第三個引數如果是true,表示在事件捕獲階段調用事件處理程式;

    如果是false(不寫默認就是false),表示在事件冒泡階段呼叫事件處理 程式

  4. 實際開發中我們很少使用事件捕獲,我們更關注事件冒泡

  5. 有些事件是沒有冒泡的,比如onbluronfocusonmouseenteronmouseleave

  6. 事件冒泡有時候會帶來麻煩,有時候又會幫助很巧妙的做某些事件

9. 事件物件

9.1 什么是事件物件

eventTarget.onclick = function(event) {}
eventTarget.addEventListener('click', function(event) {});
  // 這個 event 就是事件物件,我們還喜歡的寫成 e 或者 evt  

官方解釋:event物件代表事件的狀態,比如鍵盤按鍵的狀態、滑鼠的位置、滑鼠按鈕的狀態
簡單理解:事件發生后,跟事件相關的一系列資訊資料的集合都放到這個物件里面,這個物件就是事件物件event,它有很多屬性和方法

9.2 事件物件的使用語法

eventTarget.onclick = function(event) {}
eventTarget.addEventListener('click', function(event) {});

event是個形參,系統幫我們設定為事件物件,不需要傳遞實參過去
當我們注冊事件時,event物件就會被系統自動創建,并依次傳遞給事件監聽器(事件處理函式)

9.3 事件物件的兼容性方案

e = e || window.event;

9.4 事件物件的常見屬性和方法

e.targetthis 的區別

10. 阻止事件冒泡

10.1 阻止事件冒泡的兩種方式

  1. 標準寫法:利用事件物件里面的stopPropagation()方法

    e.stopPropagation();
    
  2. 非標準寫法:IE 6-8 利用事件物件cancelBubble屬性

    e.cancelBubble = true;
    

10.2 阻止事件冒泡的兼容性解決方案

if (e && e.stopPropagation) {
    e.stopPropagation();
} else {
    window.event.cancelBubble = true;
}

11. 事件委托(代理、委派)

事件委托也稱為事件代理, 在 jQuery 里面稱為事件委派

原理:

不是每個子節點單獨設定事件監聽器,而是事件監聽器設定在其父節點上,然后利用冒泡原理影響設定每個子節點

<ul>
    <li>123</li>
    <li>123</li>
    <li>123</li>
    <li>123</li>
    <li>123</li>
</ul>
// 給 ul 注冊點擊事件,然后利用事件物件的 target 來找到當前點擊的 li,因為點擊 li,事件會冒泡到 ul 上, ul 有注冊事件,就會觸發事件監聽器

作用:

只操作了一次 DOM ,提高了性能

12. 常用的滑鼠事件

12.1 滑鼠事件

禁止滑鼠右鍵選單:

document.addEventListener('contextmenu', function(e) {
    e.preventDefault();
});

禁止滑鼠選中:

document.addEventListener('selectstart', function(e) {
    e.preventDefault();
});

12.2 滑鼠事件物件

13. 常用的鍵盤事件

13.1 鍵盤事件

注意給檔案document添加鍵盤事件

onkeypress和前面2個的區別是,它不識別功能鍵,比如左右箭頭,shift

13.2 鍵盤事件物件

onkeydownonkeyup不區分字母大小寫,onkeypress區分字母大小寫

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

標籤:其他

上一篇:jquery動態輸入

下一篇:模塊二:ES新特性與TypeScript、JS性能優化

標籤雲
其他(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