Javascript 内的 CFML

CFML within Javascript

我正在处理别人编写的代码。据我所知,它不正确,但我没有看到任何错误,所以现在我不确定自版本 8 以来是否发生了某些变化。

代码如下 & 我想知道你是否可以将 CFML 与 Javascript 代码一起使用

<script language="JavaScript" type="text/JavaScript" > 
    var x = 2;
    <cfif url.new = true>var x = 5 </cfif>
</script>

您不能在 JavaScript 中使用 CFML 本身,因为 ColdFusion 在服务器上运行,而 JavaScript 在客户端上运行。但是,您需要考虑 CFML 的工作原理,CFML 代码在服务器上 处理 ,然后将输出传递给客户端。因此,就您而言,您提供的示例是有效的。 CFML 将在服务器上进行处理,并生成两个输出之一并将其传回客户端。

注意:您没有包含所有代码,因此我假设在此之前还有其他代码检查 url.new 变量是否存在。否则,如果 new 参数未在 URL 中传递,则会抛出该变量不存在的错误。

如果 URL 不包含名为 "new" 的参数; http://www.yourdomain.com/somepage
或者 "new" 参数确实存在,但它的值不被认为是 "true"; http://www.yourdomain.com/somepage?new=false
那么输出将是:

<script language="JavaScript" type="text/JavaScript" > 
    var x = 2;
</script>

注意生成的JavaScript中"x"的值为2.

如果 URL 确实包含一个名为 "new" 的参数并且它的值被认为是 "true"; http://www.yourdomain.com/somepage?new=true
那么输出将是:

<script language="JavaScript" type="text/JavaScript" > 
    var x = 2;
    var x = 5 
</script>

请注意,生成的 JavaScript 中 "x" 的值将为 5,但是行尾也缺少一个分号,因此您的示例可能会抛出 JavaScript错误。

请注意,我还提到了 "if the value is considered to be true or false"。在ColdFusion中,布尔表达式、True、非零数和字符串"Yes"、"1|"、"True"是等价的;和 False、0 以及字符串 "No"、"0" 和 "False" 是等价的。布尔计算不区分大小写。例如,True、TRUE 和 true 是等价的。因此,在您的示例中,http://www.yourdomain.com/somepage?new=1 也将被视为 true。

好吧:您并没有真正按照您建议的方式使用 "CFML with Javascript code"。您拥有的是一些文本,而 CFML 恰好(有条件地)生成了一些其他文本。

它生成的文本将是以下之一:

<script language="JavaScript" type="text/JavaScript" > 
    var x = 2;
    var x = 5 
</script>

<script language="JavaScript" type="text/JavaScript" > 
    var x = 2;

</script>

取决于值 URL.new。无论哪种方式,在 CFML 服务器对其进行任何输入时,它都只是文本。

然后该文本被发送回网络服务器,网络服务器将其发送回请求它的浏览器。浏览器然后将文本解释为 HTML,并且在 HTML 中是一些被告知将其视为 JavaScript 的文本。它确实如此(将其视为 JavaScript,并运行它)。

但这已经很久没有与 CFML 服务器有任何关系了。所有 CFML 服务器都会生成文本。

这可能有助于您理解 request/response 生命周期相对于 CFML 服务器:“The CFML request/response process

我在这里的代码中发现了一些错误 - 这就是我想要的:

<script> 
    var x = 2;
    <cfif structKeyExists(URL, "new") AND URL.new IS true>x = 5;</cfif>
</script>
  1. 我添加了一个检查以查看变量 'new' 是否存在于 URL 范围内 - 以防万一您没有在其他地方做过它。

  2. 如果您的 CFIF 语句在您应该使用 EQ 或 IS 时使用 =。我不知道为什么 CFIF 逻辑的语法与您可能真正期望的不同,而且我并不是 100% 完全了解 IS 和 EQ 之间的区别。

  3. 您已经声明了 VAR x=2,因此您不需要再次定义该变量 - 严格的 JavaScript 引擎可能会在此处抛出错误。已经定义好了,直接给它赋值即可。

  4. 如前所述,您在 CF 注入行的末尾缺少分号。

您应该呈现的代码是:

<script> 
    var x = 2;
    x = 5;
</script>

除此之外,您尝试做的事情是有效的。我的工作中经常有一个 CF > JavaScript 'bridge' - 只要你明白一个是 运行 在编译时,在页面被传递到 web 服务器之前,另一个 运行s 在客户端计算机上 运行 时间。