CLEditor, вставка содержимого в виде текста в главном окне
Я использую CLEditor, http://premiumsoftware.net/cleditor/, для моего текстового редактора. Существует функция "вставить как текст", которая при нажатии на кнопку появляется всплывающее окно с текстовой областью для вставки содержимого и удаления стилей.
То, что я хотел бы сделать, это взять ту же самую функциональность, но каждый раз, когда кто-то вставляет в основную текстовую область, это действие выполняется автоматически. Как бы это вызвать?
Я создал JS Fiddle, http://jsfiddle.net/helpinspireme/naubS/, но не смог вставить туда все JS, поэтому для ссылки на основной файл JS для CLEditor посетите их сайт: http://premiumsoftware.net/cleditor/
Спасибо за помощь.
2 ответа
Мне известно, что я не отвечаю на ваш реальный вопрос, но в случае, если ваша настоящая проблема - это мусор, создаваемый пользователем, который пытается вставить текст из Microsoft Office (например, Word), я бы порекомендовал рассмотреть альтернативное решение.
Сам CLEditor может переключаться между iFrame (режим расширенного текста) и текстовой областью (режим источника). Функциональность "Вставить как текст" использует текстовую область, которая сама по себе не поддерживает форматированный текст, так что в первую очередь она не допускает мусорный HTML.
Однако, если редактор находится в режиме расширенного текста, очень трудно предотвратить вставку пользователем текста из Word (он может использовать обычную кнопку вставки, нажать CTRL-V или даже использовать контекстное меню правой кнопки мыши, которые представляют собой разные события. и трудно перехватить с помощью JavaScript). Так что теперь ущерб уже нанесен; у вас есть грязный HTML внутри вашего редактора. Поэтому вместо того, чтобы пытаться очистить мусор, производимый Word, я реализовал следующую проверку (javascript) после сохранения захваченного ввода:
if(clEditorValue && (clEditorValue.indexOf('<!--') !== -1 || clEditorValue.indexOf('mso-ansi-language') !== -1 ) ) {
alert('Unable to process text pasted from Word, please use "Paste as text" or modify your input');
return;
}
Я надеюсь, что этот ответ будет полезен для других людей, пытающихся достичь того же.
При вставке в cleditor редактор выбирает все html из источника. В итоге я отредактировал jquery.cleditor.js и добавил функцию привязки к функции $doc.click(hidePopups). Я использовал setTimeouts, чтобы позволить тексту заполнить ввод и функцию updateTextArea для завершения.
.bind("paste", function() {
setTimeout(function() {
refreshButtons(editor);
updateTextArea(editor, true);
//remove any and all html from the paste action
setTimeout(function() {
//clean up the html with removeHtml function
$(editor.doc.body).html(removeHtml($(editor.doc.body).html()));
//change the input value with new clean string
$("#" + editor.$area[0].id).val($(editor.doc.body).html());
}, 100);
}, 100);
})
Я использую функцию removeHtml ниже, чтобы удалить весь HTML из вставленного содержимого.
//remove html altogether
function removeHtml(str) {
var regex = /(<([^>]+)>)/ig;
var result = str.replace(regex, "");
return result;
}
Это решение сейчас в производстве.