使用 DOM 进行 Web 和 XML 开发的示例
本章提供了一些使用 DOM 进行 Web 和 XML 开发的较长示例。在可能的情况下,这些示例使用 JavaScript 中用于操作文档对象的常用 API、技巧和模式。
示例 1:高度和宽度
以下示例显示了如何将height
和width
属性与不同尺寸的图像一起使用
<!doctype html>
<html lang="en">
<head>
<title>width/height example</title>
<script>
function init() {
const arrImages = new Array(3);
arrImages[0] = document.getElementById("image1");
arrImages[1] = document.getElementById("image2");
arrImages[2] = document.getElementById("image3");
const objOutput = document.getElementById("output");
let strHtml = "<ul>";
for (let i = 0; i < arrImages.length; i++) {
strHtml +=
"<li>image" +
(i + 1) +
": height=" +
arrImages[i].height +
", width=" +
arrImages[i].width +
", style.height=" +
arrImages[i].style.height +
", style.width=" +
arrImages[i].style.width +
"</li>";
}
strHtml += "</ul>";
objOutput.innerHTML = strHtml;
}
</script>
</head>
<body onload="init();">
<p>
Image 1: no height, width, or style
<img
id="image1"
src="https://www.mozilla.org/images/mozilla-banner.gif" />
</p>
<p>
Image 2: height="50", width="500", but no style
<img
id="image2"
src="https://www.mozilla.org/images/mozilla-banner.gif"
height="50"
width="500" />
</p>
<p>
Image 3: no height, width, but style="height: 50px; width: 500px;"
<img
id="image3"
src="https://www.mozilla.org/images/mozilla-banner.gif"
style="height: 50px; width: 500px;" />
</p>
<div id="output"></div>
</body>
</html>
示例 2:图像属性
<!doctype html>
<html lang="en">
<head>
<title>Modifying an image border</title>
<script>
function setBorderWidth(width) {
document.getElementById("img1").style.borderWidth = width + "px";
}
</script>
</head>
<body>
<p>
<img
id="img1"
src="image1.gif"
style="border: 5px solid green;"
width="100"
height="100"
alt="border test" />
</p>
<form name="FormName">
<input
type="button"
value="Make border 20px-wide"
onclick="setBorderWidth(20);" />
<input
type="button"
value="Make border 5px-wide"
onclick="setBorderWidth(5);" />
</form>
</body>
</html>
示例 3:操作样式
在这个简单的示例中,HTML 段落元素的一些基本样式属性是使用元素上的style
对象以及该对象的 CSS 样式属性访问的,这些属性可以从 DOM 中检索和设置。在这种情况下,您正在直接操作各个样式。在下一个示例(参见示例 4)中,您可以使用样式表及其规则更改整个文档的样式。
<!doctype html>
<html lang="en">
<head>
<title>Changing color and font-size example</title>
<script>
function changeText() {
const p = document.getElementById("pid");
p.style.color = "blue";
p.style.fontSize = "18pt";
}
</script>
</head>
<body>
<p id="pid" onclick="window.location.href = 'http://www.cnn.com/';">
linker
</p>
<form>
<p><input value="rec" type="button" onclick="changeText();" /></p>
</form>
</body>
</html>
示例 4:使用样式表
document
对象上的styleSheets
属性返回已加载到该文档上的样式表的列表。您可以使用样式表、样式和CSSRule
对象单独访问这些样式表及其规则,如本示例所示,该示例将所有样式规则选择器打印到控制台。
const ss = document.styleSheets;
for (let i = 0; i < ss.length; i++) {
for (let j = 0; j < ss[i].cssRules.length; j++) {
console.log(`${ss[i].cssRules[j].selectorText}\n`);
}
}
对于具有单个样式表的文档,其中定义了以下三个规则
body {
background-color: darkblue;
}
p {
font-family: Arial;
font-size: 10pt;
margin-left: 0.125in;
}
#lumpy {
display: none;
}
此脚本输出以下内容
BODY P #LUMPY
示例 5:事件传播
此示例以非常简单的方式演示了事件如何在 DOM 中触发和处理。当此 HTML 文档的 BODY 加载时,事件侦听器会注册到 TABLE 的顶行。事件侦听器通过执行函数stopEvent
来处理事件,该函数更改表底部单元格中的值。
但是,stopEvent
还会调用事件对象方法event.stopPropagation
,这可以防止事件进一步冒泡到 DOM 中。请注意,表本身有一个onclick
事件处理程序,该处理程序应该在单击表时显示消息。但是,stopEvent
方法已停止传播,因此在更新表中的数据后,事件阶段实际上已结束,并且会显示一个警报框以确认这一点。
<!doctype html>
<html lang="en">
<head>
<title>Event Propagation</title>
<style>
#t-daddy {
border: 1px solid red;
}
#c1 {
background-color: pink;
}
</style>
<script>
function stopEvent(event) {
const c2 = document.getElementById("c2");
c2.textContent = "hello";
// this ought to keep t-daddy from getting the click.
event.stopPropagation();
alert("event propagation halted.");
}
function load() {
const elem = document.getElementById("tbl1");
elem.addEventListener("click", stopEvent, false);
}
</script>
</head>
<body onload="load();">
<table id="t-daddy" onclick="alert('hi');">
<tr id="tbl1">
<td id="c1">one</td>
</tr>
<tr>
<td id="c2">two</td>
</tr>
</table>
</body>
</html>
示例 6:getComputedStyle
此示例演示了如何使用window.getComputedStyle
方法获取未使用style
属性或 JavaScript(例如,elt.style.backgroundColor="rgb(173 216 230)"
)设置的元素的样式。可以使用更直接的elt.style
属性检索后一种类型的样式,其属性列在DOM CSS 属性列表中。
getComputedStyle()
返回一个CSSStyleDeclaration
对象,可以使用此对象的getPropertyValue()
方法引用其各个样式属性,如下面的示例文档所示。
<!doctype html>
<html lang="en">
<head>
<title>getComputedStyle example</title>
<script>
function cStyles() {
const RefDiv = document.getElementById("d1");
const txtHeight = document.getElementById("t1");
const h_style = document.defaultView
.getComputedStyle(RefDiv, null)
.getPropertyValue("height");
txtHeight.value = h_style;
const txtWidth = document.getElementById("t2");
const w_style = document.defaultView
.getComputedStyle(RefDiv, null)
.getPropertyValue("width");
txtWidth.value = w_style;
const txtBackgroundColor = document.getElementById("t3");
const b_style = document.defaultView
.getComputedStyle(RefDiv, null)
.getPropertyValue("background-color");
txtBackgroundColor.value = b_style;
}
</script>
<style>
#d1 {
margin-left: 10px;
background-color: rgb(173 216 230);
height: 20px;
max-width: 20px;
}
</style>
</head>
<body>
<div id="d1"> </div>
<form action="">
<p>
<button type="button" onclick="cStyles();">getComputedStyle</button>
height<input id="t1" type="text" value="1" /> max-width<input
id="t2"
type="text"
value="2" />
bg-color<input id="t3" type="text" value="3" />
</p>
</form>
</body>
</html>
示例 7:显示事件对象属性
此示例使用 DOM 方法在表格中显示onload
event
对象的所有属性及其值。它还显示了一种使用for...in
循环迭代对象属性以获取其值的实用技术。
事件对象的属性在不同浏览器之间差异很大,WHATWG DOM 标准列出了标准属性,但许多浏览器都对其进行了大量扩展。
将以下代码放入一个空白文本文件中,并将其加载到各种浏览器中,您会对属性的数量和名称的不同感到惊讶。您可能还想在页面中添加一些元素,并从不同的事件处理程序调用此函数。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Show Event properties</title>
<style>
table {
border-collapse: collapse;
}
thead {
font-weight: bold;
}
td {
padding: 2px 10px 2px 10px;
}
.odd {
background-color: #efdfef;
}
.even {
background-color: #ffffff;
}
</style>
<script>
function showEventProperties(e) {
function addCell(row, text) {
const cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(text));
}
const event = e || window.event;
document.getElementById("eventType").textContent = event.type;
const table = document.createElement("table");
const thead = table.createTHead();
let row = thead.insertRow(-1);
const labelList = ["#", "Property", "Value"];
const len = labelList.length;
for (let i = 0; i < len; i++) {
addCell(row, labelList[i]);
}
const tbody = document.createElement("tbody");
table.appendChild(tbody);
for (const p in event) {
row = tbody.insertRow(-1);
row.className = row.rowIndex % 2 ? "odd" : "even";
addCell(row, row.rowIndex);
addCell(row, p);
addCell(row, event[p]);
}
document.body.appendChild(table);
}
window.onload = (event) => {
showEventProperties(event);
};
</script>
</head>
<body>
<h1>Properties of the DOM <span id="eventType"></span> Event Object</h1>
</body>
</html>
示例 8:使用 DOM 表格接口
DOM HTMLTableElement
接口提供了一些用于创建和操作表格的便捷方法。两种常用的方法是HTMLTableElement.insertRow
和HTMLTableRowElement.insertCell
。
要向现有表格添加行和一些单元格
<table id="table0">
<tr>
<td>Row 0 Cell 0</td>
<td>Row 0 Cell 1</td>
</tr>
</table>
<script>
const table = document.getElementById("table0");
const row = table.insertRow(-1);
let cell;
let text;
for (let i = 0; i < 2; i++) {
cell = row.insertCell(-1);
text = "Row " + row.rowIndex + " Cell " + i;
cell.appendChild(document.createTextNode(text));
}
</script>
注意
- 永远不要使用表格的
innerHTML
属性修改表格,尽管您可以使用它来编写整个表格或单元格的内容。 - 如果使用 DOM Core 方法
document.createElement
和Node.appendChild
创建行和单元格,则 IE 要求将它们附加到<tbody>
元素,而其他浏览器则允许附加到<table>
元素(行将添加到最后一个<tbody>
元素)。 HTMLTableElement
接口还有许多其他便捷方法可用于创建和修改表格。