Selection

September 15, 2015

Selection

  • 정의
    • Selection 은 마우스 또는 키보드를 통해, 컨텐츠를 선택, 또는 선택된 영역을 제어 하기위한 모든 특성들을 제공한다.

관련 용어

  • 정의

    • Selection 에 대해 공부할때, 가장 큰 장애물이 되는것은, 각 용어에 대한 이해도라 생각한다. 즉 용어에 대한 정확한 이해없이는, 제공되는 API 기능에 대해 이해하기 힘든 부분이 존재하기 때문이다.
  • 용어 설명

    • Selection / Selection object: 사용자가 마우스(드래그) 또는 키보드(키 조작)를 통해, 선택된 텍스트범위를 말한다.

    • anchor: 선택된 범위가 시작되는 지점을 말한다.

    • focus: 선택된 범위가 끝나는 지점을 말한다.

    • range: 선택된 범위의 문서 조각들을 말한다.

특성

  • Properties

    이와같은 HTML 코드가 있다고 가정하고, 아래 나열된 속성들을 살펴보기로한다.

    <!-- container 객체 -->
    <div id="text-container" contenteditable="true">
    	<span style="height: 20px">HELLO</span>
    	<span style="height: 20px;padding-left: 5px;">WORLD</span>
    	<span style="height: 20px;padding-left: 5px;">TEST</span>
    	<span style="height: 20px;padding-left: 5px;">!!!!</span>
    </div>
    • selection.anchorNode:

      선택된 범위가 시작되는 지점의 노드를 반환한다.

    • selection.anchorOffset:

      anchorNode 범위내에 anchor(선택된 범위가 시작되는 지점) 이전의 문자열(HE(2개))의 갯수를 반환한다.

    • selection.focusNode:

      선택된 범위가 끝나는 지점의 노드를 반환한다.

    • selection.focusOffset:

      • focusNode 범위내에 focus(선택된 범위가 끝나는 지점)의 문자열(WORLD(5개)) 갯수를 반환한다.

    • anchorOffsetfocusOffset 이 좀 이해하기 힘들더라도(개인적일수도 있지만;;;) 그만큼 중요한 부분이니, 반드시 이해하고 넘어가길 바란다.

    • selection.isCollapsed:

      • 선택된 범위가 시작되는 지점(anchorOffset)과, 끝나는 지점(focusOffset)이 동일한지 여부를 반환한다.

      • 만약 첫 번째 문자와 두 번째 문자 사이를 클릭(드래그가 아닌)한 경우, anchorOffsetfocusOffset 은 각각 1을 반환하게 된다.

        • 선택이 시작된 지점 이전의 문자열(H) 갯수(anchorOffset): 1
        • 선택이 끝난 지점의 문자열(H) 갯수(focusOffset): 1

    • selection.rangeCount:

      • 선택된 범위의 range 크기를 반환한다.

      • 페이지 로드 후 사용자가 문서를 클릭하지 않았을경우, rangeCount0을, 클릭한 후에는 1을 반환하게 된다.

      • 사용자는 일반적으로 한번에 하나의 range 를 선택할 수 있다.

      • Gecko 브라우저에서는 Multiple range 를 선택할 수 있다.(Ctrl or Command 키를 통해)

  • Methods

    • selection.getRangeAt(range index):

      • 선택된 하나의 range object 를 반환한다.
    • selection.collapse(parentNode, offset):

      • anchorNode 를 전달된 offset 으로 지정한다.
    • selection.extend(parentNode, offset):

      • focusNode 를 전달된 offset 으로 지정한다.

    • anchorNode 와 focusNode 를 각각의 메서드를 통해 새로 지정하면, 새로운 선택 범위를 만들어낼수 있다.

      
      selection.collapse(container, 0);
      selection.extend(container, 0);
      
      console.log(selection.anchorNode); // HELLO
      console.log(selection.focusNode); // HELLO
      
      selection.collapse(container, 1);
      selection.extend(container, 3);
      
      console.log(selection.anchorNode); // WORLD
      console.log(selection.focusNode); // TEST
      
      selection.collapse(container, 4);
      selection.extend(container, 4);
      
      console.log(selection.anchorNode); // !!!!
      console.log(selection.focusNode); // !!!!
    • selection.collapseToStart():

      • 선택된 범위가 시작되는 지점으로 커서를 이동시킨다.
    • selection.collapseToEnd():

      • 선택된 범위가 끝나는 지점으로 커서를 이동시킨다.
    • selection.selectAllChildren(parentNode):

      • 이전에 선택된 범위를 취소(삭제)한 후, 전달된 parentNode 의 모든 자식 노드들을 선택 한다.
    • selection.addRange(range):

      • 새로운 range(선택 범위의 문서 조각) 를 추가한다.

        
        var container = document.getElementById("text-container");
        
        // container 의 모든 자식 노드들에 대한 range object 를 생성 후 addRange 메서드를 통해, 선택 범위에 추가시킨다.
        for (var i = 1; i < container.childNodes.length; i++){
        
        	var childNode = container.childNodes[i];
        	var range = document.createRange();
        
        	range.selectNode(childNode);
        
        	// 새로운 range(선택 범위의 문서 조각) 를 추가한다.
        	selection.addRange(range);
        }

    • selection.removeAllRanges():

      • 모든 range(선택된 범위의 문서 조각)를 삭제한다.
    • selection.deleteFromDocument():

      • 선택된 범위의 모든 text 를 삭제한다.
    • selection.toString():

      • 선택된 범위의 모든 컨텐츠를 반환한다.
    • selection.containsNode(aNode, aPartlyContained):

      • 전달된 노드(aNode)가 선택된 범위안에 있는지 여부를 반환한다.

      위 그림에서와 같이 helloNode선택된 범위에 포함되지 않기때문에, false반환하게 되며, worldNode 는 그 반대인 true반환하게 된다.

      
      var container = document.getElementById("text-container");
      
      // hello 문자열 노드
      var helloNode = container.getElementsByTagName('span')[0];
      // world 문자열 노드
      var worldNode = container.getElementsByTagName('span')[1];
      
      console.log(selection.containsNode(helloNode, true)); // false
      console.log(selection.containsNode(worldNode, true)); // true

API 테스트

아래 코드는 Chrome 브라우저에서만 테스트되었습니다.(소스 참조시 반드시 다른 브라우저에서도 테스트 하시기 바랍니다)


Profile picture

Written by mohwa