AbstractRange
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2021å¹´4æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
AbstractRange ã¯æ½è±¡ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ããã¹ã¦ã® DOM ã®ç¯å²åãå®ç¾©ããããã®åºæ¬ã¯ã©ã¹ã§ãã range ã¯ãææ¸å
ã®ã³ã³ãã³ãã®åºéã®éå§ç¹ã¨çµäºç¹ã示ããªãã¸ã§ã¯ãã§ãã
ã¡ã¢:
æ½è±¡ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ããããã AbstractRange åã®ãªãã¸ã§ã¯ããç´æ¥ã¤ã³ã¹ã¿ã³ã¹åãããã¨ã¯ããã¾ããã代ããã« Range ã¾ã㯠StaticRange ã¤ã³ã¿ã¼ãã§ã¤ã¹ã使ç¨ãã¦ãã ãããããã 2 ã¤ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ç°ãªãç¹ãçè§£ããèªåã®ãã¼ãºã«åã£ããã®ãé¸ã¶ã«ã¯ãããããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ããã¥ã¡ã³ããåç
§ãã¦ãã ããã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
collapsedèªåå°ç¨-
è«çå¤ã§ãç¯å²ãæãããã¾ãã¦ããå ´åã¯
trueã¨ãªãã¾ããæãããã¾ããç¯å²ã¨ã¯ãéå§ä½ç½®ã¨æ«å°¾ä½ç½®ãåãã§ã 0 æåã®é·ãã®ç¯å²ã§ãã endContainerèªåå°ç¨-
endOffsetããããã£ã§æå®ãããç¯å²ã®æ«å°¾ãããå ´æã®Nodeãªãã¸ã§ã¯ãã§ãã endOffsetèªåå°ç¨-
æ´æ°å¤ã§ããã¼ãã®ã³ã³ãã³ãã®å é ããããã®ç¯å²ãªãã¸ã§ã¯ãã表ãç¯å²ã®æ«å°¾ã®æåã¾ã§ã®ãªãã»ãããæååä½ã§ç¤ºãã¾ãããã®å¤ã¯
endContainerãã¼ãã®é·ãããå°ãããªããã°ãªãã¾ããã startContainerèªåå°ç¨-
startOffsetããããã£ã§æå®ãããç¯å²ã®å é ãããå ´æã®Nodeãªãã¸ã§ã¯ãã§ãã startOffsetèªåå°ç¨-
æ´æ°å¤ã§ããã¼ãã®ã³ã³ãã³ãã®å é ããããã®ç¯å²ãªãã¸ã§ã¯ããåç §ããå 容ã®å é ã®æåã¾ã§ã®ãªãã»ãããæååä½ã§ç¤ºãã¾ãããã®å¤ã¯ã
startContainerã§ç¤ºããããã¼ãã®é·ãããå°ãããªããã°ãªãã¾ããã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
AbstractRange ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ã¡ã½ãããæä¾ãã¦ãã¾ããã
使ç¨ä¸ã®æ³¨æ
>Range å
ææ¸å
ã®ã³ã³ãã³ãã®ç¯å²ã¯ããã¹ã¦ AbstractRange ã«åºã¥ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã使ç¨ãã¦è¨è¿°ãã¾ãããã®ãããªã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ 2 ã¤ããã¾ãã
Range-
Rangeã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯é·ãéåå¨ãã¦ãã¾ããããä»ã«ãç¯å²ãã¼ã¿ãå®ç¾©ããå¿ è¦æ§ãçãããããæè¿ã«ãªã£ã¦AbstractRangeããã¼ã¹ã«åå®ç¾©ããã¾ãããRangeã¯ç¯å²ã®ç«¯ç¹ã夿´ããã¡ã½ããããç¯å²ãæ¯è¼ããã¡ã½ãããç¯å²éã®äº¤å·®ãæ¤åºããã¡ã½ãããªã©ãæä¾ãã¾ãã StaticRange-
StaticRangeã¯ä¸åº¦ä½æããç¯å²ã夿´ãããã¨ãã§ããªãåºæ¬çãªç¯å²ã§ããã¤ã¾ãããã¼ãããªã¼ãå¤åãã¦ãç¯å²ã¯å¤æ´ããã¾ãããããè¤éãªRangeã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ããã©ã¼ãã³ã¹ããªã½ã¼ã¹ã¸ã®å½±é¿ãé¿ãããã¨ãã§ããã®ã§ãä¸åº¦ã ã使ç¨ããç¯å²ãæå®ããå¿ è¦ãããå ´åã«æçã§ãã
è¦ç´ ã®å 容
è¦ç´ ã®å 容ã«ã¢ã¯ã»ã¹ããå ´åãè¦ç´ èªä½ããã¼ãã§ãããè¦ç´ å ã®ããã¹ãããã¼ãã§ãããã¨ã«æ³¨æãã¦ãã ãããè¦ç´ ã®ããã¹ãå ã«ç¯å²ç«¯ç¹ãè¨å®ããã«ã¯ãå¿ ãè¦ç´ å ã®ããã¹ããã¼ããæ¢ãã¦ãã ããã
const startElem = document.querySelector("p");
const endElem = startElem.querySelector("span");
const range = document.createRange();
range.setStart(startElem, 0);
range.setEnd(endElem, endElem.childNodes[0].length / 2);
const contents = range.cloneContents();
document.body.appendChild(contents);
ãã®ä¾ã§ã¯ãæ°ããç¯å² range ã使ãããã®å
é ãæåã®è¦ç´ ã® 3 ã¤ç®ã®åãã¼ãã«è¨å®ãã¾ããçµç¹ã¯ span ã®æåã®åã®ä¸å¤®ã«è¨å®ãããã®å¾ãç¯å²ã®ã³ã³ãã³ããã³ãã¼ããããã«ä½¿ç¨ãã¦ãã¾ãã
ç¯å²ã¨ DOM ã®é層æ§é
ææ¸å ã®æåã®ç¯å²ãå®ç¾©ããéã«ã 0 å以ä¸ã®ãã¼ãå¢çãã¾ãããã¨ãå¯è½ã§ã DOM ã®å¤åã«ã§ããã ãå¼·ãæ¹æ³ã§å®ç¾©ããããã«ã HTML å ã®æåã®æåã¨æå¾ã®æåã®ãªãã»ãããæå®ãããã¨ã¯ã§ãã¾ãããããã«ã¯ããã¤ãçç±ãããã¾ãã
æåã«ããã¼ã¸ãèªã¿è¾¼ã¾ããå¾ããã©ã¦ã¶ã¼ã¯ HTML ã®è¦³ç¹ã§èãã¦ãã¾ãããèªã¿è¾¼ã¾ããå¾ã®ãã¼ã¸ã¯ DOM ã® Node ãªãã¸ã§ã¯ãã®ããªã¼ãªã®ã§ãç¯å²ã®å
é ã¨ãæ«å°¾ã®ä½ç½®ããã¼ãã¨ãã¼ãå
ã®ä½ç½®ã§æå®ããå¿
è¦ãããã¾ãã
2 ã¤ç®ã«ã DOM ããªã¼ã®å¤æ´å¯è½æ§ã«å¯è½ãªéã対å¿ããããã«ãææ¸å ¨ä½ã®ä¸ã§ã®ã°ãã¼ãã«ãªä½ç½®ã§ã¯ãªããããªã¼å ã®ãã¼ãã¨ã®ç¸å¯¾çãªä½ç½®ãè¡¨ãæ¹æ³ãå¿ è¦ã§ããææ¸å ã®ç¹ãæå®ããããã¼ãå ã®ãªãã»ããã¨ãã¦å®ç¾©ããã°ã DOM ããªã¼å ã§ãã¼ãã追å ããããé¤å»ããããç§»åããããã¦ãããã®ä½ç½®ã¯ã³ã³ãã³ãã¨çç¾ãã¾ãããããªãæç½ãªå¶éãããã¾ããï¼ãã¼ããç¯å²ã®çµç¹ã®å¾ã«ç§»åãããå ´åãããã¼ãã®ã³ã³ãã³ãã大ãã夿´ãããå ´åãªã©ï¼ãä½ãããªãããã¯ã¯ããã«ã¾ãã§ãã
3 ã¤ç®ã«ããã¼ãç¸å¯¾ä½ç½®ã使ç¨ãã¦éå§ä½ç½®ã¨çµäºä½ç½®ãå®ç¾©ããã¨ãä¸è¬çã«ããã©ã¼ãã³ã¹ãåä¸ãããããªãã¾ããã°ãã¼ãã«ãªãã»ãããä½ãåç §ãã¦ããã®ã DOM ã¨äº¤æ¸ããå¿ è¦ããªããã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãï¼ãã©ã¦ã¶ã¼ï¼ã¯éå§ä½ç½®ã§ç¤ºããããã¼ãã«ç´æ¥ç§»åãã¦ããããéå§ããæå®ããããªãã»ããã«éããã¾ã§çµäºãã¼ãã«é²ããã¨ãã§ãã¾ãã
ããã示ãããã«ãä¸è¨ã® HTML ãèãã¦ã¿ã¾ãããã
<div class="container">
<div class="header">
<img src="..." alt="" class="sitelogo" />
<h1>The Ultimate Website</h1>
</div>
<article>
<section class="entry" id="entry1">
<h2>Section 1: An interesting thingâ¦</h2>
<p>A <em>very</em> interesting thing happened on the way to the forumâ¦</p>
<aside class="callout">
<h2>Aside</h2>
<p>An interesting aside to share with youâ¦</p>
</aside>
</section>
</article>
<pre id="log"></pre>
</div>
HTML ãèªã¿è¾¼ãã§ææ¸ã® DOM 表ç¾ãæ§ç¯ããã¨ãçµæã® DOM ããªã¼ã¯æ¬¡ã®ããã«ãªãã¾ãã
ãã®å³ã§ã¯ã HTML è¦ç´ ã表ããã¼ããç·è²ã§è¡¨ç¤ºãã¦ãã¾ãããã®ä¸ã®åè¡ã¯ã DOM ããªã¼ã®æ¬¡ã®é層ã表示ããã¾ããéããã¼ãã¯ããã¹ããã¼ãã§ãç»é¢ã«è¡¨ç¤ºãããããã¹ããæ ¼ç´ãã¾ããåè¦ç´ ã®ã³ã³ãã³ãã¯ããªã¼ã®ä¸è¨ã§ãªã³ã¯ããã¦ãããè¦ç´ ãä»ã®è¦ç´ ãããã¹ããã¼ããå«ããããã«ããã®ä¸ã«ä¸é£ã®åå²ãçãå¯è½æ§ãããã¾ãã
ãã <p> è¦ç´ ã®ã³ã³ãã³ãã "A <em>very</em> interesting thing happened on the way to the forumâ¦" ã§ããç¯å²ã使ãããå ´åã¯ã次ã®ããã«ãã¾ãã
const pRange = document.createRange();
pRange.selectNodeContents(document.querySelector("#entry1 p"));
<p> è¦ç´ ã®åå«ãå«ããããã«ããã®ã³ã³ãã³ãå
¨ä½ã鏿ãããã®ã§ãããã¯ãã¾ãåä½ãã¾ãã
代ããã« <section> ã®è¦åºãï¼h2 è¦ç´ ï¼ãã <em> ã® "ve "ã®çµãããéãããã®ä¸ã®æ®µè½ã« "An interesting thingâ¦" ã¨ããããã¹ããã³ãã¼ãããå ´åã以ä¸ã®ã³ã¼ãã§åä½ãã¾ãã
const range = document.createRange();
const startNode = document.querySelector("section h2").childNodes[0];
range.setStart(startNode, 11);
const endNode = document.querySelector("#entry1 p em").childNodes[0];
range.setEnd(endNode, 2);
const fragment = range.cloneContents();
ããã§è峿·±ãåé¡ãçºçãã¾ããDOMé層ã®ç°ãªãã¬ãã«ã«ããè¤æ°ã®ãã¼ãããã³ã³ãã³ãããã£ããã£ãããã®ãã¡ã®ä¸é¨ã ãããã£ããã£ãã¦ããã®ã§ããçµæã¯ã©ã®ããã«è¦ã¦ããã°ããã®ã§ããããï¼
幸ããªãã¨ã«ã DOM 仿§ã¯ãã®èª²é¡ã«ç確ã«å¯¾å¿ãã¦ãã¾ããä¾ãã°ããã®ä¾ã§ã¯ cloneContents() ãç¯å²ã«å¼ã³åºãã¦ãæå®ããç¯å²ã®ã³ã³ãã³ããè¤è£½ãã DOM ãµãããªã¼ãæä¾ããæ°ãã DocumentFragment ãªãã¸ã§ã¯ãã使ãã¦ãã¾ãããããè¡ãããã«ãcloneContents() ã¯ç¤ºãç¯å²ã®æ§é ãä¿æããããã«å¿
è¦ãªãã¹ã¦ã®ãã¼ããæ§ç¯ãã¾ãããå¿
è¦ä»¥ä¸ã®ãã¼ãã¯æ§ç¯ãã¾ããã
ãã®ä¾ã§ã¯ãæå®ããç¯å²ã®å
é ã¯ç¯ã®è¦åºãã®ä¸ã®ããã¹ããã¼ãå
ã«å¾ããã¾ããã¤ã¾ããæ°ãã DocumentFragment 㯠h2 ãæã¡ããã®ä¸ã«ããã¹ããã¼ããæ ¼ç´ããå¿
è¦ãããã¾ãã
ç¯å²ã®çµãã㯠<p> è¦ç´ ã®ä¸è¨ãªã®ã§ãæ°ãããã©ã°ã¡ã³ãå
ã§å¿
è¦ã«ãªãã¾ãã "A" ã¨ããåèªãæ ¼ç´ããããã¹ããã¼ããç¯å²ã«å«ããããã«å¿
è¦ã§ããæå¾ã«ã <em> ã¨ãã®ä¸ã®ããã¹ããã¼ãããåæ§ã« <p> ã®ä¸ã«è¿½å ããã¾ãã
ããã¹ããã¼ãã®å
容㯠setStart() 㨠setEnd() ãå¼ã³åºãã¨ãã«æå®ãããããã¹ããã¼ãã¸ã®ãªãã»ããã«ãã£ã¦æ±ºã¾ãã¾ããè¦åºãã®ããã¹ãã« 11 ã®ãªãã»ãããæå®ãããå ´åããã®ãã¼ã㯠"An interesting thingâ¦" ãæ ¼ç´ãã¾ããåæ§ã«ãçµãããã¼ãã®æåã®2æåã®ãªã¯ã¨ã¹ããæå®ãããå ´åãæå¾ã®ããã¹ããã¼ãã«ã¯ "ve" ãæ ¼ç´ããã¾ãã
ã§ãããã£ãææ¸ãã©ã°ã¡ã³ãã¯æ¬¡ã®ããã«ãªãã¾ãã
ãã®ãã©ã°ã¡ã³ãã®å
容ã¯ãã¹ã¦ããã®ä¸ã®æä¸ä½ãã¼ãã®å
±æãããå
±éã®è¦ªã®ä¸ã«ãããã¨ã«ç¹ã«æ³¨æãã¦ãã ããã親ã§ãã <section> ã¯è¤è£½ãããå
容ãè¤è£½ããããã«å¿
è¦ã§ã¯ãªãã®ã§ãå«ã¾ãã¦ãã¾ããã
ä¾
ãã®åç´ãª HTML ã®æçãèãã¦ã¿ã¾ãããã
<p><strong>This</strong> is a paragraph.</p>
Range ã使ç¨ãã¦ããããã "paragraph" ã¨ããåèªãæ½åºãããã¨ãæ³åãã¦ã¿ã¦ãã ããããã®ããã®ã³ã¼ãã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
const paraNode = document.querySelector("p");
const paraTextNode = paraNode.childNodes[1];
const range = document.createRange();
range.setStart(paraTextNode, 6);
range.setEnd(paraTextNode, paraTextNode.length - 1);
const fragment = range.cloneContents();
document.body.appendChild(fragment);
æåã«ã段è½ãã¼ãèªä½ã¸ã®åç
§ã¨ã段è½å
ã® 2 çªç®ã®åãã¼ãã¸ã®åç
§ãåå¾ãã¾ããæåã®å㯠<strong> è¦ç´ ã§ãã 2 ã¤ç®ã®åã¯ããã¹ããã¼ã " is a paragraph." ã§ãã
ããã¹ããã¼ãã®åç
§ãæã«å
¥ãããã Document èªä½ã«å¯¾ã㦠createRange() ãå¼ã³åºãã¦æ°ãã Range ãªãã¸ã§ã¯ãã使ãã¾ããç¯å²ã®å§ããä½ç½®ã«ã¯ããã¹ããã¼ãã®æååã® 6 æåç®ãè¨å®ããçµããã®ä½ç½®ã«ã¯ããã¹ããã¼ãã®æååã®é·ããã 1 ãå¼ããå¤ãè¨å®ãã¾ããããã«ããã "paragraph" ã¨ããåèªãå«ãç¯å²ãè¨å®ããã¾ãã
ããã¦ã Range ã«å¯¾ã㦠cloneContents() ãå¼ã³åºãã¦ãç¯å²ã«å«ã¾ããææ¸é¨åãæ ¼ç´ããæ°ãã DocumentFragment ãªãã¸ã§ã¯ãã使ãã¦å®äºã§ãããã®å¾ã appendChild() ã使ç¨ãã¦ã document.body ããåå¾ããææ¸æ¬ä½ã®æå¾ã«ãã®ãã©ã°ã¡ã³ãã追å ãã¾ãã
çµæã¯ãã®ããã«ãªãã¾ãã
仿§æ¸
| 仿§æ¸ |
|---|
| DOM > # interface-abstractrange > |