【发布时间】:2020-11-30 23:07:52
【问题描述】:
我正在开发一个 chrome 扩展,它替换了部分文本。但它在 Gmail 上无法正常工作。
扫描仪:
Gmail 编辑器有以下文字 -
我现在就是这个。
我能做到。
我想把它换成-
我是新手。
我能做到。
但是,每当我执行代码时,它都不会替换正确位置上的文本。 它会看到我的光标所在的位置并将文本附加到那里而不是替换预期的文本。 此 sn-p 适用于其他具有可内容编辑器的网站。
我当前的实现如下所示:
const range = document.createRange();
const ele = <div tag element for 'i am now to this.' sentence>
// rangeStart and rangeEnd are the index which wraps word 'now'
range.setStart(ele.childNodes[0], rangeStart);
range.setEnd(ele.childNodes[0], rangeEnd);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
setTimeout(()=>{
document.execCommand(
"insertText",
false,
"new"
);
},0)
【问题讨论】:
-
标准方法是 1) 聚焦 contentenditable 元素,2) 调用 SelectAll 命令,3) 调用 insertText 命令。见Enter data into a custom-handled input field
-
@wOxxOm 我尝试了这个解决方案,但它重置了撤消堆栈。出于同样的原因,我没有使用插入 textNodes 并使用 innerHTML 替换,并且我使用 document.execCommand 来维护并拥有无缝的撤消体验。有什么办法可以在不弄乱撤消堆栈的情况下替换文本?
-
execCommand 始终保留撤消堆栈,所以我猜您在浏览器中遇到了错误。
-
@wOxxOm 也许这就是它在几年内被标记为折旧的原因。
标签: javascript dom google-chrome-extension gmail range