2

更新:报告错误,感谢投票https://tracker.adobe.com/#/view/CF-4200017

我们正在从 ColdFusion 10 迁移到 2016。看来兼容性的唯一障碍是图表系统的变化。对于整页请求,这通常没问题,但在某些情况下,我们会生成 png 格式的图表,捕获生成的内容并去除同时生成的一些 js,并以 json 格式返回结果作为页面更新的一部分。我们遇到的一个问题是 CF 强制请求响应中的 javascript 与输出的实际内容分开,导致 json 响应无效。

似乎正在使用 cfhtmlhead 标记之类的方法插入 js,它在其中查找 head 标记的响应,如果找到则在其中插入代码,否则它只是将代码添加到整个请求中。对于应该是 json 的响应,这显然是一个问题。

我已经尝试在图表生成之前调用刷新,但随后出现错误“ColdFusion 无法将您指定的文本添加到输出流。这可能是因为您已经在模板中使用了 CFFLUSH 标记或缓冲输出已打开关闭”当 cfchart 代码被击中时。

关于如何告诉 CF 将代码内联或以其他方式重置计划插入请求输出的内容的任何建议?

例子:

<cfsavecontent variable="ignore">
<cfchart format="png">
    <cfchartseries type="Bar" label="Numbers">
        <cfchartdata item="First" value="1">
        <cfchartdata item="Second" value="2">
    </cfchartseries>
</cfchart>
</cfsavecontent>

<cfcontent reset="true" />
test

结果:

<script type="text/javascript">/* <![CDATA[ */_cf_loadingtexthtml="<img alt=' ' src='/cf_scripts/scripts/ajax/resources/cf/images/loading.gif'/>";
_cf_contextpath="";
_cf_ajaxscriptsrc="/cf_scripts/scripts/ajax";
_cf_jsonprefix='//';
_cf_websocket_port=8579;
_cf_flash_policy_port=1243;
_cf_clientid='1D0DA2C606EC323ABBECA5B29A016CF0';/* ]]> */</script><script type="text/javascript" src="/cf_scripts/scripts/ajax/messages/cfmessage.js"></script>
<script type="text/javascript" src="/cf_scripts/scripts/ajax/package/cfajax.js"></script>
<script type="text/javascript" src="/cf_scripts/scripts/chart/cfchart-server.js"></script>

test

cfdocument 标签中使用的图表甚至是一个问题(只需将 cfsavecontent 标签替换为 cfdocument filename="test.pdf" 进行测试)。图表被添加到磁盘上的文档中,但随后 js 在请求响应中得到输出,杀死了我们的 ajax 请求,这些请求旨在带回下载链接和其他数据。

4

2 回答 2

0

找到了一种解决方法,即在线程中执行图表生成。然后输出只是基本图表内容而不是头部内容。

于 2017-10-13T21:11:13.733 回答
0

这可以通过以下任一选项来解决,用于重置 CF 自动插入的内容<head>

<cfcontent reset="true" resethead="true">

或者

<cfset getPageContext().getCFOutput().clearHeaderBuffers()>

这些方法没有记录(因此可能会在未来的版本中更改——尽管不太可能),并且这些方法不太可能移植到其他 CFML 引擎。

于 2020-01-15T17:26:19.697 回答