我有一个包含很多文本框的页面。当有人单击链接时,我希望在光标所在的位置插入一两个单词,或附加到具有焦点的文本框。
例如,如果光标/焦点位于显示“apple”的文本框上,而他单击了显示“[email]”的链接,那么我希望该文本框显示“apple bob@example.com”。
我怎样才能做到这一点?这甚至是可能的,因为如果焦点在单选/下拉/非文本框元素上怎么办?可以记住最后一个关注文本框的内容吗?
我有一个包含很多文本框的页面。当有人单击链接时,我希望在光标所在的位置插入一两个单词,或附加到具有焦点的文本框。
例如,如果光标/焦点位于显示“apple”的文本框上,而他单击了显示“[email]”的链接,那么我希望该文本框显示“apple bob@example.com”。
我怎样才能做到这一点?这甚至是可能的,因为如果焦点在单选/下拉/非文本框元素上怎么办?可以记住最后一个关注文本框的内容吗?
使用这个,从这里:
function insertAtCaret(areaId, text) {
var txtarea = document.getElementById(areaId);
if (!txtarea) {
return;
}
var scrollPos = txtarea.scrollTop;
var strPos = 0;
var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?
"ff" : (document.selection ? "ie" : false));
if (br == "ie") {
txtarea.focus();
var range = document.selection.createRange();
range.moveStart('character', -txtarea.value.length);
strPos = range.text.length;
} else if (br == "ff") {
strPos = txtarea.selectionStart;
}
var front = (txtarea.value).substring(0, strPos);
var back = (txtarea.value).substring(strPos, txtarea.value.length);
txtarea.value = front + text + back;
strPos = strPos + text.length;
if (br == "ie") {
txtarea.focus();
var ieRange = document.selection.createRange();
ieRange.moveStart('character', -txtarea.value.length);
ieRange.moveStart('character', strPos);
ieRange.moveEnd('character', 0);
ieRange.select();
} else if (br == "ff") {
txtarea.selectionStart = strPos;
txtarea.selectionEnd = strPos;
txtarea.focus();
}
txtarea.scrollTop = scrollPos;
}
<textarea id="textareaid"></textarea>
<a href="#" onclick="insertAtCaret('textareaid', 'text to insert');return false;">Click Here to Insert</a>
也许更短的版本,会更容易理解?
jQuery("#btn").on('click', function() {
var $txt = jQuery("#txt");
var caretPos = $txt[0].selectionStart;
var textAreaTxt = $txt.val();
var txtToAdd = "stuff";
$txt.val(textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos) );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<textarea id="txt" rows="15" cols="70">There is some text here.</textarea>
<input type="button" id="btn" value="OK" />
我写这个是为了回应如何使用 jquery 从指针的当前位置向文本框添加文本?
George Claghorn 批准的答案非常适合简单地在光标位置插入文本。如果用户选择了文本,并且您希望替换该文本(大多数文本的默认体验),则需要在设置 'back' 变量时进行一些小的更改。
另外,如果你不需要支持老版本的IE,现代版本支持textarea.selectionStart,这样你就可以去掉所有的浏览器检测,以及IE特有的代码。
这是一个至少适用于 Chrome 和 IE11 的简化版本,并处理替换所选文本。
function insertAtCaret(areaId, text) {
var txtarea = document.getElementById(areaId);
var scrollPos = txtarea.scrollTop;
var caretPos = txtarea.selectionStart;
var front = (txtarea.value).substring(0, caretPos);
var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
txtarea.value = front + text + back;
caretPos = caretPos + text.length;
txtarea.selectionStart = caretPos;
txtarea.selectionEnd = caretPos;
txtarea.focus();
txtarea.scrollTop = scrollPos;
}
上面的代码在 IE 中对我不起作用。这是基于此答案的一些代码。
我取出了getElementById
以便我可以以不同的方式引用元素。
function insertAtCaret(element, text) {
if (document.selection) {
element.focus();
var sel = document.selection.createRange();
sel.text = text;
element.focus();
} else if (element.selectionStart || element.selectionStart === 0) {
var startPos = element.selectionStart;
var endPos = element.selectionEnd;
var scrollTop = element.scrollTop;
element.value = element.value.substring(0, startPos) +
text + element.value.substring(endPos, element.value.length);
element.focus();
element.selectionStart = startPos + text.length;
element.selectionEnd = startPos + text.length;
element.scrollTop = scrollTop;
} else {
element.value += text;
element.focus();
}
}
input{width:100px}
label{display:block;margin:10px 0}
<label for="in2copy">Copy text from: <input id="in2copy" type="text" value="x"></label>
<label for="in2ins">Element to insert: <input id="in2ins" type="text" value="1,2,3" autofocus></label>
<button onclick="insertAtCaret(document.getElementById('in2ins'),document.getElementById('in2copy').value)">Insert</button>
编辑:添加了一个正在运行的代码段,jQuery is not being used。
使用@quick_sliv 回答:
function insertAtCaret(el, text) {
var caretPos = el.selectionStart;
var textAreaTxt = el.value;
el.value = textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos);
};