将JavaScript索引传递给ColdFusion

Geo*_*phy 0 javascript coldfusion

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

值+(indx + 1)+不能转换为数字.

这是循环

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

Pet*_*ton 5

您的错误消息完全准确:"该值+ (indx + 1) +无法转换为数字."

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

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

JavaScript(这就是这个,而不是jQuery)在浏览器中发生,而ColdFusion在服务器上发生.

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

它们不像您尝试的那样交错 - 它们仅通过HTTP请求/响应(或通过WebSockets/etc)进行交互.

简单来说:

  1. 浏览器使用HTTP请求请求页面.
  2. CF服务器编译并执行输出文本的CFML代码.
  3. 该文本通过HTTP响应发送到客户端.
  4. 然后,浏览器将该文本解释为HTML/CSS/JS/etc - 完全不同于正在处理的CFML代码的操作.

有关客户端/服务器和HTTP请求/响应的更完整说明,请参阅讨论该主题的博客文章.


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

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>
Run Code Online (Sandbox Code Playgroud)


2)解决CF端的循环,这样就可以获得多个调用CloneAvgPopulationItem函数的JS行.

例如:

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


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