2013-03-01 11 views
9

Ich bin dabei, Facebook wie in der Integration in meine contenteditable div zu implementieren, wo, wenn ich '$' geben und ein Zeichen wie 'a' brauche ich eine Auto-Vorschlag, der auftauchen sollte in der Nähe meiner Caret-Position.erhalten letzte Zeichen vor Caret Position in Javascript

Ich muss wissen, wie man das letzte Zeichen vor Caret Position entweder in JavaScript für IE und andere Browser herausfinden. Ich habe Zugriff auf die Jquery-Bibliothek.

(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

Diese Funktion wird nicht für contenteditable Elemente in Browsern nicht-IE arbeiten. es ist für Eingaben und Textareas. –

+0

ja ich weiß, es war nur ein Beispiel .. kannst du mir einen anderen Weg vorschlagen, den letzten Charakter vor der Careposition zu finden ?? – Anoop

Antwort

20

Hier ist ein Beispiel, wie Sie dies tun. Es erstellt einen Bereich, der am Anfang des editierbaren Elements beginnt und unmittelbar vor dem Caret endet, den Text des Bereichs abruft und das letzte Zeichen dieses Bereichs zurückgibt.

Demo: http://jsfiddle.net/MH5xX/

Code:

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

hi es funktioniert wie ein Charme. Vielen Dank. Ich habe noch ein Problem. Ich verwende den Infragistics Content-Editor. In IE wird es also ein div sein, aber in Chrome wird es ein iframe sein. Ich habe versucht, mit iframe und es funktioniert nicht .. können Sie mir sagen, wie ich es in iframe finden wird. Danke – Anoop

+0

@Annoop: Sie müssen die Verweise auf "Dokument" und "Fenster" mit Dokumenten und Fensterobjekte erhalten von erhalten der Iframe. Sollte nicht zu schwer sein. –

+0

Danke.Es hat für mich funktioniert.Für Chrome mit Iframe habe ich document.getElementById ('iframe_id'). ContentDocument.getSelection() anstelle von window.getSelection verwendet. Und ich benutzte range.setStart (containerEl.contentDocument.body, 0); Insead von range.setStart (containerEl, 0); Danke noch einmal. kannst du mir irgendeine Lösung für diesen Link vorschlagen [wie man ein Auto-Suggestions-Div in der Nähe der Caret-Position in einem editierbaren Div anzeigen kann] (http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-caret-position -in-content-editierbar – Anoop