译者:前端小智
来源:valentinog

为了保证的可读性,本文采用意译而非直译。

文本主要介绍文档对象模型(DOM),了解什么是DOM操作,以及如何使用砶 DOM API 与 JS 中的 Web 页面进行交互。

什么是 DOM ?

DOM(文档对象模型)是针对于xml但是扩展用于HTML的应用程序编程接口,定义了访问和操作HTML的文档的标准。

W3C文档对象模型是中立于平台和语言之间的接口,它允许程序和脚本动态的访问和更新文档的内容、结构、样式。总之HTML是关于如何获取、修改、添加和删除HTML元素的标准。

DOM 分层节点

DOM的分层节点一般被称作是DOM树,树中的所有节点都可以通过脚本语言例如JS进行访问,所有HTMlL元素节点都可以被创建、添加或者删除。

在DOM分层节点中,页面就是用分层节点图表示的。

  • 整个文档是一个文档节点,就想是树的根一样。
  • 每个HTML元素都是元素节点。
  • HTML元素内的文本就是文本节点。
  • 每个HTML属性时属性节点。

当咱们访问一个web页面时,浏览器会解析每个HTML元素,创建了HTML文档的虚拟结构,并将其保存在内存中。接着,HTML页面被转换成树状结构,每个HTML元素成为一个叶子节点,连接到父分支。
考虑以下 Html 结构:

html>    A super simple title!

A super simple web page!

我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。

在这个结构的顶部有一个document,也称为根元素,它包含另一个元素:html。html元素包含一个head,而 head 又有一个title。然后body 包含一个h1。每个HTML元素都由特定类型(也称为接口)表示,并且可能包含文本或其他嵌套元素:

document (HTMLDocument)  |  | --> html (HTMLHtmlElement)          |            | --> head (HtmlHeadElement)          |       |          |       | --> title (HtmlTitleElement)          |                | --> text: "A super simple title!"          |          | --> body (HtmlBodyElement)          |       |          |       | --> h1 (HTMLHeadingElement)          |              | --> text: "A super simple web page!"

每个HTML元素都来自Element,但其中很大一部分都是专用的。咱们可以检查原型以查找元素所属的“种类”。例如,h1元素是HTMLHeadingElement:

document.querySelector('h1').__proto__// Output: HTMLHeadingElement

而HTMLHeadingElement则是HTMLElement的后代:

document.querySelector('h1').__proto__.__proto__// Output: HTMLElement

此时(特别是初学者)可能会对documentwindow之间的区别产生一些混淆。接下来看看它们有何不同!

document 和 window 之间的区别

简单来说,document是window的一个对象属性。window 对象表示浏览器中打开的窗口。如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。所有的全局函数和对象都属于 window 对象的属性和方法。

区别:

  1. window 指窗体。document指页面。document是window的一个子对象。
  2. 用户不能改变 document.location(因为这是当前显示文档的位置)。但是,可以改变window.location (用其它文档取代当前文档)window.location本身也是一个对象,而document.location不是对象。

document接口有许多实用方法,比如querySelector(),它是用于查找给定页面内HTML元素的方法:

document.querySelector('h1');

window表示当前的浏览器,下面代码与上面等价:

window.document.querySelector('h1');

当然,更常见的是用第一种方式。

window是一个全局对象,可以从浏览器中运行的任何JS代码直接访问。window暴露了很多属性和方法,如:

window.alert('Hello world'); // Shows an alertwindow.setTimeout(callback, 3000); // Delay executionwindow.fetch(someUrl); // make XHR requestswindow.open(); // Opens a new tabwindow.location; // Browser locationwindow.history; // Browser historywindow.navigator; // The actual user agentwindow.document; // The current page

因为这些属性和方法也是全局的,所以也可以这样访问它们

alert('Hello world'); // Shows an alertsetTimeout(callback, 3000); // Delay executionfetch(someUrl); // make XHR requestsopen(); // Opens a new tablocation; // Browser locationhistory; // Browser historynavigator; // The actual user agentdocument;// The current page

其中有些咱们都已经很熟悉了,如setTimeout() 的方法。例如,当咱们想要得知当前用户的浏览器语言时,window.navigator就非常有用:

if (window.navigator) {  var lang = window.navigator.language;  if (lang === "en-US") {    // show something  }  if (lang === "it-IT") {    // show something else  }}

DOM 常用方法

获取节点

// 通过id号来获取元素,返回一个元素对象document.getElementById(idName) // 通过name属性获取id号,返回元素对象数组 document.getElementsByName(name)  // 通过class来获取元素,返回元素对象数组document.getElementsByClassName(className)   // 通过标签名获取元素,返回元素对象数组document.getElementsByTagName(tagName)       

获取/设置元素的属性值:

// 括号传入属性名,返回对应属性的属性值element.getAttribute(attributeName)// 传入属性名及设置的值element.setAttribute(attributeName,attributeValue)

创建节点Node

// 创建一个html元素,这里以创建h3元素为例document.createElement("h3")// 创建一个文本节点;document.createTextNode(String);// 创建一个属性节点,这里以创建class属性为例document.createAttribute("class");

增添节点

// 往element内部最后面添加一个节点,参数是节点类型element.appendChild(Node);// 在element内部的中在existingNode前面插入newNodeelelment.insertBefore(newNode,existingNode); 

删除节点

//删除当前节点下指定的子节点,删除成功返回该被删除的节点,否则返回nullelement.removeChild(Node)

DOM常用属性

获取当前元素的父节点

// 返回当前元素的父节点对象element.parentNode

获取当前元素的子节点

// 返回当前元素所有子元素节点对象,只返回HTML节点element.chlidren// 返回当前元素多有子节点,包括文本,HTML,属性节点。(回车也会当做一个节点)element.chilidNodes// 返回当前元素的第一个子节点对象element.firstChild// 返回当前元素的最后一个子节点对象element.lastChild

获取当前元素的同级元素

// 返回当前元素的下一个同级元素 没有就返回nullelement.nextSibling// 返回当前元素上一个同级元素 没有就返回 nullelement.previousSibling

获取当前元素的文本

// 返回元素的所有文本,包括html代码element.innerHTML// 返回当前元素的自身及子代所有文本值,只是文本内容,不包括html代码element.innerText

获取当前节点的节点类型

// 返回节点的类型,数字形式(1-12)// 常见几个1:元素节点,2:属性节点,3:文本节点。node.nodeType   

设置样式

// 设置元素的样式时使用styleelement.style.color=“#eea”;

DOM 操作

DOM中的每个HTML元素也是一个节点,可以像这样查找节点:

document.querySelector('h1').nodeType;

上面会返回1,它是Element类型的节点的标识符,还可以检查节点名称:

document.querySelector('h1').nodeName;"H1"

上面的示例返回大写的节点名。但是需要理解的最重要的概念是,咱们主要使用DOM中的两种类型的节点:

  • 元素节点
  • 文本节点

创建元素节点,可以通过 createElement方法:

var heading = document.createElement('h1');

创建文本节点,可能通过 createTextNode 方法:

var text = document.createTextNode('Hello world');

接着将两个节点组合在一起,然后添加到 body 上:

var heading = document.createElement('h1');var text = document.createTextNoe('Hello world');heading.appendChild(text);document.body.appendChild(heading)

在学习Dom操作时候,这些方法需要牢记并熟练使用的。

目前像咱们用这种方式创建和操作元素,是属于命令式DOM操作。现代前端库通过支持声明性方法来解决这个问题,如 JQuery,咱们可以声明需要什么HTML元素,其它就由库来完成。

DOM 操作和 jQuery

大部分可能会想,咱们直接使用 JQ 不就行了,为啥还要用如createElement这些原生的方法,多费劲。

请注意jQuery正在渐渐消失。Bootstrap 5将把它从依赖项中删除,还有很多项目也在删除它。这背后有一个合理的原因:原生DOM API提供了大量像JQ这样操作DOM的简便方法,足以替代jQuery一些常用的DOM操作。

如果只是想进行简单的交互和操作,请使用普通的JS。咱们甚至可以创建自己的迷你框架来抽象最常见的操作:创建元素、追加、创建文本。

总结

DOM是浏览器创建并保留在内存中的网页的虚拟副本。创建、修改、删除 HTML 元素,这些属于 “DOM 操作”。在过去即使对于更简单的任务,咱们也要依赖于 jQuery,但今天原生 API 已经互相兼容并且足够成熟足以替代 jQuery 了。

jQuery不会很快消失,但是每个JS开发人员都必须知道如何使用原生API操作DOM。这样做有很多原因,额外的库增加了JS应用程序的加载时间和大小,更不用说DOM操作在技术面试也经常出现。

操作 DOM 最常用的方法是 document.createElement() 用于创建新的 HTML 元素,document.createTextNode() 用于在 DOM 内创建文本节点。需要注意的是 .appendChild() 用于将新的 HTML 元素或文本节点附加到现有元素。

虽然很好的了解本机 API 是很好的,但是现代前端库也提供了无可置疑的好处。尽管用“原生” JS 去构建大型JS 程序确实是可行的,但有时 Angular、React、Vue可以提供很多帮助。仅使用 JavaScript 来处理更简单的原型和中小型应用也是明智之举。

原文:https://www.valentinog.com/blog/html-table/

ihtml2document能不能根据id获取dom_回到基础:什么是DOM及DOM操作?相关推荐

  1. ihtml2document能不能根据id获取dom_使用DOM进行XML文件的解析

    1. 什么是XML? xml是格式化的纯文本,用于存储数据和格式. 2. DOM是什么? DOM是xml的一种解析方法(此外还包括SAX等,此处不提),它将xml文件抽象成为一个树型结构,这棵树个各个 ...

  2. ihtml2document能不能根据id获取dom_一段监视 DOM 的神奇代码

    作者:Eddie Aich 翻译:疯狂的技术宅 原文:https://dev.to/eddieaich/spy-on-the-dom-3d47未经允许严禁转载 通过使用此模块,只需将鼠标悬停在浏览器中 ...

  3. ihtml2document能不能根据id获取dom_JavaScript学习笔记(十三)-- DOM(上)

    DOM(上) DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 移除一个元素 创建一个元素 向页面里 ...

  4. VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷

    工作中经常会遇到通过进程ID获取进程镜像文件或者其他模块的路径的需求.(转载请指明出处)网上关于方案大致存在两种方案: OpenProcess->GetModuleFileName OpenPr ...

  5. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题

    IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...

  6. 最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法

    以前的天气获取方式已经不支持了,虽然能获取到数据,但是获取到的信息已经不对了. 中国天气网提供的最新接口需要数据请求秘钥key.而且有效期只有7天,用完了还要重新购买,很麻烦,但是获取到的内容绝对是最 ...

  7. js中用tagname和id获取元素的3种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 进程相关(进程Id获取主窗口)

    1.知道进程handle 获取进程名称. PROCESS_INFORMATION* processInfo =(PROCESS_INFORMATION*)pid();    HANDLE hProce ...

  9. 织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...

    这篇文章主要为大家详细介绍了织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 有的时候我们需要 ...

最新文章

  1. esxi宿主机的本地存储-非活动
  2. 安装 ArcGISAPI31forSilverlight an i/o error occured while installing a file错误解决
  3. BZOJ3133[Baltic2013]ballmachine
  4. AS3 --调用Js
  5. 18.12.09-C语言练习:兔子繁衍问题 / Fibonacci 数列
  6. bootstrap .navbar-header 控制button隐藏/显示
  7. 机器学习-01regression
  8. 3.9 训练一个 Softmax 分类器
  9. 把项目中任意文件夹导出为可执行的jar包
  10. HashMap中,比较key是否相等为什么要重写equal() 和hashCode()这两个方法?
  11. 2022依旧可用的抖音无水印解析工具,免费分享
  12. Android判断世界各国手机号码合法性
  13. 【Java】实现wav格式音乐的 播放、停止、循环播放、音量调节
  14. Markdown学习
  15. 数显之家快讯:【SHIO世硕心语】2021年,中国最赚钱的时代到来!
  16. 用户如何向计算机安装软件,按计算机安装同步应用
  17. unixprocess+java+186_interproscan 的使用和遇到的问题
  18. 电脑远程登录控制Android手机-Webkey For Android使用教程
  19. 人人都要有底层逻辑 - 底层逻辑一定要围绕人
  20. 西电计算机组织与体系结构实验,《计算机组织与体系结构》实验.doc

热门文章

  1. Eclipse中写jsp文件时,发现里面加载不了js文件和css文件(解决css文件在eclipse中显示不了)
  2. 解读Cardinality Estimation算法(第四部分:HyperLogLog Counting)
  3. 算法--2016搜狐面试:搜狐员工放假了,都玩什么?
  4. mysql取n条不重复_MySQL重复数据中限定操作n条
  5. Oracle 解决4031错误
  6. 解决 VSCode 配置 tab 空格数 Dart 语言无效的问题
  7. 计算机网络时延图,计算机网络中网站性能延迟加载图像的示例分析
  8. 【干货】救火必备:线上故障排查套路大全
  9. c语言字符串数组的合并,C语言实现合并字符串
  10. Seata-AT 如何保证分布式事务一致性