2010-08-18 40 views
3

Possible Duplicate:
Inserting a text where cursor is using Javascript/jquery如何使用javascript

我在这里构建一个简单的模板系统中的光标位置文本添加到文本区域。基本上我已经设置了将预设变量添加到textarea中的按钮。

问题是我希望能够在我的光标所在的位置在我的textarea中添加文本。就像当您点击编辑器窗口中的URL链接以获取帖子时,链接添加到您的光标所在的位置。

我该怎么做?而且可以使用原型JS完成吗?

回答

4

这对IE来说有点棘手,这对于这类事情做得非常糟糕。 (如果选择了任何文本,或在脱字符号)下面将在当前选择的在一个textarea或文本输入端插入文本,然后将文本之后将光标定位:

演示:http://jsfiddle.net/RqTvT/1/

代码:

function getInputSelection(el) { 
    var start = 0, end = 0, normalizedValue, range, 
     textInputRange, len, endRange; 

    if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { 
     start = el.selectionStart; 
     end = el.selectionEnd; 
    } else { 
     range = document.selection.createRange(); 

     if (range && range.parentElement() == el) { 
      len = el.value.length; 
      normalizedValue = el.value.replace(/\r\n/g, "\n"); 

      // Create a working TextRange that lives only in the input 
      textInputRange = el.createTextRange(); 
      textInputRange.moveToBookmark(range.getBookmark()); 

      // Check if the start and end of the selection are at the very end 
      // of the input, since moveStart/moveEnd doesn't return what we want 
      // in those cases 
      endRange = el.createTextRange(); 
      endRange.collapse(false); 

      if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { 
       start = end = len; 
      } else { 
       start = -textInputRange.moveStart("character", -len); 
       start += normalizedValue.slice(0, start).split("\n").length - 1; 

       if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { 
        end = len; 
       } else { 
        end = -textInputRange.moveEnd("character", -len); 
        end += normalizedValue.slice(0, end).split("\n").length - 1; 
       } 
      } 
     } 
    } 

    return { 
     start: start, 
     end: end 
    }; 
} 

function offsetToRangeCharacterMove(el, offset) { 
    return offset - (el.value.slice(0, offset).split("\r\n").length - 1); 
} 

function setSelection(el, start, end) { 
    if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { 
     el.selectionStart = start; 
     el.selectionEnd = end; 
    } else if (typeof el.createTextRange != "undefined") { 
     var range = el.createTextRange(); 
     var startCharMove = offsetToRangeCharacterMove(el, start); 
     range.collapse(true); 
     if (start == end) { 
      range.move("character", startCharMove); 
     } else { 
      range.moveEnd("character", offsetToRangeCharacterMove(el, end)); 
      range.moveStart("character", startCharMove); 
     } 
     range.select(); 
    } 
} 

function insertTextAtCaret(el, text) { 
    var pos = getInputSelection(el).end; 
    var newPos = pos + text.length; 
    var val = el.value; 
    el.value = val.slice(0, pos) + text + val.slice(pos); 
    setSelection(el, newPos, newPos); 
} 

var textarea = document.getElementById("your_textarea"); 
insertTextAtCaret(textarea, "[INSERTED]"); 
+0

不幸的是,这打破在铬(版本28.0.1500.52)用'未捕获的类型错误:对象#没有方法 '的createTextRange''。文本被插入,但之后光标的位置被拧紧。 – Polygnome 2013-06-22 10:47:14

+0

@Polygnome:是的,那里有些疏忽。哎呀。现在更新。 – 2013-06-22 13:27:44