2013-03-01 17 views
9

sto per implementare Facebook come nell'integrazione nel mio div contenteditable dove se io do '$' e un po 'di carattere, come 'a' Ho bisogno di un auto-suggestione, che dovrebbe pop-up vicino alla mia posizione di accostamento.ottenere ultimo carattere prima della posizione del punto di inserimento in javascript

Ho bisogno di sapere come trovare l'ultimo carattere prima della posizione di accostamento in JavaScript per IE e Altri browser. Ho accesso alla libreria 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

Tale funzione non funziona per gli elementi contentEditable in browser diversi da IE. è per input e textareas. –

+0

si lo so che era solo un esempio .. mi puoi suggerire un altro modo per trovare l'ultimo carattere prima della posizione del cursore? – Anoop

risposta

20

Ecco un esempio di come procedere. Crea un intervallo che inizia all'inizio dell'elemento modificabile e termina immediatamente prima del cursore, ottiene il testo dell'intervallo e restituisce l'ultimo carattere di tale intervallo.

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

Codice:

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

ciao alle sue opere come un fascino. Grazie. Ho ancora un problema. Sto usando l'editor di contenuti di Infragistics. Quindi in IE sarà un div ma in Chrome sarà un iframe. Ho provato con iframe e non funziona .. puoi dirmi come lo troverò in iframe.Thanks – Anoop

+0

@Anoop: dovrai sostituire i riferimenti a 'document' e' window' con oggetti documento e finestra ottenuti da l'iframe. Non dovrebbe essere troppo difficile. –

+0

Grazie. Ha funzionato per me. Per Chrome con Iframe ho utilizzato document.getElementById ('iframe_id'). ContentDocument.getSelection() invece di window.getSelection. E ho usato range.setStart (containerEl.contentDocument.body, 0); insead of range.setStart (containerEl, 0); Grazie ancora. puoi suggerirmi qualsiasi soluzione per questo link [come mostrare un div di suggerimento automatico vicino alla posizione del cursore in un div-modificabile per i contenuti] (http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-caret-position-in-a-content-editable) – Anoop