使用 DOM 进行 Web 和 XML 开发的示例

本章提供了一些使用 DOM 进行 Web 和 XML 开发的较长示例。在可能的情况下,这些示例使用 JavaScript 中用于操作文档对象的常用 API、技巧和模式。

示例 1:高度和宽度

以下示例显示了如何将heightwidth属性与不同尺寸的图像一起使用

html
<!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:图像属性

html
<!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)中,您可以使用样式表及其规则更改整个文档的样式。

html
<!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对象单独访问这些样式表及其规则,如本示例所示,该示例将所有样式规则选择器打印到控制台。

js
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`);
  }
}

对于具有单个样式表的文档,其中定义了以下三个规则

css
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方法已停止传播,因此在更新表中的数据后,事件阶段实际上已结束,并且会显示一个警报框以确认这一点。

html
<!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()方法引用其各个样式属性,如下面的示例文档所示。

html
<!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">&nbsp;</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 方法在表格中显示onloadevent对象的所有属性及其值。它还显示了一种使用for...in循环迭代对象属性以获取其值的实用技术。

事件对象的属性在不同浏览器之间差异很大,WHATWG DOM 标准列出了标准属性,但许多浏览器都对其进行了大量扩展。

将以下代码放入一个空白文本文件中,并将其加载到各种浏览器中,您会对属性的数量和名称的不同感到惊讶。您可能还想在页面中添加一些元素,并从不同的事件处理程序调用此函数。

html
<!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.insertRowHTMLTableRowElement.insertCell

要向现有表格添加行和一些单元格

html
<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.createElementNode.appendChild创建行和单元格,则 IE 要求将它们附加到<tbody>元素,而其他浏览器则允许附加到<table>元素(行将添加到最后一个<tbody>元素)。
  • HTMLTableElement接口还有许多其他便捷方法可用于创建和修改表格。