2013-03-01 3 views
9

contenteditable div에 통합과 같은 페이스 북을 구현하려고합니다. '$'와 'a'와 같은 일부 문자를 입력하면 팝업이 필요한 자동 제안이 필요합니다. 내 캐럿 위치 근처.자바 스크립트에서 캐럿 위치 앞에 마지막 문자 가져 오기

IE 및 다른 브라우저 용 JavaScript에서 캐럿 위치 앞에있는 마지막 문자를 찾는 방법을 알아야합니다. Jquery 라이브러리에 액세스 할 수 있습니다.

(function($) { 
    $.fn.getCursorPosition = function() { 
     var input = this.get(0); 
     if (!input) return; // No (input) element found 
     if ('selectionStart' in input) { 
      // Standard-compliant browsers 
      return input.selectionStart; 
     } else if (document.selection) { 
      // IE 
      input.focus(); 
      var sel = document.selection.createRange(); 
      var selLen = document.selection.createRange().text.length; 
      sel.moveStart('character', -input.value.length); 
      return sel.text.length - selLen; 
     } 
    } 
})(jQuery); 

eg. 
var caretPosition = $("#contenteditablediv").getCursorPosition(); 
var lastchar = getchar(caretposition -1);??? 
+1

그 기능은 비 IE 브라우저에서의 contentEditable 요소 작동하지 않습니다. 그것은 입력과 텍스트 영역을위한 것입니다. –

+0

예 예일뿐입니다. 당신이 나에게 캐럿 위치 전에 마지막 문자를 찾는 다른 방법을 제안 할 수 있습니까? – Anoop

답변

20

다음은이 작업 방법의 예입니다. 편집 가능한 요소의 시작 부분에서 시작하여 캐럿 바로 앞에서 끝나는 범위를 만들고, 범위의 텍스트를 가져 와서 해당 범위의 마지막 문자를 반환합니다.

데모 : http://jsfiddle.net/MH5xX/

코드 :

function getCharacterPrecedingCaret(containerEl) { 
    var precedingChar = "", sel, range, precedingRange; 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.rangeCount > 0) { 
      range = sel.getRangeAt(0).cloneRange(); 
      range.collapse(true); 
      range.setStart(containerEl, 0); 
      precedingChar = range.toString().slice(-1); 
     } 
    } else if ((sel = document.selection) && sel.type != "Control") { 
     range = sel.createRange(); 
     precedingRange = range.duplicate(); 
     precedingRange.moveToElementText(containerEl); 
     precedingRange.setEndPoint("EndToStart", range); 
     precedingChar = precedingRange.text.slice(-1); 
    } 
    return precedingChar; 
} 
+1

안녕하세요, 매력처럼 작동합니다. 감사. 나는 한 가지 더 문제가있다. Infragistics 콘텐츠 편집기를 사용하고 있습니다. IE에서는 div가되지만 Chrome에서는 iframe이됩니다. 나는 iframe을 시도해 보았고 작동하지 않았다. iframe에서 어떻게 찾을 수 있는지 말해 줄 수 있니? 감사합니다. – Anoop

+0

@Anoop :'document'와'window'에 대한 참조를 얻은 문서와 창 객체로 대체해야합니다 iframe 너무 열심히해서는 안됩니다. –

+0

감사합니다. 나를 위해 일했습니다. Iframe이있는 Chrome의 경우 document.getElementById ('iframe_id'). window.getSelection 대신 contentDocument.getSelection()을 사용했습니다. 그리고 난 range.setStart (containerEl.contentDocument.body, 0); setseart (containerEl, 0); 다시 한번 감사드립니다. 이 링크에 대한 해결책을 제안 할 수 있습니다 [자동 편집 div를 content-editable div의 캐럿 위치 근처에 표시하는 방법 (http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-caret-position-in-a-content-editable) – Anoop

관련 문제