2013-03-01 64 views
9

我即将实施Facebook在我的contenteditable div集成如果我给'$'和一些像'a'字符我需要一个自动建议应该弹出靠近我的位置。得到最后一个字符在插入符号前插入位置

我需要知道如何在插入位置前找出最后一个字符,无论是在JavaScript中的IE浏览器还是其他浏览器。我有权访问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元素工作。它用于输入和textareas。 – 2013-03-01 12:14:05

+0

是的,我知道这只是一个例子..你可以建议我一些其他的方式来找到最后一个字符之前插入位置? – Anoop 2013-03-01 12:17:33

回答

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 2013-03-01 12:56:53

+0

@Anoop:您需要替换文档和窗口对象的文档和窗口对象的引用iframe。不应该太难。 – 2013-03-01 15:48:15

+0

Thanks.It对我有效。对于使用Iframe的Chrome,我使用document.getElementById('iframe_id')。contentDocument.getSelection()而不是window.getSelection。我用range.setStart(containerEl.contentDocument.body,0); range.setStart(containerEl,0)的insead;再次感谢。你可以建议我任何解决方案此链接[如何显示在内容可编辑div插入符位置附近的自动暗示div](http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-caret-position-in-a-content-editable) – Anoop 2013-03-02 05:56:44

相关问题