11

几天前,我发布了一个关于如何在 Internet Explorer 中更新文本的问题。看起来,所使用的方法在 Firefox 中也不起作用。

这让我想到是否有办法修改文本区域的值并更新撤消/重做队列(调用ctrl-Zdocument.execCommand('undo');

到目前为止,我发现了两种可能性,但它们并不适用于所有浏览器:

选项1:

var event = document.createEvent('TextEvent');
event.initTextEvent('textInput', true, true, null, text, 9, "en-US");
textarea.focus();
textarea[0].setSelectionRange(selection.start, selection.end);
textarea[0].dispatchEvent(event);

注意:在 IE(根本)和 Firefox 中似乎不起作用

选项 2:

document.execCommand("insertText", false, "the text to insert");

在 IE 中不起作用(在 9 下测试,但似乎根本没有实现),我不知道其他浏览器。

4

4 回答 4

6

到目前为止我提出的解决方案是这个,但我愿意接受更好的想法:

我通过 document.queryCommandSupported 检查 insertText 的存在。如果它确实存在,我会使用它。如果没有,我只需替换文本:

var text = "hello world",
    textarea = jQuery("textarea"),
    selection = {'start': textarea[0].selectionStart, 'end': textarea[0].selectionEnd};

if (document.queryCommandSupported('insertText')) {
    document.execCommand('insertText', false, text);
}
else {
    textarea.val(textarea.val().substring(0, selection.start) + text + textarea.val().substring(selection.end, textarea.val().length));
}
于 2013-11-06T14:18:08.577 回答
2

选项 1 目前(2016 年 8 月 19 日)运行良好,但在即将发布的版本之一的 Chrome 中已弃用。调度事件会生成以下警告:

从 JavaScript 生成的 DOM 事件触发了浏览器内的默认操作。此行为是非标准行为,将于 2016 年 9 月左右在 M53 中删除。有关详细信息,请参阅https://www.chromestatus.com/features/57188 ​​03933560832。

于 2016-08-19T07:44:07.380 回答
0

似乎到今天为止,所有现代浏览器都支持您的选项 #1,dispatchEvent。在这里查看更多:

http://help.dottoro.com/ljrinokx.php

于 2015-03-04T10:07:12.803 回答
0

只有支持的浏览器document.execCommand("insertText")才有undo支持(目前:Chrome、Safari、Opera)。其他浏览器有多种插入文本的方法,但不undo支持。

尝试使用 insert-text-textarea来包装此页面上的一些解决方案,以支持现代浏览器。如果您需要 IE8+ 支持,请尝试insert-text-at-cursor包。

于 2019-03-29T02:28:44.883 回答