SERIESLABEL或ITEMLABEL中存在单引号或双引号,从而在CFCHART中出现错误

时间:2017-01-26 14:13:18

标签: json coldfusion coldfusion-11 cfchart

我在我的应用程序中使用CF饼图。但它的工作很奇怪。以下代码是图表代码,它给出了错误。它甚至不显示图表。我知道,这是由于查询列col1的值中存在双引号。

<cfoutput>
    <script type="text/javascript">
        function Navigate(test){
            alert(test);
        }
    </script>

<cfset testquery = queryNew("col1,Col2", "varchar,varchar") >
<cfset queryAddRow(testquery, 1)>
<cfset querySetCell(testquery, "col1", 'This is the "first" row') >
<cfset querySetCell(testquery, "Col2", 5000) >
<cfset queryAddRow(testquery, 1)>
<cfset querySetCell(testquery, "col1", 'This is the second row') >
<cfset querySetCell(testquery, "Col2", 2500) >
<cfset queryAddRow(testquery, 1)>
<cfset querySetCell(testquery, "col1", 'This is the third row') >
<cfset querySetCell(testquery, "Col2", 8500) >

    <CFCHART Format="Html"  CHARTWIDTH="600" CHARTHEIGHT="650" TITLE="Pie Chart in CF11" URL="javascript:Navigate('$SERIESLABEL$')">
        <CFCHARTSERIES TYPE="pie" COLORLIST="##CA5940,##6FCF42,##4286CF" >
        <CFLOOP FROM="1" TO="#testquery.RecordCount#" INDEx="i">
            <CFCHARTDATA ITEM="#testquery.col1[i]#" VALUE="#testquery.Col2[i]#">
        </CFLOOP>
        </CFCHARTSERIES>
    </CFCHART>
</cfoutput>

enter image description here

我已经在viewsource中检查了图表的JSON,没关系。但代码给出了上述错误。所以不确定为什么会出错。没有双引号,代码按预期工作,但我需要双引号,它会影响应用程序,如果我删除它。

我还尝试将双引号替换为单引号,在这种情况下,图表正在显示,但是如果我们点击第一行区域,它会在控制台中给出相同的错误。

enter image description here

所以使用引号是这里的主要问题。但我需要上面的代码来显示图表,在点击区域时,它应该显示相应的标签。

我不确定我是否遗漏了某些内容,或者代码中有任何错误。

1 个答案:

答案 0 :(得分:4)

您是否尝试过转义JSON字符串中的引号?

就像这样:

<cfset querySetCell(testquery, "col1", 'This is the \"first\" row') >

我在trycf.com上创建了示例代码的要点,它似乎正常工作

http://trycf.com/gist/e3321edb3481411078b75ad187cae52b/acf11?theme=monokai

我也在我们的ColdFusion 11服务器上尝试了完全相同的代码,它也能正常工作。那么你是说你的示例代码不起作用还是你说你的实际代码仍然无效?如果它是您的实际代码,则必须在您的示例中显示其他内容。如果您的数据来自数据库,那么您需要确保在ColdFusion正在解析它时正确转义这些字符。

现在您已经了解了角色需要如何转义,您可以使用评论中的ScottJibben建议,只需致电JSStringFormat()即可为您逃脱这些角色。

<CFCHARTDATA ITEM="#JSStringFormat(testquery.col1[i])#" VALUE="#testquery.Col2[i]#">