我可以在JavaScript中使用ColdFusion标记吗?例如:
<script language="javascript" type="text/javascript">
function validateUser() {
var userName = document.getElementById("username");
<CFQUERY DATASOURCE="mydatasourcename" NAME="getUser">
select USER_ID,COUNT(*) from user u
where u.firstname=userName;
</CFQUERY>
<cfif getUser.recordCount EQ 0>
<!--- Show eroor message --->
<cfelse>
<!--- Assign userId to hidden field --->
document.getElementById("userid").value=#USER_ID#
</cfif>
}
</script>
<input type='textbox' name='username' id='username' onblur=validateUser()/>
<input type='hidden' name='userid' id='userid'/>
当最终用户输入用户名时,我想检查数据库中是否存在此用户名。如果它存在,我必须将用户标识保留在隐藏字段中,否则抛出错误。
我这样做是否正确?如果错了,你能建议正确的方法吗?
答案 0 :(得分:9)
长版:http://blog.adamcameron.me/2012/10/the-coldfusion-requestresponse-process.html
简短版本:不,你做得不对。
中型StackOverflow友好版本:CFML代码在请求的服务器端运行; JavaScript在客户端浏览器上运行。需要明确的是:ColdFusion服务器根本不会直接与浏览器通信:中间有一个Web服务器。客户端浏览器请求文件,Web服务器配置为将.cfm请求传递给ColdFusion服务器,并运行其代码,将生成的字符串(例如:HTML网页)返回给Web服务器,然后将其返回给浏览器。该HTML可能包含JavaScript(内联或外部请求),然后浏览器将执行该操作。
希望你可以看到服务器端代码和客户端代码之间没有直接的交互。
您可以使用两个设施来让两个设备异步通信。首先:CFML代码写出文本,但该文本可以是JS,浏览器在最终收到它时运行。类似的东西:
<cfset msg ="G'day world">
<script>alert("<cfoutput>#msg#</cfoutput>");</script>
CFML服务器处理完毕后,发送回浏览器的内容是:
<script>alert("G'day world");</script>
这样,如果服务器端代码“写出”数据作为其响应的一部分,则可以在客户端进程中使用服务器端代码数据。上面的例子非常简单,并不是解决这个问题的“良好实践”方式,但它证明了这种技术。
如果您需要在客户端上使用JS代码与服务器进行通信,那么您唯一的(实际)资源就是向服务器发出一个AJAX请求,将其传递给客户端信息以进行进一步的服务器端处理。让服务器回应一些东西。你的问题范围在于解释如何最好地解决这个问题,但是有大量的信息要做到这一点。
CFML为你提供了一些编写HTML和JS的“向导”来促进这一点,但总的来说这是实现这一目标的一种不好的方法,所以我不推荐它。但是,我将指出一个项目,它为内置的CFML魔法提供HTML / JS / CSS解决方案:https://github.com/cfjedimaster/ColdFusion-UI-the-Right-Way
回到简短的回答:不,你不能做出你正在做的事情,但是如果你修改你的方法,你就可以达到你想要的目的。
您需要注意的是通过AJAX将表单字段传递回服务器(jQuery使这非常容易),并在单独的请求中运行您的<cfquery>
代码。
如果你读到我从一开始就提到的博客文章(透露:我写了它,但我是专门针对这样的情况写的),那么你就会理解为什么。
如果你在处理部分解决方案时遇到困难:提出另一个问题,更专注于你所坚持的任何部分。