0

我做了以下函数将消息(msg)插入文本字段。

插入文本后,光标需要位于输入的 msg 的最后一个字符之后。文本字段已经包含一些文本。

当我插入消息时,光标会集中在消息末尾附近的某个地方,但肯定不会在最后一个字符之后。似乎有些字符没有按 .length 计算?

     function insertAtCursor(msg) {
           var textArea = document.getElementsByName("message")[0];
           textArea.value = textArea.value.substr(0, textArea.selectionStart) + msg +        textArea.value.substr(textArea.selectionEnd);
           var endMsgPos = textArea.value.lastIndexOf(msg) + msg.length;
           textArea.setSelectionRange(endMsgPos, endMsgPos);
     }
4

2 回答 2

1

首先,如果您尝试使用 IE 8,您将遇到问题,textArea.selectionStart因为它使用不同的 API。

其次lastIndexOf,如果插入符号位于字符串的开头,并且在末尾的某个地方存在 msg 的值,那么代码中的行为会很奇怪。

尝试这个:

   function insertAtCursor(msg) {
     var e = document.getElementsByName('message')[0],
     length = msg.length, val = e.value;
     /* mozilla / dom 3.0 */
     if ('selectionStart' in e){
       var partial = val.slice(0, e.selectionStart) + msg;
       e.value = partial + val.slice(e.selectionEnd);
       var end = partial.length; 
       e.setSelectionRange(end, end);
     }
     /* exploder */
     if (document.selection){
         e.focus();
         document.selection.createRange().text = msg;
     }
   }

演示在这里:http: //jsbin.com/UnOBUbU/6

于 2013-10-30T13:53:41.383 回答
1

没有必要textArea.value.lastIndexOf(msg)

function insertAtCursor(msg) {
    var textArea = document.getElementsByName("message")[0];
    var selStart = textArea.selectionStart, val = textArea.value;
    textArea.value = val.slice(0, selStart) + msg +
                     val.slice(textArea.selectionEnd);
    var endMsgPos = selStart + msg.length;
    textArea.setSelectionRange(endMsgPos, endMsgPos);
}
于 2013-10-30T13:16:09.920 回答