Примеры разработки веб- и XML-приложений с использованием DOM
В этом разделе приведены несколько более подробных примеров разработки веб- и XML-приложений с использованием DOM. По возможности, примеры используют стандартные API, приемы и шаблоны JavaScript для управления объектом документа.
Пример 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 доступны через объект стиля элемента и свойства 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: Использование таблиц стилей
Свойство styleSheets объекта document возвращает список таблиц стилей, загруженных в этот документ. Вы можете получить доступ к этим таблицам стилей и их правилам индивидуально с помощью объектов stylesheet, style и 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 очень простым способом. При загрузке BODY этого HTML-документа, обработчик событий регистрируется в верхней строке таблицы. Обработчик событий обрабатывает событие, выполняя функцию 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, свойства которого перечислены в списке свойств CSS DOM.
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, которые можно использовать для создания и изменения таблиц.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Examples