å¤ç空ç½å符
DOM ä¸åå¨ç空ç½å符ä¼å¯¼è´å¸å±é®é¢ï¼å¹¶ä½¿å 容æ çæä½åå¾å°é¾ï¼è¿åå³äºå®çä½ç½®ãå¯è½åºç°å°é¾çæ å½¢ï¼å¹¶åæäºå¦ä½ç¼è§£ç±æ¤å¼åçé®é¢ã
ä»ä¹æ¯ç©ºç½å符ï¼
空ç½å符å¨ä¸åç¼ç¨è¯è¨ç¯å¢ä¸å ·æä¸åå«ä¹ãå¯¹ææ¡£ç©ºç½å符èè¨ï¼ä» å å«ç©ºæ ¼ï¼U+0020ï¼ãå¶è¡¨ç¬¦ï¼U+0009ï¼ãæ¢è¡ç¬¦ï¼LFï¼U+000Aï¼åå车符ï¼CRï¼U+000Dï¼ï¼å ¶ä¸åè½¦ç¬¦å¨æææ¹é¢é½çåäºç©ºæ ¼ãè¿äºå符å¯ç¨äºæ ¼å¼å代ç 以æåå¯è¯»æ§ãæä»¬çæºä»£ç ä¸å æ¥çå¤§éæ¤ç±»ç©ºç½å符ï¼éå¸¸ä» å¨ç产æå»ºé¶æ®µä¸ºç¼©åæä»¶å¤§å°èå°å ¶ç§»é¤ã
请注æï¼æ¤å表ä¸å
å«ä¸å¯åå²ç©ºæ ¼ï¼U+00A0ï¼HTML ä¸ç ï¼ãå æ¤è¿äºå符ä¸ä¼è§¦å任使å ï¼è¿ä¹æ¯å®ä»¬å¸¸è¢«ç¨äºå¨ HTML ä¸å建æ´é¿ç©ºæ ¼çåå ã
CSS è¿å®ä¹äºåæ®µç¬¦çæ¦å¿µï¼å¨ HTML è¯å¢ä¸å ¶åè½çåäºæ¢è¡ç¬¦ã
HTML å¦ä½å¤ç空ç½å符ï¼
âHTML ä¼å¿½ç¥ç©ºç½åç¬¦âæ¯ä¸ä¸ªæ®éåå¨ç误解ï¼äºå®å¹¶é妿¤ï¼HTML ä¼å®æ´ä¿çæºä»£ç 䏿æç©ºç½ææ¬å
容ãä½ä¸ºæ è®°è¯è¨ï¼HTML ä¼çæä¸ä¸ª DOMï¼å
¶ä¸ææ¬å
å®¹çææç©ºç½å符åè¢«å®æ´ä¿çï¼å¯éè¿ DOM APIï¼å¦ Node.textContentï¼è¿è¡æ£ç´¢åæä½ãè¥ HTML ä» DOM ä¸ç§»é¤ç©ºç½å符ï¼é£ä¹ä½ä¸ºåºäº DOM å·¥ä½ç䏿¸¸æ¸²æå¼æï¼CSS å°æ æ³éè¿ white-space 屿§ä¿çè¿äºç©ºç½ã
夿³¨ï¼éè¦æç¡®çæ¯ï¼æä»¬è®¨è®ºçæ¯ HTML æ ç¾ä¹é´ç空ç½å符ï¼è¿äºç©ºç½åç¬¦å¨ DOM ä¸ä¼è½¬åä¸ºææ¬èç¹ãèä»»ä½ä½äºæ ç¾å é¨ç空ç½å符ï¼å³ä½äºå°æ¬å·ä¹é´ä½ä¸å±äºå±æ§å¼ç空ç½ï¼ä» æ¯ HTML è¯æ³çä¸é¨åï¼ä¸ä¼åºç°å¨ DOM ä¸ã
夿³¨ï¼ç±äº HTML è§£æçç¹æ®æ§ï¼å¼èª DOM è§èï¼ï¼ç¡®å®å卿äºä½ç½®ä¼å¿½ç¥ç©ºç½å符ãä¾å¦ï¼<html> ä¸ <head> èµ·å§æ ç¾ä¹é´ï¼æ </body> ä¸ </html> ç»ææ ç¾ä¹é´ç空ç½å符ä¼è¢«å¿½ç¥ä¸ä¸ä¼åºç°å¨ DOM ä¸ãæ¤å¤ï¼è§£æ <pre> å
ç´ çææ¬å
容æ¶ï¼å¼å¤´çå个æ¢è¡ç¬¦ä¼è¢«ç§»é¤ãæä»¬å¿½ç¥è¿äºè¾¹çæ
åµã
æ¤å¤ï¼HTML è§£æå¨ä¼è§èåæäºç©ºç½å符ï¼å®å° CR å CRLF åºåæ¿æ¢ä¸ºå个 LFãç¶èï¼CR å符ä¹å¯éè¿å符å¼ç¨æ JavaScript æå ¥ DOMï¼å æ¤ CSS 空ç½å符å¤çè§åä»éå®ä¹å ¶å¤çæ¹å¼ã
以ä¸åææ¡£ä¸ºä¾ï¼
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>My Document</title>
</head>
<body>
<h1>Header</h1>
<p>Paragraph</p>
</body>
</html>
å ¶ DOM æ 类似äºè¿æ ·ï¼

注æå°ï¼
- 伿ä¸äºææ¬èç¹åªå å«ç©ºç½å符ï¼èä¸
- æäºææ¬èç¹ä¼å¨å¼å¤´æç»å°¾æç©ºç½å符ã
夿³¨ï¼Firefox å¼åè å·¥å ·æ¯æé«äº®æ¾ç¤ºææ¬èç¹ï¼ä¾¿äºåç¡®è¯å«å å«ç©ºç½å符çèç¹ã纯空ç½èç¹ä¼æ 注为â空ç½âæ ç¾ã
å¨ DOM ä¸ä¿ç空ç½å符å¨å¾å¤æ¹é¢é½æ¯æç¨çï¼ä½å¨æäºå°æ¹ï¼è¿ä½¿å¾æäºå¸å±æ´é¾å®ç°ï¼å¹¶ç»é£äºæ³å¨ DOM ä¸è¿ä»£èç¹çå¼åè 带æ¥äºé®é¢ãæä»¬å°å¨åç»ç« èçè§£å³ç©ºç½å符èç¹å¸¸è§é®é¢é¨åæ¢è®¨è¿äºé®é¢åç¸å ³è§£å³æ¹æ¡ã
CSS å¦ä½å¤ç空ç½å符ï¼
å½ DOM è¢«ä¼ éç» CSS è¿è¡æ¸²ææ¶ï¼é»è®¤æ åµä¸ç©ºç½å符ä¼è¢«å¤§éç§»é¤ãè¿æå³ç代ç çæ ¼å¼åæ¹å¼å¯¹æç»ç¨æ·ä¸å¯è§ââå¨å ç´ å¨å´åå é¨åå»ºç©ºé´æ¯ CSS çèè´£ã
<!doctype html>
<h1> Hello World! </h1>
该æºä»£ç å¨ doctype æ ç¾åå
å«è¥å¹²æ¢è¡ç¬¦ï¼å¹¶å¨ <h1> æ ç¾åååå
é¨åå¨å¤§éç©ºæ ¼å符ã使µè§å¨ä¼å¿½ç¥è¿äºç©ºç½å符ï¼ä»
æ¾ç¤ºâHello World!âåæ ·ï¼ä»¿ä½è¿äºåç¬¦æ ¹æ¬ä¸åå¨ï¼
CSS ä¼å¿½ç¥å¤§é¨åï¼ä½å¹¶éå ¨é¨ï¼ç©ºç½å符ã卿¤ç¤ºä¾ä¸ï¼å½é¡µé¢å¨æµè§å¨ä¸æ¸²ææ¶ï¼âHelloâä¸âWorld!âä¹é´çä¸ä¸ªç©ºæ ¼ä»ç¶åå¨ãCSS éç¨ç¹å®ç®æ³æ¥å¤å®åªäºç©ºç½åç¬¦å¯¹ç¨æ·æ å ³ç´§è¦ï¼å¹¶å³å®å¦ä½ç§»é¤æè½¬æ¢è¿äºå符ãæä»¬å°å¨æ¥ä¸æ¥çç« èä¸è¯¦ç»è¯´æè¯¥å¤çæºå¶çå·¥ä½åçã
æå ä¸è½¬æ¢
让æä»¬çä¸ä¸ªä¾åã为äºä½¿ç©ºç½å符æ´çªåºï¼æä»¬è¿æ·»å äºæ³¨éï¼å°ææç©ºæ ¼æ¾ç¤ºä¸ºâ¦ï¼ææå¶è¡¨ç¬¦æ¾ç¤ºä¸ºâ¥ï¼æææ¢è¡ç¬¦æ¾ç¤ºä¸ºâï¼
<h1> Hello
<span> World!</span> </h1>
<!--
<h1>â¦â¦â¦Helloâ¦â
â¥â¥â¥â¥<span>â¦World!</span>â¥â¦â¦</h1>
-->
ä¼å¨æµè§å¨ä¸åè¿æ ·æ¸²æï¼
<h1> å
ç´ å
å«ï¼
- ä¸ä¸ªææ¬èç¹ï¼å å«ä¸äºç©ºæ ¼ãåè¯âHelloâãä¸ä¸ªæ¢è¡ç¬¦åä¸äºå¶è¡¨ç¬¦ï¼ã
- ä¸ä¸ªè¡å
å
ç´ ï¼
<span>ï¼å å«ä¸ä¸ªç©ºæ ¼ååè¯âWorld!âï¼ã - å¦å¤ä¸ä¸ªææ¬èç¹ï¼åªå å«å¶è¡¨ç¬¦åç©ºæ ¼ï¼ã
ç±äº <h1> åªå
å«è¡çº§å
ç´ ï¼å®å»ºç«äºè¡å
æ ¼å¼åä¸ä¸æãè¿æ¯æµè§å¨å¼æå¯è½ä½¿ç¨çå¸å±æ¸²æä¸ä¸æä¹ä¸ã
å¨è¿ä¸ªä¸ä¸æä¸ï¼ç©ºç½å符çå¤çå¯ä»¥æ»ç»å¦ä¸ï¼
夿³¨ï¼è¯¥ç®æ³å¯éè¿ white-space-collapse 屿§ï¼æå
¶ç®å屿§ white-spaceï¼è¿è¡é
ç½®ãæä»¬å°é¦å
å设å
¶é»è®¤å¼ï¼white-space-collapse: collapseï¼ï¼ç¶åæ¢è®¨ä¸å屿§å¼å¦ä½å½±åè¯¥ç®æ³ã
-
é¦å ï¼æ¢è¡ç¬¦ååç´§é»çææç©ºæ ¼åå¶è¡¨ç¬¦é½ä¼è¢«å¿½ç¥ãå æ¤ï¼å¦ææä»¬åèä¹åçç¤ºä¾æ è®°ï¼
html<h1>â¦â¦â¦Helloâ¦â â¥â¥â¥â¥<span>â¦World!</span>â¥â¦â¦</h1>åºç¨è¿æ¡è§åï¼ä¼å¾å°ï¼
html<h1>â¦â¦â¦Helloâ <span>â¦World!</span>â¥â¦â¦</h1> -
ç¶åï¼è¿ç»çæ¢è¡ç¬¦è¢«æå 为å个æ¢è¡ç¬¦ãæ¤ç¤ºä¾ä¸ä¸åå¨ã
-
æ¥ä¸æ¥ï¼æºä»£ç ä¸çè¡éè¿ç§»é¤ææå©ä½æ¢è¡ç¬¦å并为åè¡ãå ·ä½å¤çæ¹å¼åå³äºæ¢è¡ç¬¦ååçä¸ä¸æï¼æ¢è¡ç¬¦è¦ä¹è½¬æ¢ä¸ºç©ºæ ¼ï¼U+0020ï¼ï¼è¦ä¹ç´æ¥å é¤ãå ·ä½éç¨åªç§æ¹å¼åå³äºæµè§å¨åè¯è¨ç¯å¢ã卿¬ä¾çè±æææ¬ä¸ï¼åè¯é´ä»¥ç©ºæ ¼åéï¼ï¼æææ¢è¡ç¬¦é½å°è¢«â转æ¢âä¸ºç©ºæ ¼ãæç»ç»æå¦ä¸ï¼
html<h1>â¦â¦â¦Helloâ¦<span>â¦World!</span>â¦â¦â¦</h1>å¼å¾æ³¨æçæ¯ï¼å¨æ²¡æè¯é´åé符çè¯è¨ï¼å¦ä¸æï¼ä¸ï¼è¡ä¸è¡ä¹é´ä¸çç©ºæ ¼ãå æ¤ï¼
html<div>ä½ å¥½ ä¸ç</div>æ ¹æ®æµè§å¨çå¯åå¼ç®æ³ï¼å¯è½ä¼æ¸²æä¸ºâä½ å¥½ä¸çâï¼ä¸é´ä¸å¸¦ç©ºæ ¼ã
-
ç¶åï¼ææçå¶è¡¨ç¬¦é½ä¼è½¬æ¢ä¸ºç©ºæ ¼åç¬¦ï¼æä»¥ç¤ºä¾å°å为ï¼
html<h1>â¦â¦â¦Helloâ <span>â¦World!</span>â¦â¦â¦</h1> -
ä¹åï¼ä»»ä½ç´§æ¥å¨å¦ä¸ä¸ªç©ºæ ¼ä¹åçç©ºæ ¼ï¼å³ä½¿è·¨è¶ä¸¤ä¸ªç¬ç«çè¡çº§å ç´ ï¼é½ä¼è¢«å¿½ç¥ï¼å æ¤æç»ç»æä¸ºï¼
html<h1>â¦Helloâ¦<span>World!</span>â¦</h1>
è¿å°±æ¯ä¸ºä»ä¹äººä»¬å¨è®¿é®ç½é¡µæ¶ï¼ä¼çå°âHello World!âè¿å¥è¯å¾å¥½å°åå¨é¡µé¢çé¡¶é¨ï¼è䏿¯ä¸ä¸ªå¥æªç缩è¿çâHelloâï¼ä½å¨ä¸é¢ä¸è¡æä¸ä¸ªæ´å¥æªç缩è¿çâWorld!âã
宿ä¸è¿°æ¥éª¤åï¼æµè§å¨ä¼å¤çæ¢è¡åååææ¬ï¼æ¤å¤æä»¬ä¸äºèèã请注æï¼å¨ <h1> æ ç¾å¼å¤´ä¸ </h1> æ ç¾éåä¹é´ä»åå¨ç©ºç½å符ï¼ä½è¿äºç©ºç½å符ä¸ä¼å¨æµè§å¨ä¸æ¾ç¤ºãæ¥ä¸æ¥æä»¬å°å¤çæ¤é®é¢ï¼å
·ä½å°å¨æ¯è¡å¸å±æ¶è¿è¡ã
ä¸åç white-space-collapse å¼ä¼è·³è¿æ¤ç®æ³çä¸åé¨åï¼
preserveåbreak-spacesï¼è·³è¿æ´ä¸ªç®æ³ï¼ä¸åçä»»ä½ç©ºç½å符æå æè½¬æ¢ãpreserve-breaksï¼è·³è¿ç¬¬äºæ¥åç¬¬ä¸æ¥ï¼ä¿çæ¢è¡ç¬¦ãpreserve-spacesï¼è·³è¿æ´ä¸ªç®æ³ï¼ç®æ³åä¸ºä» å°å¶è¡¨ç¬¦åæ¢è¡ç¬¦è½¬æ¢ä¸ºç©ºæ ¼ã
ç®èè¨ä¹ï¼ä¸åç±»åç空ç½åç¬¦å°æä»¥ä¸æ¹å¼è¿è¡æå å转æ¢ï¼
- å¶è¡¨ç¬¦é常转æ¢ä¸ºç©ºæ ¼ã
- è¥éæå åæ®µç¬¦ï¼
- è¿ç»çåæ®µç¬¦åºåå°æå 为åä¸ªåæ®µç¬¦ã
- å¨ä½¿ç¨ç©ºç½å符åéåè¯çè¯è¨ï¼å¦è±è¯ï¼ä¸ï¼å®ä»¬å°è½¬æ¢ä¸ºç©ºç½å符ï¼èå¨ä¸ä½¿ç¨ç©ºç½å符åéåè¯çè¯è¨ï¼å¦ä¸æï¼ä¸ï¼åå®å ¨ç§»é¤ã
- è¥éæå 空ç½å符ï¼
- æè¡ç¬¦åå空ç½å符æå¶è¡¨ç¬¦å°è¢«ç§»é¤ã
- è¿ç»ç©ºç½å符åºåæå 为å个空ç½å符ã
- ä¿ç空ç½å符æ¶ï¼è¿ç»ç©ºç½å符è§ä¸ºä¸å¯æè¡ï¼ä½ä¼å¨æ¯ç»ç©ºç½å符æ«å°¾è¿è¡è½¯æ¢è¡ââå³ä¸ä¸è¡å§ç»ä»ä¸ä¸ä¸ªé空ç½å符å¼å§ãä½å½éç¨
break-spaces弿¶ï¼æ¯ä¸ªç©ºç½å符åé½å¯è½åç软æ¢è¡ï¼å æ¤ä¸ä¸è¡å¯è½ä»¥ä¸ä¸ªæå¤ä¸ªç©ºç½å符å¼å¤´ã
ä¿®åªä¸å®ä½
å¨è¡å ååºåæ ¼å¼åä¸ä¸æä¸ï¼å ç´ åæè¡è¿è¡æçãè¡å æ ¼å¼åä¸ä¸æä¸ï¼è¡éè¿ææ¬æ¢è¡çæãèå¨åçº§æ ¼å¼åä¸ä¸æä¸ï¼æ¯ä¸ªå级å ç´ åèªå½¢æç¬ç«è¡ãæ¯è¡å¸å±æ¶ï¼ç©ºç½å符ä¼ç»§ç»è¢«å¤çã让æä»¬éè¿ç¤ºä¾è¯´æå ¶å·¥ä½åçã
æ¬ä¾ä¸ï¼æä»¬ä»åä¹å飿 ·å¨æ³¨é䏿 è®°äºç©ºç½å符ãå
±æä¸ä¸ªä»
å«ç©ºç½åç¬¦çææ¬èç¹ï¼ç¬¬ä¸ä¸ªä½äºé¦ä¸ª <div> ä¹åï¼ç¬¬äºä¸ªä½äºä¸¤ä¸ª <div> ä¹é´ï¼ç¬¬ä¸ä¸ªä½äºç¬¬äºä¸ª <div> ä¹åã
<body>
<div> Hello </div>
<div> World! </div>
</body>
<!--
<body>â
â¥<div>â¥Helloâ¥</div>â
â
â¦â¦â¦<div>â¦â¦World!â¦â¦</div>â¦â¦â
</body>
-->
å®ä¼åè¿æ ·æ¸²æï¼
示ä¾ä¸ç空ç½å符å¤çæ¹å¼æ»ç»å¦ä¸ï¼
夿³¨ï¼è¯¥ç®æ³å¯éè¿ white-space-collapse 屿§ï¼æå
¶ç®å屿§ white-spaceï¼è¿è¡é
ç½®ãæä»¬å°é¦å
å设å
¶é»è®¤å¼ï¼white-space-collapse: collapseï¼ï¼ç¶åæ¢è®¨ä¸å屿§å¼å¦ä½å½±åè¯¥ç®æ³ã
-
é¦å ï¼ç©ºç½å符ä¼åä¸ä¸èæç¤ºé£æ ·è¢«æå ï¼å°ä»¥ä¸å 容ï¼
html<body>â â¥<div>â¦â¦Helloâ¦â¦</div>â â â¦â¦â¦<div>â¦â¦World!â¦â¦</div>â¦â¦â </body>转æ¢ä¸ºï¼
html<body>â¦<div>â¦Helloâ¦</div>â¦<div>â¦World!â¦</div>â¦</body>éåï¼è¡å¸å±å°æ ¹æ®
<body>建ç«çåçº§æ ¼å¼åä¸ä¸æè¿è¡æçã卿¤ç¤ºä¾ä¸ï¼<body>çäºä¸ªåèç¹åèªä½ä¸ºç¬ç«è¡è¿è¡å¸å±ãï¼æ¤ä»£ç åä¸çæ¯è¡ä»£è¡¨æ¸²æå¸å±ä¸çç¬ç«è¡ï¼èéåå§ HTML 代ç ä¸çè¡ï¼ï¼html<body> ⦠<div>â¦Helloâ¦</div> ⦠<div>â¦World!â¦</div> ⦠</body>请注æï¼å¦æè¡è¿é¿ï¼æ¯è¡å¯è½ä¼æ¢è¡å¹¶çææ´å¤è¡ãå®é ä¸ï¼æµè§å¨å¨å¸å±è¿ç¨ä¸ä¼ç¡®å®æ¯è¡çå 容ãå ³äºææ¬æ¢è¡æºå¶çå ·ä½åçï¼æä»¬å¨æ¤ä¸ä½èµè¿°ã
-
è¡é¦ç空ç½å符åºåå°è¢«ç§»é¤ï¼å æ¤ç¤ºä¾å为ï¼
html<body> <div>Helloâ¦</div> <div>World!â¦</div> </body> -
æ¤æ¶ä¿ççæ¯ä¸ªå¶è¡¨ç¬¦åæ
tab-sizeè¿è¡æ¸²æãè¿ä» å½white-space-collapse设置为preserveæbreak-spacesæ¶çæï¼å ä¸ºå ¶ä»ææè®¾ç½®é½ä¼å°å¶è¡¨ç¬¦è½¬æ¢ä¸ºç©ºæ ¼ç¬¦ã -
è¡å°¾ç空ç½å符åºåå°è¢«ç§»é¤ï¼å æ¤ä¸æå为ï¼
html<body> <div>Hello</div> <div>World!</div> </body>å½ååå¨çä¸ä¸ªç©ºè¡å¨æç»å¸å±ä¸ä¸ä¼å ç¨ä»»ä½ç©ºé´ï¼å 为å®ä»¬ä¸å å«ä»»ä½å¯è§å 容ãå æ¤é¡µé¢æç»ä» æä¸¤è¡ä¼å æ®ç©ºé´ãæµè§ç½é¡µçç¨æ·ä¼çå°âHelloâåâWorld!âå嫿¾ç¤ºå¨ä¸¤è¡ä¸ï¼è¿å®å ¨ç¬¦å颿ä¸ä¸¤ä¸ª
<div>å ç´ çå¸å±ææãæµè§å¨æ¬è´¨ä¸ä¼å¿½ç¥ HTML 代ç ä¸å å«çææç©ºç½å符ã
ä¸åç white-space-collapse å¼ä¼è·³è¿æ¤ç®æ³çä¸åé¨åï¼
preserveåbreak-spacesï¼è·³è¿æ´ä¸ªç®æ³ï¼é¤äºç¬¬ä¸æ¥ï¼ï¼ä¸åçä»»ä½ç©ºç½å符æå æè½¬æ¢ãpreserve-breaksï¼è·³è¿æ´ä¸ªç®æ³ï¼å æ¤è¡é¦è¡å°¾ç空ç½å符å¾ä»¥ä¿çãpreserve-spacesï¼åºç¨ä¸collapseå¼ç¸åçç®æ³ã
DOM API å¦ä½å¤ç空ç½å符
å¦åæè¿°ï¼DOM ä¼ä¿ç空ç½å符ãè¿æå³çå½ä½ è·å Node.textContent æ¶ï¼å°å¾å° HTML æºä»£ç ä¸åå§ä¹¦åçææ¬å
容ï¼èè·å Node.childNodes æ¶ï¼åä¼è·åææææ¬èç¹ââå
æ¬ä»
å
å«ç©ºç½å符çèç¹ã
å¹¶éææ DOM API é½ä¼ä¿ç空ç½åç¬¦ï¼æäº API 设计ä¸å¤ççæ¯æ¸²æåçææ¬ãä¾å¦ï¼HTMLElement.innerText è¿åçææ¬å®å
¨ä¸æ¸²æææä¸è´ï¼ææç©ºç½å符å被æå å¹¶ä¿®åªãSelection.toString() è¿åçæ¯ç²è´´æ¶çææ¬å½¢å¼ï¼é常æå³ç空ç½å符ä¼è¢«æå ãç¶èå¨ Firefox ä¸ï¼å¦ä¸ææå ä¸è½¬æ¢ç« èæè¿°ï¼è¯¥æµè§å¨ä¼æå æ±åé´ç空ç½å符ï¼ï¼æå åç空ç½åç¬¦å¨ toString() è¿åçå符串åç²è´´ææ¬ä¸åå¾ä»¥ä¿çã
<div id="test">Hello world!</div>
const div = document.getElementById("test");
console.log(div.textContent); // " Hello\n world!\n"
console.log(div.innerText); // "Hello world!"
const selection = document.getSelection();
selection.selectAllChildren(div);
console.log(selection.toString()); // "Hello world!"
è§£å³ç©ºç½å符èç¹å¸¸è§é®é¢
ç±äº CSS å¤çè§åï¼ç©ºç½å符èç¹å¯¹ç½ç«è®¿é®è ä¸å¯è§ï¼ä½å®ä»¬å¯è½å¹²æ°æäºä¾èµ DOM ç²¾ç¡®ç»æçå¸å±å DOM æä½ãä¸é¢æä»¬æ¥ççä¸äºå¸¸è§é®é¢åå ¶è§£å³æ¹æ³ã
è¡å åè¡å åå ç´ ä¹é´ç空ç½å符å¤ç
让æä»¬æ¥çç空ç½èç¹çä¸ä¸ªå¸å±é®é¢ï¼è¡å å ç´ ä¸è¡å åå ç´ ä¹é´ç空ç½åç¬¦ãæ£å¦æä»¬ä¹åå¨è¡å å ç´ ååå ç´ ä¸çå°çï¼å¤§å¤æ°ç©ºç½å符ä¼è¢«å¿½ç¥ï¼ä½ç©ºæ ¼çåéåè¯çå符ä¼ä¿çãè¿äºæç»è¿å ¥å¸å±çé¢å¤ç©ºç½æå©äºåéå¥åä¸çåè¯ã
inline-block å
ç´ ç表ç°åæ´å
·è¶£å³æ§ï¼å
¶å¤é¨è¡ä¸ºç±»ä¼¼è¡å
å
ç´ ï¼å
é¨å表ç°ä¸ºå级å
ç´ ï¼å¸¸ç¨äºå¹¶æå±ç¤ºåä¸è¡å
æ´å¤æç UI ç»ä»¶ï¼å¦å¯¼èªèå项ï¼ãç¸é»å
èå
ç´ æå
èåå
ç´ é´çä»»ä½ç©ºç½å符ï¼é½ä¼å¨å¸å±ä¸çæé´è·ââå¦åææ¬ä¸è¯è¯é´çç©ºæ ¼ãï¼è¿å¸¸ä»¤å¼åè
æå¤ï¼å 为å®ä»¬å±äºå级å
ç´ ï¼èå级å
ç´ é叏䏿¾ç¤ºé¢å¤ç©ºç½å符ãï¼
请çè¿ä¸ªç¤ºä¾ï¼ä¸ä¹åç¸åï¼æä»¬å¨ HTML 代ç 䏿·»å äºæ³¨é以æ¾ç¤ºç©ºç½å符ï¼ï¼
.people-list {
list-style-type: none;
margin: 0;
padding: 0;
}
.people-list li {
display: inline-block;
width: 2em;
height: 2em;
background: #ff0066;
border: 1px solid;
}
<ul class="people-list">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<!--
<ul class="people-list">â
â¦â¦<li></li>â
â
â¦â¦<li></li>â
â
â¦â¦<li></li>â
â
â¦â¦<li></li>â
â
â¦â¦<li></li>â
</ul>
-->
渲æå¦ä¸æç¤ºï¼
ä½ å¯è½ä¸å¸æåä¹é´åå¨é´éãæ ¹æ®å ·ä½ä½¿ç¨åºæ¯ï¼ä¾å¦å¤´ååè¡¨ææ°´å¹³å¯¼èªæé®è¡ï¼ï¼é叏叿å ç´ ç´§å¯æåï¼å¹¶è½èªè¡æ§å¶é´è·ã
Firefox å¼åè å·¥å ·ç HTML æ£æ¥å¨è½é«äº®ææ¬èç¹ï¼å¹¶ç²¾ç¡®æ¾ç¤ºå ç´ å®é å ç¨çåºåã彿çé¢å¤è¾¹è·ææå¤ç©ºç½å符导è´é´éæ¶ï¼æ¤åè½å¯å¸®å©ææ¥é®é¢ã

æä¸äºè§£å³é®é¢çæ¹æ³ï¼
-
使ç¨å¼¹æ§çæ¥å建水平项ç®å表ï¼èéå°è¯
inline-blockæ¹æ¡ãå¼¹æ§çè½èªå¨å¤çé´è·å对é½é®é¢ï¼æ çæ¯æ´ä¼çéæ©ï¼cssul { list-style-type: none; margin: 0; padding: 0; display: flex; } -
è¥éä¾èµ
inline-blockï¼å¯å°å表çfont-size设为0ãæ¤æ¹æ³ä» éç¨äºæªéç¨emåä½å®ä¹åºåå°ºå¯¸çæ åµï¼åemåºäºfont-size计ç®ï¼åºå尺寸æç»ä¹ä¼è¢«è®¾ä¸º0ï¼ã卿¤åºæ¯ä¸éç¨remå使¯æ´ä¼éæ©ï¼cssul { font-size: 0; /* ⦠*/ } li { display: inline-block; width: 2rem; height: 2rem; /* ⦠*/ } -
æè ï¼ä½ å¯ä»¥å¨å表项ä¸è®¾ç½®è´å¤è¾¹è·ï¼
cssli { display: inline-block; width: 2rem; height: 2rem; margin-right: -0.25rem; } -
ä½ ä¹å¯ä»¥éè¿é¿å å¨
<li>项ä¸ä½¿ç¨ç©ºç½å符æ¥è§£å³é®é¢ï¼html<li> ... </li><li> ... </li>
å¨ DOM ä¸ä½¿ç¨ç©ºç½å符
å¦åæè¿°ï¼å¨æ¸²ææ¶ç©ºç½å符ä¼è¢«æå åä¿®åªï¼ä½å¨ DOM ä¸å¾ä»¥ä¿çãè¿å¨ä½¿ç¨ JavaScript è¿è¡ DOM æä½æ¶å¯è½å¸¦æ¥ä¸äºé·é±ãä¾å¦ï¼å½ä½ ææç¶èç¹å¼ç¨å¹¶è¯å¾éè¿ Node.firstChild æä½å
¶é¦ä¸ªåå
ç´ æ¶ï¼è¥ç¶èç¹èµ·å§æ ç¾ååå¨å¼å¸¸ç©ºç½å符èç¹ï¼å°å¯¼è´éè¯¯ç»æââææ¬èç¹ä¼è¢«éä¸èéç®æ å
ç´ ã
å¦ä¸ä¸ªä¾åæ¯ï¼è¥éæ ¹æ®å
ç´ æ¯å¦ä¸ºç©ºï¼æ åèç¹ï¼å¯¹åéè¿è¡æä½ï¼å¯ä½¿ç¨ Node.hasChildNodes() æ¹æ³ãä½è¥ç®æ å
ç´ ä¸å卿æ¬èç¹ï¼åå¯è½å¯¼è´éè¯¯ç»æã
ä»¥ä¸ JavaScript 代ç å±ç¤ºäºè¥å¹²ä¾¿äºå¤ç DOM ä¸ç©ºç½å符ç彿°ï¼
/**
* 以䏿è°çâ空ç½å符â代表ï¼
* "\t" TAB \u0009ï¼å¶è¡¨ç¬¦ï¼
* "\n" LF \u000Aï¼æ¢è¡ç¬¦ï¼
* "\r" CR \u000Dï¼å车符ï¼
* " " SPC \u0020ï¼çæ£çç©ºæ ¼ç¬¦ï¼
*
* ä¸ä½¿ç¨ JavaScript çâ\sâï¼å 为å®å
å«éæè¡ç©ºç½å符çå
¶ä»å符ã
*/
/**
* å³å®æèç¹çææ¬å
容æ¯å¦å
¨ä¸ºç©ºç½å符ã
*
* @param nod å®ç°äº `CharacterData` æ¥å£çèç¹ï¼å³ `Text`ã`Comment` æ `CDATASection` èç¹ï¼ã
* @return è¥ `nod` çææ¬å
容å
¨ä¸ºç©ºç½å符åè¿å `true`ï¼å¦åè¿å `false`ã
*/
function isAllWs(nod) {
return !/[^\t\n\r ]/.test(nod.textContent);
}
/**
* å³å®æ¯å¦åºå¨éåæ¶ç¥è¿æèç¹ã
*
* @param nod å®ç°äº `Node` æ¥å£ç对象
* @return 妿èç¹ç¬¦å以䏿¡ä»¶ï¼åè¿å `true`ï¼
* 1. å
¨é¨ä¸ºç©ºç½å符ç `Text` èç¹
* 2. 为 `Comment` èç¹
* å¦åè¿å `false`ã
*/
function isIgnorable(nod) {
return (
nod.nodeType === 8 || // 注éèç¹
(nod.nodeType === 3 && is_all_ws(nod))
); // ææåç¬¦é½æ¯ç©ºç½åç¬¦çææ¬èç¹
}
/**
* è·³è¿å®å
¨ç±ç©ºç½åç¬¦ææ³¨éç»æçèç¹ç `previousSibling` çæ¬ã
*ï¼é常 `previousSibling` æ¯ææ DOM èç¹ç屿§ï¼ç¨äºè¿åç´§é»å¨å¼ç¨èç¹ä¹åçå
å¼èç¹ââå³åç¶åèç¹ä¸ä½äºå
¶åé¢çåèç¹ãï¼
*
* @param sib èç¹å¼ç¨ã
* @return æ ¹æ® `isIgnorable` 夿ï¼`sib` æè¿çåä¸ä¸ªéå¯å¿½ç¥å
å¼èç¹ï¼è¥ä¸å卿¤ç±»èç¹ï¼åè¿å `null`ã
*/
function nodeBefore(sib) {
while ((sib = sib.previousSibling)) {
if (!isIgnorable(sib)) {
return sib;
}
}
return null;
}
/**
* æ¤ä¸ºä¼è·³è¿ç©ºç½å符èç¹å注éèç¹ç `nextSibling` 彿°
*
* @param sib èç¹å¼ç¨ã
* @return æ ¹æ® `isIgnorable` 夿ï¼`sib` æè¿çä¸ä¸ä¸ªéå¯å¿½ç¥å
å¼èç¹ï¼è¥ä¸å卿¤ç±»èç¹ï¼åè¿å `null`ã
*/
function nodeAfter(sib) {
while ((sib = sib.nextSibling)) {
if (!isIgnorable(sib)) {
return sib;
}
}
return null;
}
/**
* è·³è¿å®å
¨ç±ç©ºç½åç¬¦ææ³¨éç»æçèç¹ç `lastChild` çæ¬ã
*ï¼é常 `lastChild` æ¯ææ DOM èç¹ç屿§ï¼ç¨äºè·åå¼ç¨èç¹ç´æ¥å
å«çæåä¸ä¸ªåèç¹ãï¼
*
* @param par èç¹å¼ç¨ã
* @return æ ¹æ® `isIgnoreable` 夿ï¼`sib` çæåä¸ä¸ªåèç¹ï¼è¥ä¸å卿¤ç±»èç¹ï¼åè¿å `null`ã
*/
function lastChild(par) {
let res = par.lastChild;
while (res) {
if (!isIgnorable(res)) {
return res;
}
res = res.previousSibling;
}
return null;
}
/**
* æ¤ä¸ºä¼è·³è¿ç©ºç½å符èç¹å注éèç¹ç `firstChild` 彿°
*
* @param par èç¹å¼ç¨ã
* @return æ ¹æ® `isIgnoreable` 夿ï¼`sib` ç第ä¸ä¸ªåèç¹ï¼è¥ä¸å卿¤ç±»èç¹ï¼åè¿å `null`ã
*/
function firstChild(par) {
let res = par.firstChild;
while (res) {
if (!isIgnorable(res)) {
return res;
}
res = res.nextSibling;
}
return null;
}
/**
* å»é¤äºå¼å¤´åç»å°¾ç空ç½å符ï¼å¹¶å°ææç©ºç½å符è§èå为å个空ç½å符ç `data` çæ¬ã
*ï¼é常ï¼`data` æ¯ææ¬èç¹ç屿§ï¼ç¨äºæä¾è¯¥èç¹çææ¬å
容ãï¼
*
* @param txt 欲è¿åå
¶ä¸æ°æ®çææ¬èç¹
* @return ææ¬èç¹çå
容ï¼å
¶ä¸ç©ºç½åç¬¦å·²ç»æå ã
*/
function dataOf(txt) {
let data = txt.textContent;
data = data.replace(/[\t\n\r ]+/g, " ");
if (data[0] === " ") {
data = data.substring(1, data.length);
}
if (data[data.length - 1] === " ") {
data = data.substring(0, data.length - 1);
}
return data;
}
ä¸é¢çä»£ç æ¼ç¤ºäºä¸é¢è¿äºå·¥å
·å½æ°çä½¿ç¨æ¹æ³ãå
·ä½æä½æ¯ï¼éåä¸ä¸ªåèç¹å
¨é¨ä¸ºå
ç´ èç¹çå
ç´ ï¼æ¾å°æå
å«ç第ä¸ä¸ªèç¹ä¸ºä¸ä¸ªææ¬å
容为 "è¿æ¯ç¬¬ä¸èªç¶æ®µ" çææ¬èç¹çé£ä¸ªåå
ç´ ï¼å¹¶ä¿®æ¹è¯¥åå
ç´ ç class 屿§åå
¶ç¬¬ä¸ä¸ªææ¬èç¹çæåå
容ã
let cur = firstChild(document.getElementById("test"));
while (cur) {
if (dataOf(cur.firstChild) === "è¿æ¯ç¬¬ä¸èªç¶æ®µ") {
cur.className = "magic";
cur.firstChild.textContent = "è¿æ¯ä¿®æ¹åçèªç¶æ®µ";
}
cur = nodeAfter(cur);
}