将JavaScript索引传递给ColdFusion

时间:2014-04-05 18:13:00

标签: javascript coldfusion

我在继承的一些代码上遇到此错误。我正在运行cf9和jQuery 1.7。

  

值+(indx + 1)+无法转换为数字。

这是循环

    for (var indx = 0; indx < avgPopulationRecordsCount; indx++) {
    CloneAvgPopulationItem(indx, '#rc.qGetAP.ID[' + (indx + 1) + ']#');
    }

2 个答案:

答案 0 :(得分:5)

您的错误消息完全准确:“无法将值+ (indx + 1) +转换为数字。”

您的变量rc.qGetAP.ID是一个查询列(实际上是一个数组),并且您尝试使用字符串(如单引号所示)对其进行索引,CF正在尝试将其转换为行号,但它无法将文本+ (indx + 1) +翻译成数字。

这里的问题是代码更少,更多的是了解正在发生的事情:

在服务器上发生ColdFusion时,浏览器中会出现JavaScript(这就是jQuery),而不是jQuery。

这是两个独立且不同的环境。

它们没有按照您尝试的方式进行交错 - 它们仅通过HTTP请求/响应(或通过WebSockets /等)进行交互。

简而言之:

  1. 浏览器使用HTTP请求请求页面。
  2. CF服务器编译并执行输出文本的CFML代码。
  3. 该文本通过HTTP响应发送给客户端。
  4. 浏览器然后将该文本解释为HTML / CSS / JS /等 - 完全不同于正在处理的CFML代码的操作。
  5. 有关客户端/服务器和HTTP请求/响应的更完整说明,here is a blog post discussing the subject


    一旦了解了此过程的工作原理,解决方案就是:

    1)首先从CF生成所有相关的JS变量(所以你的Ids被翻译成JS数组),你有一行代码来调用JS里面的JS函数CloneAvgPopulationItem循环。

    例如:

    <script type="text/javascript">
        var AvgPopIds = <cfoutput>#serialiseJson(ValueArray(rc.qGetAP.ID))#</cfoutput>;
    
        for (var index = 0; index < avgPopulationRecordsCount; index++) {
        CloneAvgPopulationItem(index, AvgPopIds[index]);
        }
    </script>
    


    2)解决CF端的循环,因此您可以获得多个调用CloneAvgPopulationItem函数的JS行。

    例如:

    <script type="text/javascript">
        <cfoutput query="rc.qGetAP">
            CloneAvgPopulationItem(#rc.qGetAP.CurrentRow#,'#JsStringFormat(rc.qGetAP.Id)#');
        </cfoutput>
    </script>
    


    重要的是声明:不要只使用这些代码示例,而是阅读并理解上面链接的关于JavaScript和ColdFusion运行位置的文章 - 整个HTTP请求/响应过程是一个重要的理解和意愿避免将来遇到类似的问题。

答案 1 :(得分:0)

看起来您正在使用Javascript混合<cfscript>。首先在服务器上处理ColdFusion,然后生成生成的Javascript。它看起来像你想要的更接近

<cfoutput>
<script type="text/javascript>


<cfloop from="0" to="#avgPopulationRecordsCount#" index="indx">
    CloneAvgPopulationItem(#indx#, '#rc.qGetAP.ID[indx]#');
</cfloop>

</script>
</cfoutput>

根据评论进行更新

在服务器上运行上述代码后,网页上将显示以下内容。

<script type="text/javascript>

    CloneAvgPopulationItem(1, 'someInfo');
    CloneAvgPopulationItem(1, 'moreInfo');
    CloneAvgPopulationItem(1, 'yetmoreInfo');
    ...

</script>