有没有一种方法可以使用 JavaScript 编辑 input
或 textarea
的内容,并使得更改可以通过浏览器的“撤消”命令(例如 ctrl-Z
)进行撤销?
我正在尝试将字符串(例如 "Foo {0} bar")插入到所选部分中,如果用户选择了一段文本,则将所选内容插入到字符串中的 "{0}" 位置。
例如,如果 textarea 包含 "Example 1 2 3",并且光标在 "Example 1| 2 3" 处,则该函数会将值更改为 "Example 1Foo blah bar 2 3"(在这种情况下,valueIfNothingSelected
为 "blah")。如果选择了范围 "1 2",则该函数将将值更改为 "Example Foo 1 2 bar 3"。
在 Chrome 中,我测试了此功能,它确实按预期工作,但我无法使用 undo
来撤消更改。
function insertTextAtCursor(text, valueIfNothingSelected) {
var field = $('textarea[name="task_log_description"]')[0];
var startPos = field.selectionStart;
var endPos = field.selectionEnd;
var processedText;
if (startPos == endPos) {
processedText = text.replace('{0}', valueIfNothingSelected);
field.value = field.value.substring(0, startPos) + processedText + field.value.substring(endPos, field.value.length);
field.selectionStart = startPos + text.indexOf('{0}');
field.selectionEnd = field.selectionStart + valueIfNothingSelected.length;
} else {
var selectedText = field.value.substring(startPos, endPos);
processedText = text.replace('{0}', selectedText);
field.value = field.value.substring(0, startPos) + processedText + field.value.substring(endPos, field.value.length);
field.selectionStart = startPos + text.indexOf('{0}');
field.selectionEnd = field.selectionStart + selectedText.length;
}
field.focus();
}