CefSharp执行JS向TinyMCE传入HTML时字符串转义失效问题
问题原因
之前三种方案失效的核心问题有两个:
- 错误使用
HttpUtility.HtmlEncode处理JS传参:该方法仅适用于HTML上下文的字符转义,会将</>/引号等字符转义为</>/"这类HTML实体,TinyMCE接收到这类内容后会把标签识别为纯文本,无法正常渲染。 - JS字符串拼接逻辑错误:要么把整个JS语句做了JS编码导致语句本身失效,要么没有正确转义原始HTML里的换行、单引号、反斜杠等JS语法特殊字符,直接拼接会触发JS语法错误,代码根本无法执行。
可行方案
方案1:正确使用JS字符串编码(轻量实现)
只需要对传入setContent的HTML参数本身做JS字符串转义,不要转义外层JS逻辑,也不要对HTML内容做HtmlEncode处理,代码如下:
Dim browser As ChromiumWebBrowser Dim strHTMLPageCode As String ' 存储原始待加载HTML,无需提前转义 ' 第二个参数传True会自动为转义后的字符串包裹双引号,无需手动添加引号 Dim escapedContent = HttpUtility.JavaScriptStringEncode(strHTMLPageCode, addDoubleQuotes:=True) Dim jsCode = $"tinymce.activeEditor.setContent({escapedContent});" browser.GetMainFrame.ExecuteJavaScriptAsync(jsCode)
方案2:CefSharp原生参数传递(最稳妥,零转义问题)
如果不想手动处理转义逻辑,可以直接用CefSharp提供的脚本执行传参重载,由框架自动完成参数序列化,完全避免字符串拼接导致的语法错误:
Dim browser As ChromiumWebBrowser Dim strHTMLPageCode As String ' 存储原始待加载HTML ' 直接将HTML作为参数传入匿名函数,CefSharp自动处理序列化转义 browser.GetMainFrame.EvaluateScriptAsync( "function(loadContent) { tinymce.activeEditor.setContent(loadContent); }", {strHTMLPageCode} )
注意事项
- 禁止对传入TinyMCE的HTML内容做
HtmlEncode处理,setContent方法原生接收原始HTML格式字符串,编码后会导致标签失效。 - 禁止对完整JS执行语句做
JavaScriptStringEncode,该方法仅用于转义JS代码里的字符串参数值,编码完整语句会导致JS语法被破坏。
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

