ææ¡£å¯¹è±¡æ¨¡åï¼DOMï¼æ¯ web ä¸ææææ¡£ç»æåå 容çå¯¹è±¡çæ°æ®è¡¨ç¤ºãæ¬æåå°ä»ç» DOMï¼ç ç©¶ DOM å¦ä½å¨å åä¸è¡¨ç¤º HTML ææ¡£ä»¥åå¦ä½ä½¿ç¨ API æ¥å建 web å 容ååºç¨ç¨åºã
ä»ä¹æ¯ DOMï¼ææ¡£å¯¹è±¡æ¨¡åï¼DOMï¼æ¯ä¸ä¸ªç½ç»ææ¡£çç¼ç¨æ¥å£ãå®ä»£è¡¨é¡µé¢ï¼ä»¥ä¾¿ç¨åºå¯ä»¥æ¹åææ¡£çç»æã飿 ¼åå 容ãDOM å°ææ¡£è¡¨ç¤ºä¸ºèç¹å对象ï¼è¿æ ·ï¼ç¼ç¨è¯è¨å°±å¯ä»¥ä¸é¡µé¢äº¤äºã
ç½é¡µæ¯ä¸ä¸ªæ¢å¯ä»¥å¨æµè§å¨çªå£ä¸æ¾ç¤ºï¼ä¹å¯ä»¥ä½ä¸º HTML æºä»£ç çææ¡£ãå¨è¿ä¸¤ç§æ åµä¸ï¼å®é½æ¯åä¸ä¸ªææ¡£ï¼ä½ææ¡£å¯¹è±¡æ¨¡åï¼DOMï¼ç表示æ¹å¼ä½¿å®å¯ä»¥è¢«æä½ãä½ä¸ºä¸ä¸ªé¢å对象çç½é¡µè¡¨ç¤ºï¼å®å¯ä»¥ç¨èæ¬è¯è¨ï¼å¦ JavaScriptï¼è¿è¡ä¿®æ¹ã
ä¾å¦ï¼DOM 䏿å®ä¸é¢ä»£ç ä¸ç querySelectorAll
æ¹æ³å¿
é¡»è¦è¿åææ¡£ä¸ææ <p>
å
ç´ ç»æçå表ï¼
const paragraphs = document.querySelectorAll("p");
// paragraphs[0] æ¯ç¬¬ä¸ä¸ª <p> å
ç´
// paragraphs[1] æ¯ç¬¬äºä¸ª <p> å
ç´ ï¼ä¾æ¤ç±»æ¨
alert(paragraphs[0].nodeName);
ææå¯ç¨äºæä½åå建ç½é¡µç屿§ãæ¹æ³åäºä»¶é½è¢«ç»ç»å°å¯¹è±¡ä¸ãä¾å¦ï¼ä»£è¡¨ææ¡£æ¬èº«ç document
对象ï¼ä»»ä½å®ç° HTMLTableElement
è®¿é® HTML è¡¨æ ¼ç table
对象çï¼é½æ¯å¯¹è±¡ã
DOM æ¯ä½¿ç¨å¤ä¸ª API æå»ºçï¼å®ä»¬ä¸èµ·å·¥ä½ãæ ¸å¿ DOM å®ä¹äºæè¿°ä»»ä½ææ¡£åå ¶ä¸å¯¹è±¡çå®ä½ãå ¶ä» API 伿 ¹æ®éè¦å¯¹å ¶è¿è¡æ©å±ï¼ä¸º DOM å¢å æ°çç¹æ§ååè½ãä¾å¦ï¼HTML DOM API ä¸ºæ ¸å¿ DOM å¢å äºå¯¹è¡¨ç¤º HTML ææ¡£çæ¯æï¼è SVG API å¢å äºå¯¹è¡¨ç¤º SVG ææ¡£çæ¯æã
DOM å JavaScriptä¸ä¸ä¸ªç®ççä¾åï¼åå 乿æçä¾å䏿 ·ï¼æ¯ JavaScriptãä¹å°±æ¯è¯´ï¼å®æ¯ç¨ JavaScript åçï¼ä½å´ä½¿ç¨ DOM æ¥è®¿é®ææ¡£åå ¶å ç´ ãDOM 䏿¯ä¸ç§ç¼ç¨è¯è¨ï¼ä½å¦ææ²¡æå®ï¼JavaScript è¯è¨å°±ä¸ä¼æä»»ä½å ³äºç½é¡µãHTML ææ¡£ãSVG ææ¡£åå ¶ç»æé¨åçæ¨¡åææ¦å¿µãææ¡£ä½ä¸ºä¸ä¸ªæ´ä½ï¼æ é¢ãææ¡£ä¸çè¡¨æ ¼ã表头ãè¡¨æ ¼åå ä¸çææ¬ä»¥åææ¡£ä¸çææå ¶ä»å ç´ é½æ¯è¯¥ææ¡£å¯¹è±¡æ¨¡åçä¸é¨åãå®ä»¬é½å¯ä»¥ä½¿ç¨ DOM åå JavaScript è¿æ ·çèæ¬è¯è¨è¿è¡è®¿é®åæä½ã
DOM 䏿¯ JavaScript è¯è¨çä¸é¨åï¼èæ¯ç¨äºå»ºç«ç½ç«ç Web APIãJavaScript ä¹å¯ä»¥å¨å ¶ä»æ åµä¸ä½¿ç¨ãä¾å¦ï¼Node.js å¨è®¡ç®æºä¸è¿è¡ JavaScript ç¨åºï¼ä½æä¾äºä¸å¥ä¸åç APIï¼èä¸ DOM API 䏿¯ Node.js è¿è¡æ¶çæ ¸å¿é¨åã
DOM 被设计æä¸ç¹å®ç¼ç¨è¯è¨ç¸ç¬ç«ï¼ä½¿ææ¡£çç»æå表述å¯ä»¥éè¿åä¸ï¼ä¸è´ç API è·å¾ã尽管æä»¬å¨æ¬åèææ¡£ä¸ä¼ä¸æ³¨äºä½¿ç¨ JavaScriptï¼ä½ DOM ä¹å¯ä»¥ä½¿ç¨å ¶ä»çè¯è¨æ¥å®ç°ï¼ä»¥ Python 为ä¾ï¼ä»£ç å¦ä¸ï¼
# Python DOM 示ä¾
import xml.dom.minidom as m
doc = m.parse(r"C:\Projects\Py\chap1.xml")
doc.nodeName # ææ¡£å¯¹è±¡ç DOM 屿§
p_list = doc.getElementsByTagName("para")
è¦è·åæ´å¤å¨ç½é¡µä¸ä½¿ç¨ JavaScript çä¿¡æ¯ï¼è¯·åé JavaScript ææ¯æ¦è¿°ã
è®¿é® DOMå¨ä½¿ç¨ DOM æ¶ï¼ä¸éè¦åä»»ä½å ¶ä»ç¹æ®çæä½ãä½ å¯ä»¥å¨èæ¬ä¸ç´æ¥ä½¿ç¨ JavaScript ç APIï¼è¿æ¯ä¸ä¸ªç±æµè§å¨è¿è¡çç¨åºã
å½ä½ å建ä¸ä¸ªèæ¬æ¶ï¼æ 论æ¯å
èå° <script>
å
ç´ ä¸è¿æ¯å
å«å¨ç½é¡µä¸ï¼ä½ é½å¯ä»¥ç«å³å¼å§ä½¿ç¨ document
æ window
对象ç API æ¥æä½ææ¡£æ¬èº«ï¼æç½é¡µä¸çä»»ä½å
ç´ ï¼ææ¡£çåå
ç´ ï¼ãä½ ç DOM ç¼ç¨å¯è½å°±åä¸é¢è¿ä¸ªç¤ºä¾ä¸æ ·ç®åï¼éè¿ä½¿ç¨ console.log()
彿°å¨æ§å¶å°æ¾ç¤ºä¸æ¡ä¿¡æ¯ï¼
<body onload="console.log('æ¬¢è¿æ¥å°æç主页ï¼');">
â¦
</body>
ç±äºä¸è¬ä¸å»ºè®®å°é¡µé¢çç»æï¼ç¨ HTML ç¼åï¼å对 DOM çæä½ï¼ç¨ JavaScript ç¼åï¼æ··å¨ä¸èµ·ï¼æä»¥ JavaScript é¨åå°å¨è¿éåç»ï¼å¹¶ä¸ HTML åå¼ã
ä¾å¦ï¼ä»¥ä¸å½æ°å建äºä¸ä¸ªæ°ç h1 å ç´ ï¼å该å ç´ æ·»å ææ¬ï¼ç¶åå°å ¶æ·»å å°ææ¡£çæ ä¸ï¼
<html lang="zh-CN">
<head>
<script>
// å½ææ¡£å è½½æ¶ï¼è¿è¡è¿æ®µå½æ°
window.onload = () => {
// å¨ç©º HTML 页é¢ä¸å建ä¸ç³»åå
ç´
const heading = document.createElement("h1");
const headingText = document.createTextNode("Big Head!");
heading.appendChild(headingText);
document.body.appendChild(heading);
};
</script>
</head>
<body></body>
</html>
åºæ¬çæ°æ®ç±»å
æ¬é¡µè¯å¾ç¨ç®åçè¯è¨æè¿°åç§å¯¹è±¡åç±»åã使¯ï¼æä¸äºä¸åçæ°æ®ç±»åå¨ API ä¸ä¼ éï¼ä½ åºè¯¥æ³¨æå°ã
夿³¨ï¼ å 为ç»å¤§å¤æ°ä½¿ç¨ DOM ç代ç 齿¯å´ç»çæä½ HTML ææ¡£è¿è¡çï¼æä»¥æä»¬é常æ DOM ä¸çèç¹ç§°ä¸ºå ç´ ï¼elementï¼ï¼å°½ç®¡ä¸¥æ ¼æ¥è¯´å¹¶ä¸æ¯æ¯ä¸ªèç¹é½æ¯ä¸ä¸ªå ç´ ã
ä¸é¢çè¡¨æ ¼å¤§è´æè¿°äºè¿äºæ°æ®ç±»åã
æ°æ®ç±»åï¼æ¥å£ï¼ æè¿°Document
å½ä¸ä¸ªæåè¿å document
对象ï¼ä¾å¦ï¼å
ç´ ç ownerDocument
屿§è¿å宿å±ç document
ï¼ï¼è¿ä¸ªå¯¹è±¡å°±æ¯ root document
对象æ¬èº«ãDOM document
åèä¸ç« 对 document
对象è¿è¡äºæè¿°ã Node
ä½äºææ¡£ä¸çæ¯ä¸ªå¯¹è±¡é½æ¯æç§ç±»åçèç¹ãå¨ä¸ä¸ª HTML ææ¡£ä¸ï¼ä¸ä¸ªå¯¹è±¡å¯ä»¥æ¯ä¸ä¸ªå
ç´ èç¹ï¼ä¹å¯ä»¥æ¯ä¸ä¸ªææ¬èç¹æå±æ§èç¹ã Element
element
ç±»åæ¯åºäº node
çãå®æçæ¯ä¸ä¸ªå
ç´ æä¸ä¸ªç± DOM API çæåè¿åç element
ç±»åçèç¹ãä¾å¦ï¼æä»¬ä¸è¯´ document.createElement()
æ¹æ³è¿åä¸ä¸ª node
ç对象å¼ç¨ï¼èåªæ¯è¯´è¿ä¸ªæ¹æ³è¿åååå¨ DOM ä¸å建ç element
ãelement
对象å®ç°äº DOM ç Element
æ¥å£åæ´åºæ¬ç Node
æ¥å£ï¼è¿ä¸¤ä¸ªæ¥å£é½å
å«å¨æ¬åèä¸ãå¨ HTML ææ¡£ä¸ï¼å
ç´ éè¿ HTML DOM API ç HTMLElement
æ¥å£ä»¥åå
¶ä»æè¿°ç¹å®ç§ç±»å
ç´ è½åçæ¥å£ï¼ä¾å¦ç¨äº <table>
å
ç´ ç HTMLTableElement
æ¥å£ï¼è¿ä¸æ¥å¼ºåã NodeList
nodeList
æ¯ç±å
ç´ ç»æçæ°ç»ï¼å¦å document.querySelectorAll()
çæ¹æ³è¿åçç±»åãnodeList
ä¸çæ¡ç®éè¿ç´¢å¼æä¸¤ç§æ¹å¼è¿è¡è®¿é®ï¼
item()
æ¯ nodeList
对象ä¸çåç¬æ¹æ³ãåé¢çæ¹å¼å使ç¨äºç»å
¸çæ°ç»è¯æ³æ¥è·åå表ä¸ç第äºä¸ªæ¡ç®ã Attr
å½ attribute
éè¿æå彿°ï¼ä¾å¦éè¿ createAttribute()
æ¹æ³ï¼è¿åæ¶ï¼å®æ¯ä¸ä¸ªä¸ºå±æ§æ´é²åºä¸é¨æ¥å£ç对象å¼ç¨ãDOM ä¸ç屿§ä¹æ¯èç¹ï¼å°±åå
ç´ ä¸æ ·ï¼åªä¸è¿ä½ å¯è½ä¼å¾å°ä½¿ç¨å®ã NamedNodeMap
namedNodeMap
åæ°ç»ç±»ä¼¼ï¼ä½æ¯æ¡ç®æ¯ç±åç§°æç´¢å¼è®¿é®çï¼è½ç¶åä¸ç§æ¹å¼ä»
ä»
æ¯ä¸ºäºæä¸¾æ¹ä¾¿ï¼å ä¸ºå¨ list 䏿¬æ¥å°±æ²¡æç¹å®ç顺åºãåºäºè¿ä¸ªç®çï¼ namedNodeMap
æä¸ä¸ª item() æ¹æ³ï¼ä½ ä¹å¯ä»¥ä» namedNodeMap
æ·»å æç§»é¤æ¡ç®ã
è¿æä¸äºå¸¸è§çæ¯è¯éè¦è®°ä½ãä¾å¦ï¼é常æä»»ä½ Attr
èç¹ç§°ä¸º attribute
ï¼æ DOM èç¹ç»æçæ°ç»ç§°ä¸º nodeList
ãä½ ä¼åç°è¿äºæ¯è¯åå
¶ä»æ¯è¯å°å¨æ´ä¸ªææ¡£ä¸è¢«ä»ç»å使ç¨ã
æ¬æåæ¯å
³äºå¯¹è±¡åä½ å¯ä»¥ç¨æ¥æä½ DOM 屿¬¡ç»æçå®é
äºç©ãå¨å¾å¤å°æ¹ï¼çè§£è¿äºä¸è¥¿ç工使¹å¼ä¼è®©äººæå°å°æãä¾å¦ï¼ä»£è¡¨ HTML form
å
ç´ çå¯¹è±¡ä» HTMLFormElement
æ¥å£è·å¾å
¶ name
屿§ï¼ä½å
¶ className
屿§æ¥èª HTMLElement
æ¥å£ãå¨è¿ä¸¤ç§æ
åµä¸ï¼ä½ æ³è¦ç屿§é½å¨é£ä¸ªè¡¨å对象ä¸ã
使¯å¯¹è±¡åå®ä»¬å¨ DOM ä¸å®ç°çæ¥å£ä¹é´çå ³ç³»å¯è½ä¼ä»¤äººå°æï¼å æ¤æ¬èè¯å¾è®²è¿°ä¸äºå ³äº DOM è§èä¸çå®é æ¥å£ä»¥åå®ä»¬å¦ä½è¢«æä¾çå 容ã
æ¥å£å对象许å¤å¯¹è±¡å®ç°äºå 个ä¸åçæ¥å£ãä¾å¦ï¼table 对象å®ç°äºä¸ä¸ªä¸é¨ç HTMLTableElement
æ¥å£ï¼å
¶ä¸å
æ¬è¯¸å¦ createCaption
å insertRow
çæ¹æ³ãä½ç±äºå®ä¹æ¯ä¸ä¸ª HTML å
ç´ ï¼æä»¥ table
å®ç°äº DOM Element
åèç« èä¸æè¿°ç Element
æ¥å£ãæåï¼å 为就 DOM èè¨ï¼HTML å
ç´ ä¹æ¯ææ HTML æ XML 页é¢å¯¹è±¡æ¨¡åçèç¹æ ä¸çä¸ä¸ªèç¹ï¼æä»¥è¡¨æ ¼å¯¹è±¡ä¹å®ç°äºæ´åºæ¬ç Node
æ¥å£ï¼Element
å°±æ¯ä»è¿ä¸ªæ¥å£è¡çåºæ¥çã
æ£å¦ä¸é¢ç示ä¾ï¼å½ä½ å¾å°ä¸ä¸ª table
对象çå¼ç¨æ¶ï¼ä½ ç»å¸¸ä¼è½®æµä½¿ç¨å¯¹è±¡å®ç°çä¸ä¸ªä¸åæ¥å£çæ¹æ³ï¼ä½å¹¶ä¸ç¥å
¶æä»¥ç¶ã
const table = document.getElementById("table");
const tableAttrs = table.attributes; // Node/Element æ¥å£
for (let i = 0; i < tableAttrs.length; i++) {
// HTMLTableElement æ¥å£ï¼border 屿§
if (tableAttrs[i].nodeName.toLowerCase() === "border") {
table.border = "1";
}
}
// HTMLTableElement æ¥å£ï¼summary 屿§
table.summary = "note: increased border";
DOM ä¸çæ ¸å¿æ¥å£
æ¬èååºäº DOM ä¸ä¸äºæå¸¸ç¨çæ¥å£ãæä»¬çæ³æ³ä¸æ¯å¨è¿éæè¿°è¿äº API çä½ç¨ï¼èæ¯è®©ä½ äºè§£å¨ä½ ä½¿ç¨ DOM æ¶ç»å¸¸ä¼çå°çåç§æ¹æ³å屿§ãè¿äºå¸¸ç¨ç API 卿¬èæåç DOM å®ä¾ä¸ç« ä¸çè¾é¿ç示ä¾ä¸ä½¿ç¨ã
document
å window
对象æ¯ä½ å¨ DOM ç¼ç¨ä¸æå¸¸ä½¿ç¨çæ¥å£å¯¹è±¡ãç®åæ¥è¯´ï¼window
对象代表类似æµè§å¨çä¸è¥¿ï¼è document
å¯¹è±¡æ¯ææ¡£æ¬èº«çæ ¹ãElement
ç»§æ¿èªéç¨ç Node
æ¥å£ï¼è¿ä¸¤ä¸ªæ¥å£ä¸èµ·æä¾äºè®¸å¤ä½ å¨å个å
ç´ ä¸ä½¿ç¨çæ¹æ³å屿§ãè¿äºå
ç´ ä¹å¯ä»¥æç¹å®çæ¥å£æ¥å¤çè¿äºå
ç´ ææçæ°æ®ç§ç±»ï¼å¦ä¸ä¸èä¸ç table
对象ç示ä¾ã
ä¸é¢æ¯å¨ web å XML 页é¢èæ¬ä¸ä½¿ç¨ DOM æ¶ï¼ä¸äºå¸¸ç¨ç API ç®è¦å表ã
document.querySelector()
document.querySelectorAll()
document.createElement()
Element.innerHTML
Element.setAttribute()
Element.getAttribute()
EventTarget.addEventListener()
HTMLElement.style
Node.appendChild()
window.onload
window.scrollTo()
æ¬å®ä¾ä½¿ç¨äºå
å«äºä¸ä¸ª <textarea>
å两个 <button>
å
ç´ ç <div>
å
ç´ ãå½ç¨æ·ç¹å»ç¬¬ä¸ä¸ªæé®æ¶ï¼æä»¬å¨ <textarea>
䏿¾ç½®ä¸äºææ¬ãå½ç¨æ·ç¹å»ç¬¬äºä¸ªæé®æ¶ï¼æä»¬æ¸
餿æ¬å
容ãæä»¬ä½¿ç¨ï¼
Document.querySelector()
æ¥è®¿é® <textarea>
åæé®EventTarget.addEventListener()
æ¥ç嬿é®çç¹å»äºä»¶Node.textContent
æ¥è®¾ç½®åæ¸
餿æ¬<div class="container">
<textarea class="story"></textarea>
<button id="set-text" type="button">è®¾ç½®ææ¬å
容</button>
<button id="clear-text" type="button">æ¸
餿æ¬å
容</button>
</div>
CSS
.container {
display: flex;
gap: 0.5rem;
flex-direction: column;
}
button {
width: 200px;
}
JavaScript
const story = document.body.querySelector(".story");
const setText = document.body.querySelector("#set-text");
setText.addEventListener("click", () => {
story.textContent = "It was a dark and stormy night...";
});
const clearText = document.body.querySelector("#clear-text");
clearText.addEventListener("click", () => {
story.textContent = "";
});
ç»æ æ·»å åå
ç´
æ¬å®ä¾ä½¿ç¨äºå
å«äºä¸ä¸ª <div>
å两个 <button>
å
ç´ ç <div>
å
ç´ ãå½ç¨æ·ç¹å»ç¬¬ä¸ä¸ªæé®æ¶ï¼æä»¬å建ä¸ä¸ªæ°çå
ç´ ï¼å¹¶æ·»å å° <div>
çåå
ç´ ãå½ç¨æ·ç¹å»ç¬¬äºä¸ªæé®æ¶ï¼æä»¬ç§»é¤é£ä¸ªåå
ç´ ãæä»¬ä½¿ç¨ï¼
Document.querySelector()
æ¥è®¿é® <div>
åæé®EventTarget.addEventListener()
æ¥ç嬿é®ç¹å»äºä»¶Document.createElement
æ¥å建å
ç´ Node.appendChild()
æ¥æ·»å åå
ç´ Node.removeChild()
æ¥ç§»é¤åå
ç´ <div class="container">
<div class="parent">ç¶å
ç´ </div>
<button id="add-child" type="button">æ·»å åå
ç´ </button>
<button id="remove-child" type="button">ç§»é¤åå
ç´ </button>
</div>
CSS
.container {
display: flex;
gap: 0.5rem;
flex-direction: column;
}
button {
width: 100px;
}
div.parent {
border: 1px solid black;
padding: 5px;
width: 100px;
height: 100px;
}
div.child {
border: 1px solid red;
margin: 10px;
padding: 5px;
width: 80px;
height: 60px;
box-sizing: border-box;
}
JavaScript
const parent = document.body.querySelector(".parent");
const addChild = document.body.querySelector("#add-child");
addChild.addEventListener("click", () => {
// åªå¨ææ¬èç¹âç¶èç¹â没æåèç¹æ¶æ·»å ä¸ä¸ªåèç¹
if (parent.childNodes.length > 1) {
return;
}
const child = document.createElement("div");
child.classList.add("child");
child.textContent = "åèç¹";
parent.appendChild(child);
});
const removeChild = document.body.querySelector("#remove-child");
removeChild.addEventListener("click", () => {
const child = document.body.querySelector(".child");
parent.removeChild(child);
});
ç»æ è§è
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4