目录
简单介绍
DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。
HTML DOM 定义了访问和操作 HTML 文档的标准方法。
当网页被加载时,浏览器会创建HTML页面的文档对象模型(Document Object Model)。
HTML DOM 节点
节点树
HTML 文档会被结构化为一棵节点树:
整个文档是文档节点
每个 HTML 元素是元素节点
HTML 元素内的文本是文本节点
每个 HTML 属性是属性节点
所有注释是注释节点
节点间的层级关系
顶端节点被称为根(根节点)。
每个节点都有父节点(除了根)。
节点可以拥有一定数量的子节点。
拥有相同的父节点的是同胞(兄弟或姐妹)
HTML DOM 对象、属性、方法
在 HTML DOM 中,所有 HTML 元素被定义为对象,编程接口是对象的属性、方法、事件。其中属性是能够获取或设置的值,方法是能够完成的动作(类似函数,比如添加或删除 HTML 元素)。
部分常用的HTML DOM 方法:
getElementById(id) 获取带有指定 id 的节点(元素)
appendChild(node) 插入新的子节点(元素)
removeChild(node) 删除子节点(元素)
部分常用的 HTML DOM 属性:
innerHTML 节点(元素)的文本值
parentNode 节点(元素)的父节点
childNodes 节点(元素)的子节点
attributes 节点(元素)的属性节点
JavaScript与HTML DOM
通过网页(HTML文档)的DOM模型,JavaScript 可操纵页面上的元素(对象):
改变 HTML 元素的内容;
改变 HTML 元素的样式(CSS);
对 HTML DOM 事件作出反应;
添加和删除 HTML 元素。
JavaScript 代码访问页面上的元素
"document" 对象就是HTML文档(网页)本身,其方法用于访问 HTML 元素。
访问 HTML 元素的办法主要包括:
document.getElementById(id) 返回给定 id 的元素;
document.getElementsByTagName(name) 返回标签名对应的元素集合,length属性是元素个数;
document.getElementsByClassName(name) 返回类名对应的元素集合;
预定义名称的 HTML 对象或对象集合,例如:
document.title 元素<title>
document.body 元素<body>
document.images 所有 <img> 元素的集合
document.anchors 拥有 name 属性的所有 <a> 元素的集合
document.forms 表单
querySelectorAll() 返回匹配指定 CSS 选择器的 HTML 节点列表。只能通过下标访问,其 length 属性值是节点个数。
改变 HTML 元素/属性值
element.innerHTML = new html content 改变元素内容: inner HTML
element.attribute = new value 改变 HTML 元素的属性值
element.setAttribute(attribute, value) 改变 HTML 元素的属性值
inputelement.value = new value 改变 input 元素的 value 值
element.style.property = new style 改变 HTML 元素的CSS样式
添加/删除 HTML 元素
document.createElement(tag) 创建 HTML 元素
element.appendChild(node) 添加 HTML 元素
element.removeChild(node) 删除 HTML 元素
element.replaceChild(newNode, oldNode) 替换 HTML 元素
document.write(text) 写入 HTML 输出流
查找 HTML 元素
getElementById() 通过Id查找 HTML 元素
getElementsByTagName() 通过标签名查找 HTML 元素
getElementsByClassName() 通过类名查找 HTML 元素
querySelectorAll() 通过CSS选择器查找 HTML 元素
改变元素的属性值
<!DOCTYPE html>
<html>
<body>
<img id="myImage" src="smiley.gif">
<script>
document.getElementById("myImage").src = "landscape.jpg";
</script>
</body>
</html>
改变CSS样式
<!DOCTYPE html>
<html>
<body>
<h1 id="id1">我的标题 1</h1>
<button type="button" onclick ="document.getElementById('id1').style.color = 'red' ">
标题变红
</button>
</body>
</html>
JavaScript HTML DOM 事件
JavaScript 程序可以响应网页上发生的事件(比如当用户点击鼠标时、当网页已加载时、当图片已加载时、当鼠标移动到元素上时、当输入字段被改变时、当 HTML 表单被提交时、当用户触发按键时等):
onclick
onmouseover / onmouseout
onfocus / onchange
onload / onunload
addEventListener()
可以为元素添加(多个)事件处理程序。
element.addEventListener(event, function, useCapture);
useCapture:false/true。决定事件处理顺序由内层元素到外层元素或相反。
removeEventListener(evevt, function) 方法删除已通过 addEventListener() 方法定义的事件处理程序。
实例
element.addEventListener("click", myFunction);
function myFunction() {
alert ("Hello World!");
}
//如果事件处理函数有参数
element.addEventListener("click", function(){ myFunc(p1, p2); });
element.addEventListener("click", function(){ alert("Hello World!"); });
在 HTML DOM 节点树中导航
顶端节点被称为根(根节点)。
每个节点都有父节点(除了根)。
节点可以拥有一定数量的子节点。
拥有相同的父节点的是同胞(兄弟或姐妹)
实例
<html>
<head>
<title>标题</title>
</head>
<body>
<h1>example</h1>
<p>Hi!</p>
</body>
</html>
<html> 是根节点,没有父节点
<html> 是 <head> 和 <body> 的父节点
<head> 是 <html> 的第一个子节点
<body> 是 <html> 的最后一个子节点
<head>
有一个子节点:<title> <title>
有一个(文本)子节点:"标题"
<body> 有两个子节点:<h1> 和 <p>
<h1> 有一个(文本)子节点:"example"
<p> 有一个(文本)子节点:"Hi!"
<h1> 和 <p> 是同胞
节点列表
getElementsByTagName(tag) 方法返回节点列表。节点列表是一个节点数组。length 属性定义节点列表中节点的数量。
使用节点属性在节点之间导航
通过 JavaScript,可以使用以下节点属性在节点之间导航:
parentNode
childNodes[nodenumber]
firstChild
lastChild
nextSibling
previousSibling
注意:如果对应的节点不存在,结果是null。
遍历 DOM 树
添加/删除 HTML 元素
document.createElement(tag) 创建 HTML 元素 document.createTextNode(text)
element.appendChild(node) 添加 HTML 元素 element.insertBefore(newChildNode,childNode)
element.removeChild(node) 删除 HTML 元素 element.remove()
element.replaceChild(newNode, oldNode) 替换 HTML 元素
获取节点的"值"
节点的 nodeValue
元素节点的 nodeValue 是 undefined
文本节点的 nodeValue 是文本
属性节点的 nodeValue 是属性值
实例
<body>
<h1 id="first">标题</h1>
</body>
document.getElementById("id01").innerHTML; document.getElementById("id01").firstChild.nodeValue; document.getElementById("id01").childNodes[0].nodeValue;
可以通过以上几种表达获得<h1>元素的内容。
创建 添加 新 HTML 元素(节点)
如需向 HTML DOM 添加新元素,必须先创建这个元素(元素节点),然后将其追加到已有元素。
实例
<div id="div1">
<p id="p1">这是一个段落。</p>
<p id="p2">这是另外一个段落。</p>
</div>
<script>
var para = document.createElement("p");
var textnode = document.createTextNode("这是新文本。");
para.appendChild(textnode);
//创建元素节点
var parent = document.getElementById("div1");
parent.appendChild(para);
//追加该元素节点到已有元素
</script>
HTML DOM replaceChild() 方法
定义和用法: replaceChild() 方法用新节点替换某个子节点。 这个新节点可以是文档中某个已存在的节点,或者您也可创建新的节点。
语法:node.replaceChild(newnode, oldnode)
返回值: 被替换的节点(Node 对象)。
appendChild(), appendBefore() 返回新添加的节点。 removeChild(), remove() 返回被删除的节点。 cloneNode() 方法返回调用该方法的节点的克隆体。
默认情况下,节点的nodeName和tagName属性值是HTML标签名,例如P。
event 对象
DOM 中的所有事件对象都基于 Event 对象。
event 对象的属性和方法:
event.target 返回触发事件的元素。
event.type 返回事件名称。
JavaScript console.log() 方法
<!DOCTYPE html>
<html>
<body>
<p>按键盘上的 F12 可在控制台视图中查看消息。</p>
<script>
console.log("Hello world!");
</script>
</body>
</html>
应用实例
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>
四个按钮
</title>
<style>
#div1{
margin:0 auto;
width: 300px;
height: 300px;
border:2px solid;
background-color: beige;
text-align: center;
}
</style>
</head>
<body>
<script>
function moveUp(){
var click = event.target;
click.style.color = "green";
var all = document.getElementById('div1');
var n = all.children.length;
for(var i = n-1; i>0; i--){
var tmp1 = all.children[i].cloneNode(true);
all.insertBefore(tmp1 , all.children[i-1]);
all.removeChild(all.children[i+1]);
}
}
function moveDown(){
var click = event.target;
click.style.color = "green";
var all = document.getElementById('div1');
var n = all.children.length;
var tmp2 = all.children[0].cloneNode(true);
all.insertBefore(tmp2 , all.children[n]);
all.removeChild(all.children[0]);
}
function append(){
var click = event.target;
click.style.color = "green";
var all = document.getElementById("div1")
var frm = document.createElement("form");
var inp = document.createElement("input");
inp.type = "text";
frm.appendChild(inp);
var BtnOk = document.createElement("input");
BtnOk.type = "button";
BtnOk.value = "Ok";
BtnOk.id = "ok";
var Ok = document.getElementById("ok");
frm.appendChild(BtnOk);
all.appendChild(frm);
ok.onclick = function(){
var node = document.createElement("p");
node.innerHTML = frm.elements[0].value;
all.replaceChild(node,frm);
}
}
function remove(){
var click = event.target;
click.style.color = "green";
var all = document.getElementById('div1');
var n = all.children.length;
all.removeChild(all.children[n-1]);
}
</script>
<div id = "div1">
<p id = "p1">先有鸡</p>
<p id = "p2">先有蛋</p>
</div>
<button onclick = "moveUp()">moveup</button>
<button onclick = "moveDown()">movedown</button>
<button onclick = "append()">append</button>
<button onclick = "remove()">remove</button>
</body>
</html>
效果
原本
点击moveup按钮后
点击movedown按钮后
点击append按钮后
点击remove按钮后