기존 선택을 가져오고 전체 또는 부분적으로 선택하고 취소하고, 문서에서 선택한 부분을 제거하고 태그로 래핑 하는 등의 작업을 수행할 수 있습니다.
선택의 기본 개념 Range: 기본적으로 한 쌍의 경계지점이며 범위 시작 및 범위 끝입니다.
각 포인트는 시작부터 상대적 오프셋이 있는 상위 DOM 노드로 표시됩니다.
부모노드가 요소 노드이면 오프셋은 자식 번호,
텍스트 노드의 겨우 텍스트에서 위치합니다.
Range 속성
Range.collpasedRange.commonAncestorContainerRange.endContainerRange.endOffsetRange.startContainerRangestartOffsetRange를 생성합니다.
let range = new Range();
사용할 선택경계를 설정 할 수 있습니다.
range.setStart(node, offset) 및 range.setEnd(node, offset)
아래의 코드로 예시를 알아보겠습니다.
<div id="rangeTest">
Example: <i>Italic<i> and <b>bold></b>
</div>
부모노드가 요소노드이기 때문에
Example: : 0
<i>Italic</i>: 1
and : 2
<b>bold</b> : 3
로 자식번호가 구성 됩니다.
아래의 이미지 처럼
range.setStart(rangeTest,0) 범위 시작을 설정하고,
range.setEnd(rangeTest,2) 범위 끝을 설정합니다.
*setEnd는 끝이 포함되지 않는 특징이 있습니다.
아래의 이미지로 결과를 확인 할 수 있습니다.

이번에는 클릭하여 직접 입력한 범위 만큼 Range 를 선택해 보겠습니다.

위의 코드에서 <input type="number"> 를 통해 범위 설정을 해주고 이벤트를 주기위해 <button> 태그를 추가하 였습니다. range.setStart(rangeTest, start.value) 를 보시면 시작 범위 값을 넣어주고, range.setEnd(rangeTest, end.value) 에서 범위의 끝을 설정해주고 기존 선택 된 Range를 지우기 위해 removeAllRange() 로 초기화를 해주고 다시 Range를 추가 해주는것을 확인 할 수 있습니다.
텍스트 노드를 부분적으로 선택도 가능합니다.
위의 코드에서 range.setStart(rangeTest.firstChild, 2) 는 rangeTest의 첫번째 자식요소에서 2로 설정 되어져 있습니다. 그러므로 Example: 에서 a 부터 시작 offset 입니다. range.setEnd(rangeTest.querySelector('b').firstChild, 3) 은 rangeTest에서 b 태그를 선택해 첫번째 자식의 끝 offset은 3으로 설정 되어 있습니다.
<b> 자식 노드 첫번째는 bold 이고 offset이 3이어서 bol 까지 Range가 추가 되는것을 확인할 수 있습니다.
선택을 추적 하는 이벤트를 알아 보겠습니다.
elem.onselectstart 는 선택이 시작될 때 이벤트 발생하고
elem.onselectionchange 는 선택이 변경될 때마다 이벤트 발생합니다.
*이 핸들러는 document에서만 설정할 수 있습니다.
Selction
Selection 의 속성
Selection.anchorNodeSelection.anchorOffsetSelection.focusNodeSelection.focusOffsetSelection.isCollapsedSelection.rangeCount
위 코드에서는 onselectionchange 메소드를 사용하여 선택시 from 의 value를 anchorNode 가 있을 경우에 data를 가져와 주고 anchorOffset 을 설정한걸 볼수 있습니다. 마찬가지로 to 의 value도 같습니다.
이미지에서 드래그 된 텍스트와 input 에 각각의 결과를 확인할 수 있습니다.
input 및 textarea 같은 폼 요소에서 selection 하는 경우를 알아보겠습니다.
속성
input.selectionStartinput.selectionEndinput.selectionDirection이벤트
input.onselect행동양식
input.select()input.setSelectionRange(start, end, [direction])input.setRangeText(replacement, [start], [end], [selectionModel])select : 새로 삽입 된 텍스트가 선택 됩니다.start : 선택 범위는 삽입 된 텍스트 바로 전에 축소 됩니다.end : 선택 범위는 삽입 된 텍스트 바로 뒤에 축소 됩니다.preserve : 선택을 보존합니다. 기본값선택 내용을 수정하려면 input.setRangeText() 메소드를 사용하면 됩니다.

위의 코드에서 area 의 시작과끝이 같을 경우에는 return 을 해주고 선택 했을 경우 selectionStart 와 selectionEnd 를 사용하여 선택범위 값을 변수에 할당 합니다. 그후 setRangeText() 를 사용하여 텍스트를 수정해 줍니다.