2023-02-16 DOM相关 节点 元素

1. DOM介绍

DOM:文档对象模型(Document Object Model)

对于最顶层的html、head、body元素,我们可以直接在document对象中获取到:
  • html元素:<html> = document.documentElement
  • body元素:<body> = document.body
  • head元素:<head> = document.head
  • 文档声明:<!DOCTYPE html> = document.doctype

2. 节点和元素

节点是 HTML 文档中的一种基本类型,它可以是元素节点、文本节点、注释节点等。

元素是节点的一种,它是 HTML 文档中具有标签和属性的部分,如<div>、<p>、<span>等。
元素节点是节点类型中最常见的类型之一,它是由标签和标签内的内容构成的。

节点导航

  • 父节点:parentNode
  • 前兄弟节点:previousSibling
  • 后兄弟节点:nextSibling
  • 子节点:childNodes
  • 第一个子节点:firstChild
  • 第二个子节点:lastChild
// 例子
// 1. 获取body所有的子节点
console.log(bodyEl.childNodes)
// 2. 获取body的第一个子节点
console.log(bodyEl.firstChild)
// 3. 获取body的注释
console.log(bodyEl.firstChild.nextSibling)
// 4. 获取body的父节点
console.log(bodyEl.parentNode) 

table中的额外导航

  1. <table> 元素支持 (除了上面给出的,之外) 以下这些属性:

    • table.rows — <tr> 元素的集合;
    • table.caption/tHead/tFoot — 引用元素 <caption>,<thead>,<tfoot>;
    • table.tBodies — <tbody> 元素的集合;
  2. <thead>,<tfoot>,<tbody> 元素提供了 rows 属性:

    • tbody.rows — 表格内部 <tr> 元素的集合;
  3. <tr>:

    • tr.cells — 在给定 <tr> 中的 <td> 和 <th> 单元格的集合;
    • tr.sectionRowIndex — 给定的 <tr> 在封闭的 <thead>/<tbody>/<tfoot> 中的位置(索引);
    • tr.rowIndex — 在整个表格中 <tr> 的编号(包括表格的所有行);
  4. <td> 和 <th>:

    • td.cellIndex — 在封闭的 <tr> 中单元格的编号。

form元素的额外导航

<form>元素可以直接通过document:来获取:document.forms

<form>元素中的内容可以通过elements来获取:form.elements

var formEl = document.forms[0]
var elements = formEl.elements

3. 元素导航

  • 父元素:parentElement
  • 前兄弟节点:previousElementSibling
  • 后兄弟节点:nextElementSibling
  • 子节点:children
  • 第一个子节点:firstElementChild
  • 第二个子节点:lastElementChild

4. 元素选择

5. 节点属性

5.1 nodeType属性:

其他类型可以查看MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType

5.2 nodeName、tagName

nodeName:获取node节点的名字;
tagName:获取元素的标签名词;

tagName 和 nodeName 之间有什么不同呢?

tagName 属性仅适用于 Element 节点;
nodeName 是为任意 Node 定义的:
✓ 对于元素,它的意义与 tagName 相同,所以使用哪一个都是可以的;
✓ 对于其他节点类型(text,comment 等),它拥有一个对应节点类型的字符串;

5.3 innerHTML、textContent
  1. innerHTML 属性
    1.1 将元素中的 HTML 获取为字符串形式;
    1.2 设置元素中的内容;
  2. outerHTML 属性
    2.1 包含了元素的完整 HTML
    2.2 innerHTML 加上元素本身一样;
  3. textContent 属性
    3.1 仅仅获取元素中的文本内容;
  4. innerHTML和textContent的区别:
    4.1 使用 innerHTML,我们将其“作为 HTML”插入,带有所有 HTML 标签。
    4.2 使用 textContent,我们将其“作为文本”插入,所有符号(symbol)均按字面意义处理。
5.4 nodeValue/data

用于获取非元素节点的文本内容

5.5 其他属性

hidden属性:也是一个全局属性,可以用于设置元素隐藏。
value: <input>,<select> 和 <textarea>的 value。
href: a标签的href
id

6.元素属性

6.1 attribute
  • 标准的attribute:某些attribute属性是标准的,比如id、class、href、type、value等;
  • 非标准的attribute:某些attribute属性是自定义的,比如abc、age、height等;
对attribute的操作
  • elem.hasAttribute(name) — 检查特性是否存在。
  • elem.getAttribute(name) — 获取这个特性值。
  • elem.setAttribute(name, value) — 设置这个特性值。
  • elem.removeAttribute(name) — 移除这个特性。
  • attributes:attr对象的集合,具有name、value属性;
attribute具备以下特征:
  • 它们的名字是大小写不敏感的(id 与 ID 相同)。
  • 它们的值总是字符串类型的。

6.2 property

对于标准的attribute,会在DOM对象上创建与其对应的property属性:

在大多数情况下,它们是相互作用的
  1. 改变property,通过attribute获取的值,会随着改变;
  2. 通过attribute操作修改,property的值会随着改变;
  3. 但是input的value修改只能通过attribute的方法;
除非特别情况,大多数情况下,设置、获取attribute,推荐使用property的方式:

这是因为它默认情况下是有类型的;

6.3 HTML5的data-*自定义属性

习HTML5的data-*自定义属性,那么它们也是可以在dataset属性中获取到的:

7.js动态修改样式

选择一:在CSS中编写好对应的样式,动态的添加class(推荐);

元素的class attribute,对应的property并非叫class,而是className:

我们可以对className进行赋值,它会替换整个类中的字符串。


如果我们需要添加或者移除单个的class,那么可以使用classList属性。

elem.classList 是一个特殊的对象:

  1. elem.classList.add (class) :添加一个类
  2. elem.classList.remove(class):添加/移除类。
  3. elem.classList.toggle(class) :如果类不存在就添加类,存在就移除它。
  4. elem.classList.contains(class):检查给定类,返回 true/false。

classList是可迭代对象,可以通过for of进行遍历。

选择二:动态的修改style属性;

如果需要单独修改某一个CSS属性,那么可以通过style来操作:

  • 对于多词(multi-word)属性,使用驼峰式 camelCase
  • 如果我们将值设置为空字符串,那么会使用CSS的默认样式:
  • 多个样式的写法,我们需要使用cssText属性:
    不推荐这种用法,因为它会替换整个字符串;
元素style的读取 - getComputedStyle

如果我们需要读取样式:

  1. 对于内联样式,是可以通过style.*的方式读取到的;
  2. 对于style、css文件中的样式,是读取不到的;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 第一章 1.什么是DOM DOM: Document Object Model(文档对象模型) 是JavaScri...
    fastwe阅读 801评论 0 0
  • 题目1: dom对象的innerText和innerHTML有什么区别? innerText返回的是元素内包含的文...
    Feiyu_有猫病阅读 375评论 0 0
  • 基本介绍 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它给文档(结构树)提供了一个结构化的表述并且...
    草鞋弟阅读 436评论 0 0
  • 1. dom对象的innerText和innerHTML有什么区别? innerText是一个可写属性,返回元素内...
    饥人谷_Jack阅读 200评论 0 0
  • DOM对象的innerText和innerHTML有什么区别? 共同点:innerHTML和innerText是d...
    LeeoZz阅读 325评论 0 0