我正在使用最新/当前的 TinyMCE 编辑器 ( <script type="text/javascript" src='https://cdn.tinymce.com/4/tinymce.min.js'></script>),但它似乎无法显示<svg>. 我在数据库中保存了一些 HTML,其中包含一些<svg>. 在 TinyMCE 中加载时,它不显示。
这是一个已知问题(我已经搜索过但没有找到太多)?任何解决方法?
TinyMCE 去除空的和无效的标签。您可以通过以下方式解决
将 ' ' 添加到每个空元素:
svg.find('*').each(function() {
if (!$(this).html()) {
$(this).text(' ');
}
});
Run Code Online (Sandbox Code Playgroud)
这里 svg 是你的 jQuery 包装的 svg 元素。
extended_valid_elements: "svg[*],defs[*],pattern[*],desc[*],metadata[*],g[*],mask[*],path[*],line[*],marker[*],rect[*],circle[*],ellipse[*],polygon[*],polyline[*],linearGradient[*],radialGradient[*],stop[*],image[*],view[*],text[*],textPath[*],title[*],tspan[*],glyph[*],symbol[*],switch[*],use[*]"
Run Code Online (Sandbox Code Playgroud)
*注意我只添加了与我的案例相关的元素。
小智 6
我尝试了 Koen 的第一个建议,它适用于现有的 SVG 内容(我在回调中添加了它setup)。然而,当将 HTML 粘贴到源代码编辑器然后确认对话框时,它仍然会过滤掉 SVG 标签。
在深入研究 TinyMCE 的源代码以查看这些元素实际被删除的位置(它在类中DomParser)之后,我发现了该类的一个未记录的编辑器设置Schema,该设置指定允许为空而不被删除的标签。唯一烦人的是你不能使用它添加到现有列表中,你只能覆盖它。因此,在设置它时,您还必须列出默认情况下其中包含的标签。在初始化 TinyMCE 时提供给它的设置中使用它:
// First the list of tags that it normally knows about by default:
non_empty_elements: "td,th,iframe,video,audio,object,script,pre,code,area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source,wbr,track"
// Now we add tags related to SVGs that it doesn't normally know about:
+ "svg,defs,pattern,desc,metadata,g,mask,path,line,marker,rect,circle,ellipse,polygon,polyline,linearGradient,radialGradient,stop,image,view,text,textPath,title,tspan,glyph,symbol,switch,use",
Run Code Online (Sandbox Code Playgroud)
这样,这些 SVG 标签就不应该被过滤掉,因为它们是空的 - 只要它们通常也有效,例如通过设置extended_valid_elements上面建议的 Koen 或允许所有元素(不推荐,因为它会让您容易受到 XSS 攻击) :
extended_valid_elements: "*[*]"
Run Code Online (Sandbox Code Playgroud)
请注意,这适用于我的 TinyMCE 4.5.8 版本。由于此设置未记录在案,因此在当前或未来版本中可能不再有效。此外,他们可能已经调整了我在以后的版本中覆盖的默认列表。在其源代码中查找nonEmptyElementsMap和shortEndedElementsMapinSchema.js以查找您版本中的默认列表(两个列表合并)并注意,其中标签由空格分隔,但是当您自己提供列表时,列表由逗号分隔(无论出于何种原因) )。
接缝是 TinyMCE 删除它,因为它是一个空标签: http://world.episerver.com/forum/developer-forum/-EPiServer-75-CMS/Thread-Container/2015/1/tinymce-and-svgs /
您也许可以在 init 中使用它:
extended_valid_elements : "svg[*]",
Run Code Online (Sandbox Code Playgroud)
它可以与其他空标签等一起使用,但从未尝试过 SVG。
从我链接到的论坛帖子:
好的,我对 TinyMCE 进行了一些调试,问题似乎是 svg 元素被检测为空,因此被删除。
不幸的是,没有配置方法可以更改此行为,但有一些解决方法。
svg 元素始终有一个名称属性:
<svg name="something"svg 元素始终具有 data-mce 属性:
<svg data-mce-something="something"在 svg 元素中包含一些文本内容:
<svg> </svg>使用这些技术,我可以成功地将内联 svg 存储在 xhtml 属性中