콘텐츠 편집 가능한 DIV (텍스트 상자에 HTML 콘텐츠를 렌더링해야하므로 TEXTAREA에서 contenteditable DIV를 사용하는 것이 좋습니다)에 대한 자동 완성 기능을 작성하고 있습니다. 이제는 DIV에 keyup/keydown/click 이벤트가있을 때 커서 위치를 찾아야합니다. 그래서 그 위치에 HTML/텍스트를 삽입 할 수 있습니다. 나는 계산에 의해 그것을 찾을 수있는 방법을 알지 못한다. 또는 컨텐트 허용 DIV에서 커서 위치를 찾는데 도움이되는 네이티브 브라우저 기능이있다.contenteditable DIV에서 커서 위치를 찾는 방법은 무엇입니까?
답변
커서로 내용을 삽입하려는 경우 위치를 명시 적으로 찾을 필요가 없습니다. 다음 함수는 모든 메인 스트림 데스크탑 브라우저에서 커서의 위치에 DOM 노드 (요소 또는 텍스트 노드)를 삽입합니다 :
function insertNodeAtCursor(node) {
var range, html;
if (window.getSelection && window.getSelection().getRangeAt) {
range = window.getSelection().getRangeAt(0);
range.insertNode(node);
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
html = (node.nodeType == 3) ? node.data : node.outerHTML;
range.pasteHTML(html);
}
}
오히려 HTML 문자열 삽입 할 경우
function insertHtmlAtCursor(html) {
var range, node;
if (window.getSelection && window.getSelection().getRangeAt) {
range = window.getSelection().getRangeAt(0);
node = range.createContextualFragment(html);
range.insertNode(node);
} else if (document.selection && document.selection.createRange) {
document.selection.createRange().pasteHTML(html);
}
}
UPDATE를
영업의 의견에 따라, 나는 IE에 DOM 범위처럼 동작 TextRange
개체를 래퍼를 추가 내 자신의 Rangy 라이브러리를 사용하는 것이 좋습니다. DOM Range은 시작과 끝 경계로 구성되며, 각 경계는 노드와 그 노드 내의 오프셋으로 표현되며 범위를 조작하기위한 여러 방법이 있습니다. MDC article은 몇 가지 소개를 제공해야합니다.
@Tim, 답변 해 주셔서 감사합니다. 이것은 현재 커서 위치에 삽입해야 할 때 작동합니다. 아마도 내가 말하고자했던 것은 커서를 특정 위치에 설정하고 거기에 삽입하는 것입니다. 현재 커서 위치를 알고 있고 자동 완성 드롭 다운에서 클릭 할 때 위치를 몇 개 뒤로 트래버스하고 html을 삽입한다고 가정합니다. (위치를 찾고 DOM에 삽입하는 것에 대해 이야기하고 있습니까?) –
OK, 대답을 업데이트했습니다. –
커서 위치 또는 캐럿 위치? 사실 좌표로 좌표 위치를 찾아야합니까? –