2012-12-18 3 views
0

중첩 된 노드가있는 편집 가능한 div 내부에서 캐럿의 선택 색인을 찾으려고합니다.중첩 노드 자바 스크립트의 캐럿 색인

<div contenteditable="true">1234<span>5678|9</span></div> //Returns 4 

내가 사업부의 모든 문자의 인덱스를 원하므로 위의 예는 반환해야 8

이 내가 사용하고 무엇인가 : |

예 (커서입니다) 그 순간.

var sel = window.getSelection(); 
    return sel.anchorOffset; 

내가 commonAncestor 및 기타 선택 & 다양한 방법을 사용하여 시도,하지만이를 찾는 방법을 확실입니다.

+0

사용 getRangeAt() –

+0

getRangeAt()이 조각 [- - 자바 스크립트 Snipplr 사회 발췌문 저장소 가져 오기/html로 텍스트 영역에서 커서 설정]을 시도 – gkiely

+0

같은 값을 반환 5144/getset-cursor-in-html-textarea /) – MikeM

답변

2

트래버스! (http://snipplr.com/view/ Here’s a demo.

function getSelectionOffsetFrom(parent) { 
    var sel = window.getSelection(); 
    var current = sel.anchorNode; 
    var offset = sel.anchorOffset; 

    while(current && current !== parent) { 
     var sibling = current; 

     while(sibling = sibling.previousSibling) { 
      if(sibling.nodeType === 3) { 
       offset += sibling.nodeValue.length; 
      } else if(sibling.nodeType === 1) { 
       offset += getContentLength(sibling); 
      } 
     } 

     current = current.parentNode; 
    } 

    if(!current) { 
     return null; 
    } 

    return offset; 
} 

function getContentLength(element) { 
    var stack = [element]; 
    var total = 0; 
    var current; 

    while(current = stack.pop()) { 
     for(var i = 0; i < current.childNodes.length; i++) { 
      if(current.childNodes[i].nodeType === 1) { 
       stack.push(current.childNodes[i]); 
      } else if(current.childNodes[i].nodeType === 3) { 
       total += current.childNodes[i].nodeValue.length; 
      } 
     } 
    } 

    return total; 
} 
+0

예를 들어 주셔서 감사합니다! 스팬 뒤에 텍스트가 있으면 문제가됩니다. 캐럿을 10에 넣으십시오. http://jsfiddle.net/ybn6e/1/ – gkiely

+0

@GrantKiely : Aaah. 권리. 잠깐! 어떤 종류의 브라우저 호환성이 필요합니까? – Ryan

+0

크롬 전용, 감사합니다 – gkiely