在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
节点树中的节点彼此拥有层级关系。
我们常用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
下面的图片展示了节点树的一部分,以及节点之间的关系:
请看下面的 HTML 片段:
<html> <head> <meta charset="utf-8"> <title>DOM 教程</title> </head> <body> <h1>DOM 课程1</h1> <p>Hello world!</p> </body> </html>从上面的 HTML 中:
并且:
并且:
DOM 处理中的常见错误是希望元素节点包含文本。
在本例中:<title>DOM 教程</title>,元素节点 <title>,包含值为 "DOM 教程" 的文本节点。
可通过节点的 innerHTML 属性来访问文本节点的值。
HTML DOM 方法是我们可以在节点(HTML 元素)上执行的动作。
HTML DOM 属性是我们可以在节点(HTML 元素)设置和修改的值。
可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。
所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。
方法是您能够执行的动作(比如添加或修改元素)。
属性是您能够获取或设置的值(比如节点的名称或内容)。
getElementById() 方法返回带有指定 ID 的元素:
var element=document.getElementById("intro");一些常用的 HTML DOM 方法:
一些常用的 HTML DOM 属性:
这里提供一些您将在本教程中学到的常用方法:
方法 | 描述 |
---|---|
getElementById() | 返回带有指定 ID 的元素。 |
getElementsByTagName() | 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 |
getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表。 |
appendChild() | 把新的子节点添加到指定节点。 |
removeChild() | 删除子节点。 |
replaceChild() | 替换子节点。 |
insertBefore() | 在指定的子节点前面插入新的子节点。 |
createAttribute() | 创建属性节点。 |
createElement() | 创建元素节点。 |
createTextNode() | 创建文本节点。 |
getAttribute() | 返回指定的属性值。 |
setAttribute() | 把指定属性设置或修改为指定的值。 |
属性是节点(HTML 元素)的值,您能够获取或设置。
// 属性 attributes // console.log(li.id); // console.log(li.data-id); // console.log(li["data-id"]); // console.log(li.attributes["data-id"]) name value; // console.log(li.className);可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。
所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。
方法是您能够执行的动作(比如添加或修改元素)。
属性是您能够获取或设置的值(比如节点的名称或内容)。
获取元素内容的最简单方法是使用 innerHTML 属性。
innerHTML 属性对于获取或替换 HTML 元素的内容很有用。
下面的代码获取 id="intro" 的 <p> 元素的 innerHTML:实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <p id="intro">Hello World!</p> <script> var txt=document.getElementById("intro").innerHTML; document.write(txt); </script> </body> </html>
在上面的例子中,getElementById 是一个方法,而 innerHTML 是属性。
innerHTML 属性可用于获取或改变任意 HTML 元素,包括 <html> 和 <body>。 |
nodeName 属性规定节点的名称。
注意: nodeName 始终包含 HTML 元素的大写字母标签名。
nodeValue 属性规定节点的值。
下面的例子会取回 <p id="intro"> 标签的文本节点值:
实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <p id="intro">Hello World!</p> <script> x=document.getElementById("intro"); document.write(x.firstChild.nodeValue); </script> </body> </html>
nodeType 属性返回节点的类型。nodeType 是只读的。
比较重要的节点类型有:
元素类型 | NodeType |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
注释 | 8 |
文档 | 9 |
访问 HTML DOM - 查找 HTML 元素。
访问 HTML 元素等同于访问节点
您能够以不同的方式来访问 HTML 元素:
通过 HTML DOM,JavaScript 能够访问 HTML 文档中的每个元素。
改变元素内容的最简单的方法是使用 innerHTML 属性。
下面的例子更改 <p> 元素的 HTML 内容:
HTML DOM 允许您在事件发生时执行代码。
当 HTML 元素"有事情发生"时,浏览器就会生成事件:
添加、删除和替换 HTML 元素。
添加:
删除:
替换:
当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时。
如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中:
onclick=JavaScriptHTML 事件的例子:
onchange 事件常用于输入字段的验证。
var select=document.querySelector("select"); // select.onclick=function(){ // console.log(this.value); // } select.onchange=function(){ console.log(this.value); } } // var btn=document.querySelector("button"); // btn.onclick=function(){ // console.log(this.value); 交互控件的值 // }当用户进入或离开页面时,会触发 onl oad 和 onunload 事件。
onload 事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。
onload 和 onunload 事件可用于处理 cookies。
onmouseover 和 onm ouseout 事件可用于在鼠标指针移动到或离开元素时触发函数。
鼠标动画1:
div.onmousemove=function(e){ // 获取鼠标位置 // console.log(e.x,e.y); span.style.top=e.y+"px"; span.style.left=e.x+"px"; } 例子:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div{ width: 200px; height: 200px; background-color: red; } span{ position: absolute; top: 10px; left: 10px; } </style> <script> // e 事件对象 window.onload=function(){ var div=document.querySelector("div"); var span=document.querySelector("span"); div.onmousemove=function(e){ // 获取鼠标位置 // console.log(e.x,e.y); span.style.top=e.y+"px"; span.style.left=e.x+"px"; } } </script> </head> <body> <div></div> <span>这是一段文字</span> </body> </html>
鼠标动画2:
例子:点击小图片显示出大图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> *{ padding:0; margin:0; } body{ position: relative; } ul{ width: 1000px; min-width:600px; margin: 0 auto; display:flex; justify-content:space-between; align-items:center; list-style: none; } .big{ width: 300px; height: 300px; position: absolute; display: none; } </style> <script> window.onload=function(){ var imgs=document.querySelectorAll("li img"); var big=document.querySelector(".big"); for (let i = 0; i < imgs.length; i++) { imgs[i].onmousemove=function(e){ big.style.top=e.y+10+"px"; big.style.left=e.x+10+"px"; big.src=this.src; } imgs[i].onmouseout=function(){ big.style.display="none"; } imgs[i].onmouseenter=function(){ big.style.display="block"; } } } </script> </head> <body> <ul> <li><img src="./a/toplist_a01.jpg" alt=""></li> <li><img src="./a/toplist_a02.jpg" alt=""></li> <li><img src="./a/toplist_a03.jpg" alt=""></li> <li><img src="./a/toplist_a04.jpg" alt=""></li> <li><img src="./a/toplist_a05.jpg" alt=""></li> <li><img src="./a/toplist_a06.jpg" alt=""></li> </ul> <img class="big" src="./a/toplist_a01.jpg" alt=""> </body> </html>
tab切换 (选项卡)
2个for循环
法一:
for (let i = 0; i < as.length; i++) { as[i].onclick=function(){ for (var j = 0; j < as.length; j++) { as[j].className=""; } this.className="active"; } } 法二:
// ajax var url=this.attributes["data-url"].value;
例子:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> *{ padding: 0; margin: 0; } a{ text-decoration:none; color: #333; } ul li{ display: inline-block; height: 20px; width: 60px; } ul li a{ display: block; text-align: center; background-color: #ccc; } .active{ background-color: yellow; } .centent{ width: 186px; height: 200px; border: 1px solid #ccc; } </style> <script> window.onload=function(){ var as=document.querySelectorAll("li a"); for (let i = 0; i < as.length; i++) { as[i].onclick=function(){ for (var j = 0; j < as.length; j++) { as[j].className=""; } this.className="active"; // ajax var url=this.attributes["data-url"].value; } } } </script> </head> <body> <ul> <li><a href="#" class="active" data-url="http://a">列表1</a></li> <li><a href="#" data-url="http://b">列表2</a></li> <li><a href="#"data-url="http://c">列表3</a></li> </ul> <div class="content"> </div> </body> </html>
onmousedown、onmouseup 以及 onclick 事件是鼠标点击的全部过程。首先当某个鼠标按钮被点击时,触发 onm ousedown 事件,然后,当鼠标按钮被松开时,会触发 onm ouseup 事件,最后,当鼠标点击完成时,触发 onclick 事件。
面试题:
46. 添加 删除 替换 插入到某个接点的方法(DOM 的增删改查) (1) 创建新节点 1) createDocumentFragment() // 创建一个 DOM 片段 2) createElement() // 创建一个具体的元素 3) createTextNode() // 创建一个文本节点 (2) 添加、移除、替换、插入 1) appendChild() 2) removeChild() 3) replaceChild() 4) insertBefore() // 在已有的子节点前插入一个新的子节点 (3) 查找 1) getElementsByTagName() // 通过标签名称 2) getElementsByName() // 通过元素的 Name 属性的值(IE 容错能力较强,会得到一个数 组, 其中包括 id 等于 name 值的) 3) getElementById() // 通过元素 Id,唯一性 47. ”==”和“===”的不同 (1) ==之比较“转化成同一类型后的值”看“值”是否相等 (2) ===如果类型不同,其结果就是不等 48. eval 是做什么的 (1) 它的功能是把对应的字符串解析成 JS 代码并运行; (2) 应该避免使用 eval,不安全,非常耗性能( 2 次,一次解析成 js 语句,一次执行)。49. undefined,null 有什么区别? (1) null 表示"没有对象",即该处不应该有值,转为数值时为 0。典型用法是: 1) 作为函数的参数,表示该函数的参数不是对象。 2) 作为对象原型链的终点。 (2) undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为 NaN。典 型用法是: 1) 变量被声明了,但没有赋值时,就等于 undefined。 2) 调用函数时,应该提供的参数没有提供,该参数等于 undefined。 3) 对象没有赋值的属性,该属性的值为 undefined。 4) 函数没有返回值时,默认返回 undefined。 50. typeof 操作符返回值有哪些,对 undefined、null、NaN 使用这个操作 符分别返回什么 (1) typeof 的返回值有 undefined、boolean、string、number、object、function、symbol。 (2) 对 undefined 使用返回 undefined、null 使用返回 object,NaN 使用返回 number