Javascript 如何防止TinyMCE将CDATA添加到<;脚本>;标记并从注释中删除<;风格>;标签?

Javascript 如何防止TinyMCE将CDATA添加到<;脚本>;标记并从注释中删除<;风格>;标签?,javascript,html,css,tinymce,Javascript,Html,Css,Tinymce,让我们把允许内容进入Web编辑器的问题放在一边;我完全了解他们 我想要的是在文本内容中允许和元素,问题是,每当我这样做时,TinyMCE都会将它们更改为: <style><!-- th{width:80px} --></style> 但是我似乎找不到一种方法来阻止TinyMCE禁用和元素。您可以尝试更改TinyMCE.min.js ,f.addNodeFilter("script,style",function(e,t){function n(e){retu

让我们把允许
内容进入Web编辑器的问题放在一边;我完全了解他们

我想要的是在文本内容中允许
元素,问题是,每当我这样做时,TinyMCE都会将它们更改为:

<style><!-- th{width:80px} --></style>

但是我似乎找不到一种方法来阻止TinyMCE禁用
元素。

您可以尝试更改TinyMCE.min.js

,f.addNodeFilter("script,style",function(e,t){function n(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}for(var r=e.length,i,o,a;r--;)i=e[r],o=i.firstChild?i.firstChild.value:"","script"===t?(a=i.attr("type"),a&&i.attr("type","mce-no/type"==a?null:a.replace(/^mce\-/,"")),o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")):o.length>0&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")}),f.addNodeFilter("#comment",function(e){for(var t=e.length,n;t--;)n=e[t],0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=n.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))})
代码><代码>f.f.addNodeFilter(“脚本,风格”,功能(e,t)函数(e,t)函数(e)函数n(e)函数n(e)函数n(e)函数n(e)返回e.ret返回e.rep返回e.rets.rep(返回e)返回e.rep替换(////(/(/(///(//(//(////////((//)g,,““““““““““““““\n,”””””””””””””””””””””””””””))。换换换换。替换(//^^[[码码码码码码码码码码码码码码码码码码码码码码码码码)及及(或或上述上述两两两两两两两两名),f。换换换换换换换换换下一个警察警察警察警察警察警察警察警察=e[r],o=i.firstChild?i.firstChild.value:,“script”==t?(a=i.attr(“类型”),a&&i.attr(“类型”,“mce并并没有任何类型的mce并并没有任何类型的mce并并没有任何类型的mce并没有任何类型“========””,“mce并没有任何类型的mce并并并没有没有任何类型的,”若若一个a?一个a?null:一个a?null:一个null:一个a.替换(//,,,,)0.0长度>0 0和(i.第一儿童.值=“////,,:o.长度>0和(i.0和和(i.第一儿童并并并并(i.第一儿童.值值值“”)),,,,,,,,,,,,,,,))一个a.一个a.一个a.一个a.一个a.对一个a.一个a.以及(以及(以及(i.第一第一儿童.值值值值)的),),一)、f.一个a.一个a.一个a.......“&&(n.name=”#text“,n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))})
请从文件中查找并删除上面的代码行。

当您存储tinymce内容时,只需从输出中删除这些标记,如下所示:

$tinyOutput = str_replace(array("// <![CDATA[", "// ]]>"), array("", ""), $_POST['tinyOutput']);
$tinyOutput=str\u replace(数组(“/”),数组(“,”),$\u POST['tinyOutput']);

…然后保存到db..

如果可以避免的话,我建议避免对第三方库进行任何直接自定义。相反,我在初始化期间向编辑器序列化程序添加了自定义节点筛选器,方法是将以下内容添加到传递到tinymce构造调用的配置对象中:

init_instance_callback : function(editor) {
    // jw: this code is heavily borrowed from tinymce.jquery.js:12231 but modified so that it will
    //     just remove the escaping and not add it back.
    editor.serializer.addNodeFilter('script,style', function(nodes, name) {
        var i = nodes.length, node, value, type;

        function trim(value) {
            /*jshint maxlen:255 */
            /*eslint max-len:0 */
            return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n')
                    .replace(/^[\r\n]*|[\r\n]*$/g, '')
                    .replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi, '')
                    .replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g, '');
        }
        while (i--) {
            node = nodes[i];
            value = node.firstChild ? node.firstChild.value : '';

            if (value.length > 0) {
                node.firstChild.value = trim(value);
            }
        }
    });
}
init_实例_回调:函数(编辑器){
//jw:这段代码大量借用了tinymce.jquery.js:12231,但经过修改后,它将
//只需移除转义项,而不是将其重新添加。
editor.serializer.addNodeFilter('脚本,样式',函数(节点,名称){
变量i=节点。长度、节点、值、类型;
功能微调(值){
/*jshint maxlen:255*/
/*eslint最大透镜:0*/
返回值。替换(/()/g,“\n”)
.replace(/^[\r\n]*.[\r\n]*$/g',)
.replace(/^\s*(()?\s*\/\/\s*\]\]>(->)?\/\/\/\s*(->)?\\/\]\]>\\/\*\s*-->\s*\/\\\\/\\\\*\s*->\s*$/g',);
}
而(我--){
节点=节点[i];
value=node.firstChild?node.firstChild.value:“”;
如果(value.length>0){
node.firstChild.value=修剪(值);
}
}
});
}

希望这将有助于其他陷入困境的人。

对于我来说,删除了以下禁用脚本标记格式的代码:

,o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")
,o.length>0&(i.firstChild.value=“/”)
对于样式标记上的格式设置,应删除:

&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")
&(i.firstChild.value=”“)

您可以尝试使用
代替
您是否找到了如何删除tinyMCE中的from样式标记?据我所知,tinyMCE似乎生成XHTML并将样式内容包装在注释中,以防止任何XML解析器无法解析内容(因为所有浏览器都支持注释语法).Edit:您是否尝试过使用
cleanup:false
?@BenRacicot为什么要从样式标记中删除?我在WordPress中包含的TinyMCE中遇到过同样的问题。尽管我能够编写一个PHP函数,将某些标记从编辑器中删除(类似于您在这里看到的),我发现注释代码总是在那里。我不知道如何摆脱它。但我想我知道它为什么在那里。我相信这是为了防止标记中的代码被包装在段落标记中,就像TinyMCE在默认情况下为每个换行符所做的那样。所以我把注释代码留在那里,因为我的脚本在fr上仍然工作正常ont end.@naimshaikh Hey Naim,我没有试过,因为你没有指定它是否有效。我不愿意删除缩小的脚本,但会在周一尝试。这会导致类型属性出现问题。它现在将
mce-
添加到所有类型属性中。它似乎会从样式标记中删除
,我更喜欢这样A因为我不想改变
tinymce.min.js
code.谢谢。效果很好,真不敢相信我是第一个投票支持这样“做对了”答案的人
,o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")
&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")
&lt;style>th{width:80px}&lt;/style>
&lt;script>
$.address.unbind();
&lt;/script>