目錄
為何寫這篇文章?
EventTarget
定義
作用
該介面的方法
EventTarget.addEventListener()
EventTarget.removeEventListener()
EventTarget.dispatchEvent()
我們自己實作EventTarget
Node
有那些介面重Node繼承其方法和屬性?
介面相關的屬性和方法
屬性
Node.baseURI
Node.childNodes
Node.firstChild
Node.lastChild
方法
Node.appendChild()
Node.contains()
Node.cloneNode()
Element
說明
Element.assignedSlot
#Element.attributes
Element.classList
Element.className
Element.closest()
Element.getAttribute()
Element.getElementsByClassName()
HTMLElement
屬性
Event handlers
" >只有透過上面的繼承關係,我們得到的DOM 元素才是完整的HTML 對象,我們才能為它設定/取得屬性、綁定事件、新增樣式類別等操作。
首頁 web前端 html教學 一個完整的HTML物件是什麼樣的,如何產生?

一個完整的HTML物件是什麼樣的,如何產生?

Jul 30, 2018 pm 05:28 PM
html5 javascript

對html對象,首先要先提到Node節點,Node是一個接口,許多DOM類型從這個接口繼承,並允許類似地處理(或測試)這些各種類型。有那些介面重Node繼承其方法和屬性?先看看本文章吧。 apache php mysql

為何寫這篇文章?

你可能做Web開發已經有一段時間,你有沒有想過下列問題呢?
為什麼p元素甚至是所有的html元素都可以使用addEventListener來新增事件?
為什麼每個DOM節點都有parentNode、firstChild、nodeType等屬性呢?
為什麼每個DOM元素都有className、classList、innerHTML等屬性呢?
為什麼有些DOM元素有accessKey、contentEditable、isContentEditable等屬性呢?
為什麼每個DOM元素都有onclick、ondblclick、ondrag等屬性?
本文就是來解答這些簡單又不「簡單」的問題。

EventTarget

定義

EventTarget 是一個由可以接收事件的物件實現的接口,並且可以為它們建立偵聽器。

作用

Element,document 和 window 是最常見的事件目標,但其他物件也可以是事件目標,例如XMLHttpRequest,AudioNode,AudioContext 等等。
許多事件目標(包括元素,文件和 window)也支援透過 onXXX(如onclick) 屬性和屬性設定事件處理程序。

該介面的方法

EventTarget.addEventListener()

在EventTarget上註冊特定事件類型的事件處理程序。

EventTarget.removeEventListener()

EventTarget中刪除事件偵聽器。

EventTarget.dispatchEvent()

將事件分派到此EventTarget。

我們自己實作EventTarget

var EventTarget = function() {
  this.listeners = {};
};

EventTarget.prototype.listeners = null;
EventTarget.prototype.addEventListener = function(type, callback) {
  if (!(type in this.listeners)) {
    this.listeners[type] = [];
  }
  this.listeners[type].push(callback);
};

EventTarget.prototype.removeEventListener = function(type, callback) {
  if (!(type in this.listeners)) {
    return;
  }
  var stack = this.listeners[type];
  for (var i = 0, l = stack.length; i < l; i++) {
    if (stack[i] === callback){
      stack.splice(i, 1);
      return;
    }
  }
};

EventTarget.prototype.dispatchEvent = function(event) {
  if (!(event.type in this.listeners)) {
    return true;
  }
  var stack = this.listeners[event.type].slice();

  for (var i = 0, l = stack.length; i < l; i++) {
    stack[i].call(this, event);
  }
  return !event.defaultPrevented;
};
登入後複製

Node

定義

#Node是一個接口,許多DOM類型從這個介面繼承,並允許類似地處理(或測試)這些各種類型。 Node是一個接口,許多DOM類型從這個接口繼承,並允許類似地處理(或測試)這些各種類型。

有那些介面重Node繼承其方法和屬性?

Document, Element, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference
PS:在方法和屬性不相關的特定情況下,這些介面可能傳回null。它們可能會拋出異常 - 例如,當子節點添加到不允許子節點存在的節點時。

介面相關的屬性和方法

屬性

Node.baseURI

傳回一個表示base URL的DOMString。不同語言中的base URL的概念都不一樣。在HTML中,base URL表示協定和域名,以及一直到最後一個'/'之前的文件目錄。

Node.childNodes

傳回一個包含了該節點所有子節點的即時的NodeList。 NodeList 是「即時」的意思是,如果該節點的子節點發生了變化,NodeList物件就會自動更新。

Node.firstChild

傳回該節點的第一個子節點,如果該節點沒有子節點則傳回null。

Node.lastChild

傳回該節點的最後一個子節點,如果該節點沒有子節點則傳回null。
此處省略若干Node介面屬性,更多屬性查看這裡。

方法

那麼重點來了!
重點:從其父類別EventTarget繼承了addEventListener、removeEventListener、dispatchEvent等方法。

Node.appendChild()

將一個節點加入到指定父節點的子節點清單結尾。

Node.contains()

傳回的是一個布林值,來表示傳入的節點是否為該節點的後代節點。

Node.cloneNode()

傳回呼叫該方法的節點的副本。
此處省略若干Node介面方法,更多方法查看這裡。

Element

說明

Element是非常通用的基類,所有 Document物件下的物件都繼承它。這個介面描述了所有相同種類的元素所普遍具有的方法和屬性。這些繼承自Element並且增加了一些額外功能的介面描述了特定的行為。
PS:HTMLElement 接口是所有HTML元素的基礎接口, 而 SVGElement 接口是所有SVG元素的基本接口。
在web以外的語言,像 XUL 可以透過 XULElement 的API,也能實現它。

屬性

所有屬性繼承至它的祖先介面Node, 和它所擴展的介面EventTarget, 並且從以下部分繼承了屬性ParentNode, ChildNode, NonDocumentTypeChildNode, 和Animatable.

Element.assignedSlot

傳回元素對應的HTMLSlotElement 介面

#Element.attributes

傳回一個與該元素相關的所有屬性集合NamedNodeMap

Element.classList

傳回該元素所包含的class屬性是一個DOMTokenList.

Element.className

它是一個DOMString 表示這個元素的class.
此處省略若干Element介面屬性,更多方法查看這裡。

方法

那麼重點來了!
從它的父類別(Node)和它父類別的父類別(EventTarget)繼承方法,並實作parentNode、ChildNode、NonDocumentTypeChildNode、Animatable。
此處省略若干Element介面方法,更多方法查看這裡。

Element.closest()

方法用來取得符合特定選擇器且離目前元素最近的祖先元素(也可以是目前元素本身)。如果匹配不到,則傳回 null。

Element.getAttribute()

傳回元素上一個指定的屬性值。如果指定的屬性不存在,則傳回  null 或 "" (空字串)。

Element.getElementsByClassName()

參數中給出類別的列表,傳回一個動態的 HTMLCollection ,這裡麵包含了所有持有這些類別的後代元素。
此處省略若干Element介面方法,更多方法查看這裡。

HTMLElement

作用

HTMLElement 介面表示所有的 HTML 元素。有些HTML元素直接實作了HTMLElement接口,其它的間接實作HTMLElement介面。

屬性

那麼重點來了!
繼承自父介面Element和 GlobalEventHandlers的屬性。
HTMLElement.accessKey    DOMString    獲取/設定元素存取的快速鍵
HTMLElement.accessKeyLabel    DOMString    傳回一個包含元素存取的快速鍵的字串(唯讀)
HTMLElement.contentEtabletable 可獲取元素存取的快速鍵的字串編輯狀態
HTMLElement.isContentEditable Boolean    顯示元素的內容是否可編輯(唯讀)
此處省略若干HTMLElement介面屬性,更多方法查看這裡。

Event handlers

HTMLElement.onTouchStart
HTMLElement.onTouchEnd
HTMLElement.onTouchMove
HTMLElement.onTouchEnter
HTMLElement.onTouchLeave
HTMLElement.onTouchcelcelcel

方法

HTMLElement.blur()    void    元素失去焦點

HTMLElement.click()    void    觸發元素的點擊事件
HTMLElement.focus()      觸發元素的點擊事件
HTMLElement.focus()    void  #ML 元素獲得焦點。 forceSpellCheck()     void

GlobalEventHandlers

#定義

GlobalEventHandlers介面描述了事件處理程序像HTMLElement常見的幾個介面,檔案,視窗,或WorkerGlobalScope Web Workers。這些介面可以實作更多的事件處理程序。

屬性

GlobalEventHandlers.onabort

中斷事件。

GlobalEventHandlers.onblur

失去焦點事件。

GlobalEventHandlers.onfocus

取得焦點事件。

此處省略若干GlobalEventHandlers介面屬性,更多方法查看這裡。

元素介面

此介面用於建立對應的元素。

如:
HTMLpElement 介面提供了一些特殊屬性(它也繼承了通常的 HTMLElement 介面)來操作p元素。
HTMLFormElement介面可以建立或修改

物件;它繼承了HTMLElement介面的方法和屬性。
HTMLAnchorElement 介面表示超連結元素,並提供一些特別的屬性和方法(除了那些繼承自普通 HTMLElement物件介面的之外)以用於操作這些元素的佈局和顯示。
......
回答前面問題

透過上面的知識,我們了解到:

HTMLpElement(其他元素介面) 繼承 HTMLElement 和 GlobalEventHandlers 介面。
HTMLElement 繼承 Element 介面。
Element 繼承 Node 介面。
Node 繼承 EventTarget 介面。

為什麼p元素甚至是所有的html元素都可以使用addEventListener來新增事件? 一個完整的HTML物件是什麼樣的,如何產生?回答:從 EventTarget 介面中繼承而來。
為什麼每個DOM節點都有parentNode、firstChild、nodeType等屬性呢?
回答:從 Node 介面中繼承而來。
為什麼每個DOM元素都有className、classList、innerHTML等屬性呢?
回答:從 Element 介面繼承而來。
為什麼有些DOM元素有accessKey、contentEditable、isContentEditable等屬性呢?
回答:從 HTMLElement 介面繼承而來。
為什麼每個DOM元素都有onclick、ondblclick、ondrag等屬性?
回答:從 GlobalEventHandlers 介面中繼承而來。

那麼重點來了!

end:

只有透過上面的繼承關係,我們得到的DOM 元素才是完整的HTML 對象,我們才能為它設定/取得屬性、綁定事件、新增樣式類別等操作。

相關文章:

如何判斷一個js物件是否一個dom物件#

資料庫完整性是什麼概念?

相關影片:

HTML5 完整版手冊

以上是一個完整的HTML物件是什麼樣的,如何產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles