ææ¡£å¯¹è±¡æ¨¡åï¼DOMï¼
ææ¡£å¯¹è±¡æ¨¡åï¼DOMï¼éè¿å°ææ¡£çç»æï¼ä¾å¦è¡¨ç¤ºç½é¡µç HTMLï¼ä»¥å¯¹è±¡çå½¢å¼åå¨å¨å åä¸ï¼å°ç½é¡µä¸èæ¬æç¼ç¨è¯è¨è¿æ¥èµ·æ¥ãå°½ç®¡å° HTMLãSVG æ XML ææ¡£å»ºæ¨¡ä¸ºå¯¹è±¡å¹¶ä¸æ¯ JavaScript æ ¸å¿è¯è¨çä¸é¨åï¼ä½å®éå¸¸ä¸ JavaScript ç¸å ³ã
DOM 使ç¨é»è¾æ ç形弿¥è¡¨ç¤ºææ¡£ãæ çæ¯ä¸ªåæ¯æ«ç«¯é½æ¯ä¸ä¸ªèç¹ï¼æ¯ä¸ªèç¹é½å å«å¯¹è±¡ã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 æ ï¼
DOM æ æ¯ä¸ç§æ ç¶ç»æï¼å ¶èç¹ä»£è¡¨ HTML æ XML ææ¡£å å®¹ãæ¯ä¸ä¸ª HTML æ XML ææ¡£é½æå ¶ DOM æ è¡¨ç¤ºæ¹æ³ãä¾å¦ï¼èèå¦ä¸ææ¡£ï¼
<html lang="en">
<head>
<title>My Document</title>
</head>
<body>
<h1>Header</h1>
<p>Paragraph</p>
</body>
</html>
å ¶ DOM æ 类似äºè¿æ ·ï¼

è½ç¶ä¸é¢çæ ä¸ä¸é¢ææ¡£ç DOM æ ç¸ä¼¼ï¼ä½å¹¶ä¸å®å ¨ç¸åï¼å 为å®é ç DOM æ ä¿çäºç©ºç½ã
å½ web æµè§å¨è§£æ HTML ææ¡£æ¶ï¼å®å»ºç«äºä¸ä¸ª DOM æ ï¼ç¶åç¨å®æ¥æ¾ç¤ºææ¡£ã
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>
DOM æ¥å£
以䏿¯ DOM è§èå®ä¹çæææ¥å£ï¼
AbortControllerAbortSignalAbstractRangeAttrCDATASectionCharacterDataCommentCustomEventDocumentDocumentFragmentDocumentTypeDOMErrorå·²å¼ç¨DOMExceptionDOMImplementationDOMParserDOMTokenListElementEventEventTargetHTMLCollectionMutationObserverMutationRecordNamedNodeMapNodeNodeIteratorNodeListProcessingInstructionQuotaExceededErrorRangeShadowRootStaticRangeTextTreeWalkerXMLDocumentXPathEvaluatorXPathExpressionXPathResultXSLTProcessor
æ¬æåæ¯å
³äºå¯¹è±¡åä½ å¯ä»¥ç¨æ¥æä½ 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";
åºæ¬çæ°æ®ç±»å
æ¬é¡µè¯å¾ç¨ç®åçè¯è¨æè¿°åç§å¯¹è±¡åç±»åã使¯ï¼æä¸äºä¸åçæ°æ®ç±»åå¨ 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ãä½ ä¼åç°è¿äºæ¯è¯åå
¶ä»æ¯è¯å°å¨æ´ä¸ªææ¡£ä¸è¢«ä»ç»å使ç¨ã
document å window 对象æ¯ä½ å¨ DOM ç¼ç¨ä¸æå¸¸ä½¿ç¨çæ¥å£å¯¹è±¡ãç®åæ¥è¯´ï¼window 对象代表类似æµè§å¨çä¸è¥¿ï¼è document å¯¹è±¡æ¯ææ¡£æ¬èº«çæ ¹ãElement ç»§æ¿èªéç¨ç Node æ¥å£ï¼è¿ä¸¤ä¸ªæ¥å£ä¸èµ·æä¾äºè®¸å¤ä½ å¨å个å
ç´ ä¸ä½¿ç¨çæ¹æ³å屿§ãè¿äºå
ç´ ä¹å¯ä»¥æç¹å®çæ¥å£æ¥å¤çè¿äºå
ç´ ææçæ°æ®ç§ç±»ï¼å¦ä¸ä¸èä¸ç table 对象ç示ä¾ã
è¿æ¶ç DOM æ¥å£
ææ¡£å¯¹è±¡æ¨¡å已被é«åº¦ç®åã为äºå®ç°è¿ä¸ç®æ ï¼å·²å¨ DOM 第 3 çææ´æ©çåç§è§èä¸ç§»é¤äºä»¥ä¸æ¥å£ãå®ä»¬ä¸å对 Web å¼åè å¯ç¨ã
DOMConfigurationDOMErrorHandlerDOMImplementationListDOMImplementationRegistryDOMImplementationSourceDOMLocatorDOMObjectDOMSettableTokenListDOMUserDataElementTraversalEntityEntityReferenceNameListNotationTypeInfoUserDataHandler
HTML DOM
å
å« HTML çææ¡£éè¿ Document æ¥å£è¿è¡æè¿°ï¼HTML è§èæ©å±äºè¿ä¸ªæ¥å£ï¼å
å«äºåç§ HTML ç¹æçç¹æ§ãå°¤å
¶æ¯ Element æ¥å£è¢«æå±ä¸º HTMLElement 以åå¾å¤ä¸åçåç±»ï¼æ¯ä¸ªå类代表ä¸ä¸ªï¼æä¸ç³»åå¯åç¸å
³çï¼å
ç´ ã
HTML DOM API æä¾äºå¯¹åç§æµè§å¨ç¹æ§ç访é®ï¼å¦æ ç¾åçªå£ãCSS æ ·å¼åæ ·å¼è¡¨ãæµè§å¨åå²è®°å½çãè¿äºæ¥å£å°å¨ HTML DOM API ææ¡£ä¸è¿ä¸æ¥è®¨è®ºã
SVG DOM
åæ ·ï¼å
å« SVG çææ¡£ä¹éè¿ Document æ¥å£æ¥æè¿°ï¼æ¥å£ç± SVG è§èæ©å±ï¼å
å«äºåç§ SVG ç¹æçç¹æ§ãå°¤å
¶æ¯ Element æ¥å£è¢«æå±ä¸º SVGElement 以åå¾å¤ä¸åçåç±»ï¼æ¯ä¸ªå类代表ä¸ä¸ªï¼æä¸ç³»åå¯åç¸å
³çï¼å
ç´ ãè¿äºæ¥å£å°å¨ SVG API ææ¡£ä¸è¿ä¸æ¥è®¨è®ºã
示ä¾
>è®¾ç½®ææ¬å 容
æ¬ç¤ºä¾ä½¿ç¨äºå
å«äºä¸ä¸ª <textarea> å两个 <button> å
ç´ ç <div> å
ç´ ãå½ç¨æ·ç¹å»ç¬¬ä¸ä¸ªæé®æ¶ï¼æä»¬å¨ <textarea> 䏿¾ç½®ä¸äºææ¬ãå½ç¨æ·ç¹å»ç¬¬äºä¸ªæé®æ¶ï¼æä»¬æ¸
餿æ¬å
容ãæä»¬ä½¿ç¨ï¼
Document.querySelector()æ¥è®¿é®<textarea>åæé®EventTarget.addEventListener()æ¥ç嬿é®çç¹å»äºä»¶Node.textContentæ¥è®¾ç½®åæ¸ é¤ææ¬
HTML
<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()æ¥ç§»é¤åå ç´
HTML
<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);
});
ç»æ
读åå¹¶ä¿®æ¹ DOM æ
å设ä½è æ¹åä¸é¢ææ¡£ç页çå 容ï¼å¹¶ä¸ä½¿ç¨ä¸¤ä¸ªæ®µè½å代ä¸ä¸ªæ®µè½ãå®ç°ä»£ç å¦ä¸ï¼
HTML
<html lang="zh-CN">
<head>
<title>æçææ¡£</title>
</head>
<body>
<input type="button" value="æ¹åè¿ä¸ªææ¡£ã" onclick="change()" />
<h2>页ç</h2>
<p>段è½</p>
</body>
</html>
JavaScript
function change() {
// document.getElementsByTagName("h2") è¿åææ¡£ä¸ææ <h2> ç»æç NodeListï¼ç¬¬ä¸é¡¹ç¨æ°å 0 åå°ï¼
const header = document.getElementsByTagName("h2").item(0);
// 页çç第ä¸ä¸ªåèç¹ï¼firstChildï¼æ¯ä¸ä¸ªææ¬èç¹
header.firstChild.data = "ä¸ä¸ªå¨æææ¡£";
// ç°å¨é¡µççå
容为âä¸ä¸ªå¨æææ¡£â
// 访é®ç¬¬ä¸ä¸ªæ®µè½
const para = document.getElementsByTagName("p").item(0);
para.firstChild.data = "è¿æ¯ç¬¬ä¸æ®µã";
// å建ä¸ä¸ªç¨äºå¼ç¨ç¬¬äºæ®µçææ¬èç¹
const newText = document.createTextNode("è¿æ¯ç¬¬äºæ®µã");
// å建ä¸ä¸ªä½ä¸ºç¬¬äºæ®µçå
ç´
const newElement = document.createElement("p");
// å°ææ¬æ¾å
¥æ®µè½å
ç´ ä¸
newElement.appendChild(newText);
// éè¿å bodyï¼para çç¶èç¹ï¼æ«å°¾æ·»å çæ¹å¼å°æ®µè½å
ç´ æ¾å¨ææ¡£çæ«å°¾
para.parentNode.appendChild(newElement);
}
å建 DOM æ
ä½ ä¹å¯ä»¥å®å ¨ä½¿ç¨ JavaScript å建ä»ä¹æ¯ DOM æ ï¼ä¸çæ ã
const root = document.createElement("html");
root.lang = "en";
const head = document.createElement("head");
const title = document.createElement("title");
title.appendChild(document.createTextNode("My Document"));
head.appendChild(title);
const body = document.createElement("body");
const header = document.createElement("h1");
header.appendChild(document.createTextNode("Header"));
const paragraph = document.createElement("p");
paragraph.appendChild(document.createTextNode("Paragraph"));
body.appendChild(header);
body.appendChild(paragraph);
root.appendChild(head);
root.appendChild(body);
äºä»¶ä¼ æ
æ¬å®ä¾ä»¥ä¸ç§é常ç®åçæ¹å¼æ¼ç¤ºäºäºä»¶æ¯å¦ä½å¨ DOM ä¸å¯å¨åå¤ççãå½è¿ä¸ª HTML ææ¡£ç BODY å è½½æ¶ï¼ä¸ä¸ªäºä»¶çå¬å¨è¢«æ³¨åå¨ TABLE çé¡¶è¡ãäºä»¶çå¬å¨éè¿æ§è¡å½æ° stopEvent æ¥å¤çäºä»¶ï¼å®æ¹åäºè¡¨æ ¼åºé¨åå æ ¼çå¼ã
ç¶èï¼stopEvent ä¹è°ç¨äºäºä»¶å¯¹è±¡æ¹æ³ event.stopPropagationï¼å®ä½¿äºä»¶ä¸åå DOM ä¸å泡ã请注æï¼è¡¨æ ¼æ¬èº«æä¸ä¸ª onclick äºä»¶å¤çå¨ï¼å½è¡¨æ ¼è¢«ç¹å»æ¶åºè¯¥æ¾ç¤ºä¸æ¡ä¿¡æ¯ã使¯ stopEvent æ¹æ³å·²ç»åæ¢äºä¼ æï¼æä»¥å¨è¡¨æ ¼ä¸çæ°æ®è¢«æ´æ°åï¼äºä»¶é¶æ®µå®é
ä¸å·²ç»ç»æï¼å¹¶ä¸æ¾ç¤ºäºä¸ä¸ªè¦æ¥æ¡æ¥ç¡®è®¤è¿ä¸ç¹ã
<table id="t-daddy">
<tr id="tbl1">
<td id="c1">ä¸</td>
</tr>
<tr>
<td id="c2">äº</td>
</tr>
</table>
#t-daddy {
border: 1px solid red;
}
#c1 {
background-color: pink;
}
function stopEvent(event) {
const c2 = document.getElementById("c2");
c2.textContent = "ä½ å¥½";
// è¿åºè¯¥å¯ä»¥é»æ¢ t-daddy 被ç¹å»ã
event.stopPropagation();
console.log("äºä»¶ä¼ éç»æ¢ã");
}
const elem = document.getElementById("tbl1");
elem.addEventListener("click", stopEvent);
document.getElementById("t-daddy").addEventListener("click", () => {
console.log("t-daddy 被ç¹å»");
});
æ¾ç¤ºäºä»¶å¯¹è±¡ç屿§
æ¬ç¤ºä¾ä½¿ç¨ DOM æ¹æ³æ¥æ¾ç¤º onload event å¯¹è±¡çææå±æ§åå
¶å¨è¡¨æ ¼ä¸çå¼ãå®è¿å±ç¤ºäºä¸ç§æç¨çææ¯ï¼å³ä½¿ç¨ for...in å¾ªç¯æ¥è¿ä»£å¯¹è±¡ç屿§ä»¥è·åå
¶å¼ã
äºä»¶å¯¹è±¡ç屿§å¨ä¸åçæµè§å¨ä¹é´æå¾å¤§çä¸åï¼WHATWG DOM æ åååºäºæ åç屿§ï¼ç¶èè®¸å¤æµè§å¨å¯¹è¿äºå±æ§åäºå¾å¤§çæ©å±ã
æä¸é¢çä»£ç æ¾å°ä¸ä¸ªç©ºç½çææ¬æä»¶ä¸ï¼å¹¶æå®å è½½å°åç§æµè§å¨ä¸ï¼ä½ ä¼å¯¹ä¸åæ°éååç§°ç屿§æå°æè®¶ãä½ å¯è½è¿æ³å¨é¡µé¢ä¸æ·»å ä¸äºå ç´ ï¼ä»ä¸åçäºä»¶å¤çç¨åºä¸è°ç¨è¿ä¸ªå½æ°ã
<h1>DOM <span id="eventType"></span> äºä»¶å¯¹è±¡ç屿§</h1>
table {
border-collapse: collapse;
}
thead {
font-weight: bold;
}
td {
padding: 2px 10px;
}
.odd {
background-color: #efdfef;
}
.even {
background-color: white;
}
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 = ["#", "屿§", "å¼"];
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);
}
showEventProperties(event);
è§è
| Specification |
|---|
| DOM > |