Как сделать TinyMCE вставить в обычный текст по умолчанию
Googled это тысячи раз, никто не дает полное решение о том, как сделать TinyMCE вставить в обычный текст по умолчанию и удалить любое форматирование, не нажимая кнопку "Вставить как текст".
есть идеи, как это реализовать? или как включить кнопку" Вставить как текст " автоматически?
спасибо
10 ответов:
EDIT: это решение для версии 3.x, для 4.x версия читайте ответ от @Paulo Neves
проблема в том, что плагин Paste автоматически сбрасывает вставку обычного текста на каждую вставку. Так что все, что нам нужно сделать - вернуть его обратно. Следующий код должен помочь.
tinyMCE.init({ ... oninit : "setPlainText", plugins : "paste" .... });
определение setPlainText
function setPlainText() { var ed = tinyMCE.get('elm1'); ed.pasteAsPlainText = true; //adding handlers crossbrowser if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { ed.onKeyDown.add(function (ed, e) { if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) ed.pasteAsPlainText = true; }); } else { ed.onPaste.addToTop(function (ed, e) { ed.pasteAsPlainText = true; }); } }
Так что теперь это всегда будет ясно.
для tinyMCE 3X или 4X вещи немного изменились. теперь вы можете сделать это, и это работает прекрасно.
tinymce.init({ plugins: "paste", paste_as_text: true });
Я решил эту проблему с помощью этого кода
tinyMCE.init({ ... plugins : "paste", paste_text_sticky : true, setup : function(ed) { ed.onInit.add(function(ed) { ed.pasteAsPlainText = true; }); } .... })
просто столкнулся с этим сам и обнаружил, что по состоянию на TinyMCE 3.4.2 вы можете просто:
paste_text_sticky: true, paste_text_sticky_default: true
...и это было приятно.
Я думаю, что самый простой способ будет следующим:
tinymce.init({ ... paste_as_text: true, plugins: "paste", ... });
FYI, TinyMCE улучшил это, реализовав его в качестве опции по умолчанию в плагине вставки. Дополнительная информация: http://www.tinymce.com/wiki.php/Plugin:paste
однако, это все еще не идеально. Итак, вот скрипт, который также отключает все HTML:
// Paste paste_auto_cleanup_on_paste : true, paste_remove_spans: true, paste_remove_styles: true, paste_retain_style_properties: false, paste_preprocess : function(pl, o) { // Replace <div> with <p> o.content = o.content.replace(/<div>/gi, "<p>"); o.content = o.content.replace(/<\/div>/gi, "</p>"); o.content = o.content.replace(/<\r\n/gi, "\n"); o.content = o.content.replace(/<\n\n/gi, "\n"); o.content = o.content.replace(/<\n\n/gi, "\n"); // Replace empty styles o.content = o.content.replace(/<style><\/style>/gi, ""); o.wordContent = true; }, paste_postprocess : function(pl, o) { //console.log(o.node.innerHTML); var ed = pl.editor, dom = ed.dom; // Remove all tags which are not <p> or <br> tinymce.each(dom.select('*', o.node), function(el) { if (el.tagName.toLowerCase() != "p" && el.tagName.toLowerCase() != "br") { dom.remove(el, 1); // 1 = KeepChildren console.log(el.tagName); } dom.setAttrib(el, 'style', ''); }); },
источник: http://www.tinymce.com/forum/viewtopic.php?pid=60121#p60121
без плагина: слушайте вставить событие, получить данные буфера обмена
Если вы не можете использовать или не хотите использовать плагин по какой-либо причине, вы можете создать свою собственную функцию обратного вызова "вставить как обычный текст" следующим образом:
tinyMCE.init({ // ..., setup: function (editor) { // Listen for paste event, add "Paste as plain text" callback editor.onPaste.add(function (editor, e) { // Prevent default paste behavior e.preventDefault(); // Check for clipboard data in various places for cross-browser compatibility. // Get that data as text. var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text'); // Let TinyMCE do the heavy lifting for inserting that content into the editor. editor.execCommand('mceInsertContent', false, content); }); } });
Примечание: это было создано для TinyMCE 3.5.X. совместимость может отличаться в зависимости от версии.
Я сделал следующее:
var pastePlainText = function() { // No need to pass in an ID, instead fetch the first tinyMCE instance var ed = tinyMCE.get(0); ed.pasteAsPlainText = true; //adding handlers crossbrowser if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { ed.onKeyDown.add(function (ed, e) { if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) ed.pasteAsPlainText = true; }); } else { ed.onPaste.addToTop(function (ed, e) { ed.pasteAsPlainText = true; }); } };
и затем:
tinyMCE.init({ // ... plugins: "paste", oninit: pastePlainText // Note, without " // ... })
Я не уверен, что это возможно, так как "вставить как обычный текст" фактически выполняет очистку текста, прежде чем он добавит его в окно. Если вы просто вставляете данные в окно, никакие операции не могут быть выполнены. (Если вы не подключили в
onChange
или что-то еще), но они могут в конечном итоге исправить код, который уже был вставлен и, таким образом, "двойная фиксация".