如何默认使用纯文本制作tinymce paste

时间:2010-04-23 02:03:40

标签: javascript jquery tinymce

用Google搜索了数千次,没有人提供完整的解决方案,默认情况下如何以纯文本制作Tinymce粘贴,并删除任何格式而不点击“粘贴为文本”按钮。

有关如何实施的任何想法?或者如何自动启用“粘贴为文本”按钮?

谢谢

11 个答案:

答案 0 :(得分:135)

对于tinyMCE 3X或4X,情况有所改变。 现在你可以做到这一点并且工作正常。

tinymce.init({
    plugins: "paste",
    paste_as_text: true
});

答案 1 :(得分:82)

我用这段代码解决了这个问题

tinyMCE.init({
...
plugins : "paste",
paste_text_sticky : true,
setup : function(ed) {
    ed.onInit.add(function(ed) {
      ed.pasteAsPlainText = true;
    });
  }
....
})

答案 2 :(得分:54)

编辑:此解决方案适用于版本3.x,适用于4.x版本,请阅读@Paulo Neves的答案

问题是,粘贴插件会自动重置每个粘贴上的纯文本粘贴。所以我们需要做的就是 - 把它还原。以下代码应该有所帮助。

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;
            });
        }
    }

所以现在它总是很​​明显。

答案 3 :(得分:35)

我自己碰到了这个,发现从TinyMCE 3.4.2开始,你可以简单地说:

paste_text_sticky: true,
paste_text_sticky_default: true

......这很不错。

答案 4 :(得分:5)

我认为最简单的方法是:

tinymce.init({
   ...
   paste_as_text: true,
   plugins: "paste",
   ...
});

答案 5 :(得分:1)

使用起来不是更好:

var ed = tinyMCE.activeEditor;

而不是:

var ed = tinyMCE.get('elm1');

答案 6 :(得分:1)

仅供参考,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

答案 7 :(得分:1)

没有插件:收听粘贴事件,获取剪贴板数据

如果因任何原因无法使用或不想使用插件,您可以创建自己的&#34;粘贴为纯文本&#34;像这样的回调函数:

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创建的。兼容性可能因版本而异。

答案 8 :(得分:0)

我做了如下:

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 "
    // ...
})

答案 9 :(得分:0)

如果您使用.yml文件,请添加插件pastepaste_as_text: true

default:
  plugins:
    - paste
  paste_as_text: true

答案 10 :(得分:-1)

我不确定这是否可行,因为“粘贴为纯文本”实际上会在文本添加到窗口之前对文本进行清理。如果只是将数据粘贴到窗口中,则无法执行任何操作。 (除非你迷上了onChange或者什么),但是你可能最终修复已经粘贴过的代码,因此,“双重修复”它。