Javascript 使用「;pastefromword";在CKEditor 3中过滤所有粘贴的内容

Javascript 使用「;pastefromword";在CKEditor 3中过滤所有粘贴的内容,javascript,ckeditor,paste,Javascript,Ckeditor,Paste,CKEditor是一个很棒的编辑器,pastefromword插件非常好。我想将插件提供的过滤应用于所有粘贴的文本。例如,从word粘贴时,将删除所有字体和大小。从电子邮件粘贴时不会发生这种情况 也就是说,我提出了以下解决方案,并将其发布在这里以获得一些反馈。我想知道是我把它弄得太复杂了,还是有更简单的方法。我刚刚从pastefromword/plugin.js复制了代码 通过我的自定义config.js ... CKEDITOR.config.pasteFromWordCleanupFile

CKEditor是一个很棒的编辑器,pastefromword插件非常好。我想将插件提供的过滤应用于所有粘贴的文本。例如,从word粘贴时,将删除所有字体和大小。从电子邮件粘贴时不会发生这种情况

也就是说,我提出了以下解决方案,并将其发布在这里以获得一些反馈。我想知道是我把它弄得太复杂了,还是有更简单的方法。我刚刚从pastefromword/plugin.js复制了代码

通过我的自定义config.js

...
CKEDITOR.config.pasteFromWordCleanupFile = '/pastefromword.js';
...
CKEDITOR.on( 'instanceReady', function( ev ) {
    /**
     * Paste event to apply Paste From Word filtering on all text.
     *
     * The pastefromword plugin will only process text that has tell-tale signs
     * it is from Word. Use this hook to treat all pasted text as if
     * it is coming from Word.
     *
     * This method is a slightly modified version of code found in
     * plugins/pastefromword/plugin.js
     */
    ev.editor.on( 'paste', function( evt ) {    
        var data = evt.data,
            editor = evt.editor,
            content;

        /**
         * "pasteFromWordHappened" is a custom property set in custom
         * pastefromword.js, so that filtering does not happen twice for content
         * actually coming from Word. It's a dirty hack I know.
         */
        if( editor.pasteFromWordHappened ) {
            // Reset property and exit paste event
            editor.pasteFromWordHappened = 0;
            return;
        }

        var loadRules = function( callback ) {
            var isLoaded = CKEDITOR.cleanWord;

            if( isLoaded ) {
                callback();
            }
            else {
                CKEDITOR.scriptLoader.load( CKEDITOR.config.pasteFromWordCleanupFile, callback, null, false, true );
            }

            return !isLoaded;
        };

        content = data['html'];

        // No need to filter text if html tags are not presence, so perform a regex
        // to test for html tags.
        if( content && (/<[^<]+?>/).test(content) ) {
            var isLazyLoad = loadRules( function(){
                if( isLazyLoad ) {
                    editor.fire('paste', data);
                }
                else {
                    data[ 'html' ] = CKEDITOR.cleanWord( content, editor );
                    // Reset property or if user tries to paste again, it won't work
                    editor.pasteFromWordHappened = 0;
                }
            });

            isLazyLoad && evt.cancel();
        }

    });
});
。。。
CKEDITOR.config.pasteFromWordCleanupFile='/pastefromword.js';
...
CKEDITOR.on('InstanceRady',函数(ev){
/**
*“粘贴”事件,用于对所有文本应用“从Word筛选粘贴”。
*
*pastefromword插件将仅处理具有指示符号的文本
*它来自Word。使用此钩子将所有粘贴的文本视为
*它来自于文字。
*
*此方法是中代码的稍微修改版本
*plugins/pastefromword/plugin.js
*/
ev.editor.on('paste',函数(evt){
var数据=evt.data,
editor=evt.editor,
内容;
/**
*“PasteFromWordOccessed”是在custom中设置的自定义属性
*pastefromword.js,这样就不会对内容进行两次过滤
*实际上来自Word,我知道这是一个肮脏的黑客。
*/
如果(editor.pasteFromWordOccessed){
//重置属性并退出粘贴事件
editor.pasteFromWordOccessed=0;
返回;
}
var loadRules=函数(回调){
var isLoaded=CKEDITOR.cleanWord;
如果(已加载){
回调();
}
否则{
加载(CKEDITOR.config.pasteFromWordCleanupFile,回调,null,false,true);
}
返回!已加载;
};
内容=数据['html'];
//如果html标记不存在,则无需过滤文本,因此执行正则表达式
//测试html标记。

如果(内容&(/我的解决方案现在出现在这个博客条目中:

评论一个老问题: 目前的问题不仅仅是CKEditor中的单词清理。
当你通过javascript api请求剪辑板内容时,浏览器会做什么也是一个问题。IE、FF、Safari等之间有很大的不同。通常非IE浏览器会自己清理HTML,而不是将HTML交给浏览器。这样就删除了很多格式。

我发现这一点,因为我正在尝试解决类似的问题。你如何避免它剥离所有内容,即保留字体和字体颜色?那么你想要什么?Kevin,在你的自定义config.js中,设置“config.pasteFromWordRemoveFontStyles”设为false。查看其他设置。随机,我不知道该网站存在。谢谢,我没有看到该配置设置!而且,我现在似乎总是使用“从word粘贴”筛选,尽管我没有彻底测试过,只是使用c.extraPlugins=“自动增长,调整大小,粘贴自word”;也许把它作为一个额外的插件添加会使它始终生效?很棒的键盘!简单而紧凑。谢谢你发布你的解决方案。这是一个很好的进步。仍然有一些内联样式,但它比默认的Ctrl+V要好得多。嘿@Keyvan你应该把代码放在你的答案中以防万一。我编辑了to addDownvoted——答案只是一个链接。请将该链接的内容放入此答案中。使用StackOverflow解决此问题。同时,linkrot会发生,因此,意味着任何只包含链接的答案都不是好答案。另请参阅: