Firefox可以在textarea中使用document.execCommand吗?

时间:2014-06-02 02:14:44

标签: javascript editor

将光标置于可疑的div中,Chrome和Firefox都可以模拟输入"某些文字"像这样:

document.execCommand('insertText', false, 'sometext');

在Chrome中,当您在textarea时也可以使用此功能。在Firefox中,我收到错误" NS_ERROR_FAILURE:"。

这里有一个小小的演示:http://jsfiddle.net/ukx37/。在Chrome中,按Enter键,然后输入" ENTER \ n"。在Firefox中,键入" \ n"并收到错误NS_ERROR_FAILURE。

有人知道是否有办法在Firefox中使用它?或者,如果没有,是否有一些方法可以在没有try-catch语句的情况下测试支持?

此外,我不想手动编辑textarea的值,因为这样做会破坏编辑历史记录。

1 个答案:

答案 0 :(得分:4)

计算出错误被触发,因为焦点节点不是contentEditable。如果你使textarea contentEditable,它会停止触发错误,但会得到所有错误。 Firefox有时会将插入的文本放在textarea中,有时将它作为textarea的子节点放在DOM中(并且永远不会显示它),有时什么都不做。没有错误被触发,但它仍然无法使用。使父contentEditable和textarea不相同的事情。

我现在使用的答案是功能检测和放弃,如果它没有"只是工作"。如果有人让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;
    }
})();

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