2011-12-29 3 views
2

(designMode를 사용하여) 편집 가능한 iFrame의 커서 위치를 가져 오려고합니다. 하지만 iframe이 문서의 처음부터, 거기에서designMode iFrame 커서 위치 가져 오기

document.getElementById('iframe_id').contentWindow.document.getSelection().getRangeAt(0) 

, 재산 startOffset를 받고 그 줄의 처음부터 문자 수를 가져옵니다 여기에 지금까지 가지고있는 코드입니다. 나는 문서의 시작 부분에 상대적으로 커서 위치를 얻고 싶다.

참고 : 이 아니며 에 커서 위치를 설정하고 있습니다.; 나는 그것을 얻고 싶다.

가급적 Chrome/Safari/Firefox와 호환되는 수정 프로그램을 사용하고 싶습니다. IE와의 호환성은 필요하지 않습니다.

도움을 주시면 감사하겠습니다.

답변

5

다음은 this answer을 기반으로하지만 어떤 문서 (iframe에있는 것과 같은)에서 선택하여 작동하도록 수정되었습니다. 이 답변에서 제시된이 접근법의 기본에 대한 동일한주의 사항이 여전히 적용됩니다.

function getCaretCharacterOffsetWithin(element) { 
    var doc = element.ownerDocument || element.document; 
    var win = doc.defaultView || doc.parentWindow; 
    var sel, range, preCaretRange, caretOffset = 0; 
    if (typeof win.getSelection != "undefined") { 
     sel = win.getSelection(); 
     if (sel.rangeCount) { 
      range = sel.getRangeAt(0); 
      preCaretRange = range.cloneRange(); 
      preCaretRange.selectNodeContents(element); 
      preCaretRange.setEnd(range.endContainer, range.endOffset); 
      caretOffset = preCaretRange.toString().length; 
     } 
    } else if ((sel = doc.selection) && sel.type != "Control") { 
     range = doc.selection.createRange(); 
     preCaretRange = doc.body.createTextRange(); 
     preCaretRange.moveToElementText(element); 
     preCaretRange.setEndPoint("EndToEnd", textRange); 
     caretOffset = preCaretTextRange.text.length; 
    } 
    return caretOffset; 
} 

사용 예제 :

var iframe = document.getElementById("foo"); 
var iframeBody = (iframe.contentDocument || iframe.contentWindow.document).body; 
alert(getCaretCharacterOffsetWithin(iframeBody)); 
0

이 나를 위해

function getCaretPosition() { 
var element = document.idEditbox.document.body; // just my content IFRAME 
var doc = element.ownerDocument || element.document; 
var win = doc.defaultView || doc.parentWindow; 
var sel, range, preCaretRange, caretOffset = 0; 
if (typeof win.getSelection != "undefined") { 
    sel = win.getSelection(); 
    if (sel.rangeCount) { 
     range = sel.getRangeAt(0); 
     preCaretRange = range.cloneRange(); 
     preCaretRange.selectNodeContents(element); 
     preCaretRange.setEnd(range.endContainer, range.endOffset); 
     caretOffset = preCaretRange.toString().length; 
    } 
} else if ((sel = doc.selection) && sel.type != "Control") { 
    range = doc.selection.createRange(); 
var tempRange = range.duplicate(); 
    preCaretRange = doc.body.createTextRange(); 
    preCaretRange.moveToElementText(element); 
    preCaretRange.setEndPoint("EndToEnd", tempRange); 
    caretOffset = preCaretRange.text.length; 
} 
return caretOffset; 

}

근무
관련 문제