Firefox 可以在文本区域中使用 document.execCommand 吗?

twh*_*whb 5 javascript editor

当光标位于 contenteditable 中时div,Chrome 和 Firefox 都可以模拟输入“sometext”,如下所示:

document.execCommand('insertText', false, 'sometext');
Run Code Online (Sandbox Code Playgroud)

在 Chrome 中,当您处于 a 状态时,这textarea也适用。在 Firefox 中,我收到错误“NS_ERROR_FAILURE:”。

这是一个演示的小提琴:http://jsfiddle.net/ukx37/。在 Chrome 中,按 Enter 键并输入“ENTER\n”。在 Firefox 中,输入“\n”并收到错误 NS_ERROR_FAILURE。

有谁知道是否有办法在 Firefox 中实现此功能?或者,如果没有,是否有某种方法可以在没有 try-catch 语句的情况下测试支持?

另外,我不想手动编辑文本区域的值,因为这样做会破坏编辑历史记录。

twh*_*whb 4

发现错误正在被触发,因为焦点节点不可进行内容编辑。如果您使文本区域内容可编辑,它会停止触发错误,但会出现所有错误。Firefox有时会将插入的文本放在textarea中,有时将其作为textarea的子节点放入DOM中(并且从不显示它),有时什么都不做。没有引发任何错误,但它仍然无法使用。使父内容可编辑而文本区域不可编辑也是如此。

我现在使用的答案是功能检测,如果它不“正常工作”就放弃。如果有人让 Firefox 工作,我将不接受这一点并接受他们的。在那之前,这是我正在使用的代码。

var canEditInput = (function () {
    try {
        var t = document.createElement('textarea');
        document.body.appendChild(t);
        t.focus();
        document.execCommand('insertText', false, 'x');
        document.body.removeChild(t);
        return t.value === 'x';
    } catch (e) {
        return false;
    }
})();
Run Code Online (Sandbox Code Playgroud)

请注意,我们不能给予t display:none;,因为那样就无法集中注意力。但这并不重要,因为 JS 应该t在浏览器开始绘制下一帧之前完成(并删除)。

  • 以下是有关该问题的 Firefox 错误报告:https://bugzilla.mozilla.org/show_bug.cgi?id=1220696 (2认同)