Странно конкретный вопрос, но у меня уже есть решение вставить простой текст в <span contentEditable="true">
, используя скрытый textarea
, который, кажется, работает очень хорошо, за исключением того, что он нарушает функцию отмены браузера. Я не беспокоюсь о кросс-браузерном решении; Я забочусь только о Chrome. Мой подход выглядит примерно так:
$('.editable').live('paste', function()
{
var $this = $(this);
//more code here to remember caret position, etc
$('#clipboard').val('').focus(); //put the focus in the hidden textarea so that, when the paste actually occurs, it's auto-sanitized by the textarea
setTimeout(function() //then this will be executed immediately after the paste actually occurs
{
$this.focus();
document.execCommand('insertHTML', true, $('#clipboard').val());
});
});
Так что это работает - я могу вставить все, что угодно, и оно уменьшается до обычного текста перед переходом в поле contentEditable
- но если я пытаюсь отменить после вставки:
- Первая отмена отменяет вставку.
- Вторая отмена пытается отменить изменения в
#clipboard
, отодвигая фокус от моего contentEditable
.
Я перепробовал все, что мог, чтобы браузер не пытался отменить изменения в #clipboard
- переключение display:none
, когда он не используется активно, переключение состояний readonly
и disabled
, разрушение это в конце и воссоздание его в начале события выше, различные другие хаки - но, похоже, ничего не работает.
Это ужасный подход к санитарной обработке? Это первое, что мне удалось сделать - попытка очистить разметку после вставки не сработала, так как есть некоторые вещи (целые HTML-документы), которые при вставке вызывают сбой браузера, который Я бы хотел избежать.
Есть ли способ сделать #clipboard
не отменяемым или какие-либо другие предложения о том, как заставить это работать?
Редактировать
Мне удалось немного улучшить ситуацию, добавив строку
$('#clipboard').val('');
Сразу после строки execCommand
. Кажется, это полностью нейтрализует отмену: каретка больше не покидает поле contentEditable
, но ничто не отменяется вообще. Небольшое улучшение, но я все еще ищу правильное решение.