Может ли Firefox использовать document.execCommand в текстовой области?
С курсором в contenteditable div
и Chrome, и Firefox могут эмулировать ввод "sometext" следующим образом:
document.execCommand('insertText', false, 'sometext');
В Chrome это работает, когда вы находитесь в textarea
также. В Firefox я получаю сообщение об ошибке "NS_ERROR_FAILURE:".
Вот скрипка для демонстрации: http://jsfiddle.net/ukx37/. В Chrome нажмите ввод и введите "ENTER\n". В Firefox вы вводите "\n" и получаете сообщение об ошибке NS_ERROR_FAILURE.
Кто-нибудь знает, есть ли способ заставить это работать в Firefox? Или, если нет, есть ли способ проверить поддержку без оператора try-catch?
Кроме того, я не хочу вручную редактировать значение текстовой области, потому что это нарушает историю редактирования.
1 ответ
Выяснил, что ошибка запускается, потому что сосредоточенный узел не является contentEditable. Если вы сделаете textarea contentEditable, он перестанет генерировать ошибки, но все ошибки будут. Firefox иногда помещает вставленный текст в текстовую область, иногда помещает его в 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
) до того, как браузер начнет рисовать следующий кадр.