是否可以使用JavaScript将变量分配给客户端范围?更具体地说,我试图在从AJAX调用返回后分配一个值。
我知道ColdFusion是在服务器端运行的,而客户端运行的是JavaScript,但随着AJAX的激增,我很好奇这样的事情是否可行。谢谢。
答案 0 :(得分:4)
Peter Boughton在他的概念中几乎已经死了,但你问如何编写客户端变量,他没有测试他的代码。此外,您尝试做的事情将被称为ClientFacade,因此我编写(并测试)了ClientFacade CFC和伴随JavaScript。请注意,我正在使用jQuery,因为没有它我永远不会去任何地方。 ;)
<强> ClientFacade.cfc:强>
<cfcomponent output="false"
hint="acts as a remote facade for the client scope">
<cffunction name="set" output="false" access="remote"
returntype="boolean" hint="sets a value into the client scope">
<cfargument name="name" type="string" required="true"/>
<cfargument name="val" type="any" required="true"/>
<!--- you should sanitize input here to prevent code injection --->
<cfscript>
try {
client[arguments.name] = arguments.val;
return(true);
}catch (any e){
return(false);
}
</cfscript>
</cffunction>
<cffunction name="get" output="false" access="remote" returntype="any"
hint="gets a value from the client scope">
<cfargument name="name" type="string" required="true"/>
<cfargument name="defaultVal" type="any" required="false"
default=""/>
<!--- you should sanitize input here to prevent code injection --->
<cfscript>
if (structKeyExists(client, arguments.name)){
return(client[arguments.name]);
}else{
if (len(trim(arguments.defaultVal)) eq 0){
return('');
}else{
return(arguments.defaultVal);
}
}
</cfscript>
</cffunction>
</cfcomponent>
<强> test.cfm:强>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js">
</script>
foo:<input type="text" name="foo" id="foo"/>
<button id="setValue">Set Value</button>
<button id="alertValue">Alert Value</button>
<script type="text/javascript">
$(document).ready(function(){
//attach functionality to our alert button
$("#alertValue").click(function(e){
var clientVal = 'initialdata';
$.getJSON(
'clientFacade.cfc',
{method:"get", returnFormat:"json", name:"foo"},
function(d){
clientVal = d;
alert(clientVal);
}
);
e.preventDefault();//prevent the button from doing anything else
});
//attach functionality to our set button
$("#setValue").click(function(e){
var success = false;
var valu = $("#foo").val();
$.getJSON(
'clientFacade.cfc',
{
method:"set",
returnFormat:"json",
name:"foo",
"val":valu
},
function(d){
success = eval(d);
if (!success){
alert('Was not able to set the client var :(');
}
}
);
e.preventDefault();//prevent the button from doing anything else
});
});
</script>
我认为这就是你想要的一切。如果我错过了什么,请告诉我。
答案 1 :(得分:2)
我不知道关于CF的任何事情,但通常这是通过向服务器发布名称/值对来完成的,其中服务器获取该值并将其粘贴到变量中。如果您愿意,也可以使用GET,并且可以使用AJAX执行这两项操作。另一个愚蠢的黑客是在javascript中做这样的事情:
var img = new Image(); img.src =“http://myserver.com/something.cfm?name=value&anothername=anothervalue”;
之后,服务器将执行GET并将这两个值传递给服务器。没有图像会显示给客户端,因为:a)你没有把它添加到DOM b)它实际上不是一个图像。
答案 2 :(得分:1)
使用CFAJAXPROXY(CF8中的新增功能),并在CFC上调用一个方法,在客户端范围内设置var。
答案 3 :(得分:1)
雷·卡姆登也提供了一个很好的答案: http://www.coldfusionjedi.com/index.cfm/2009/2/12/Ask-a-Jedi-Using-ColdFusion-Ajax-to-set-Session-Variables
答案 4 :(得分:0)
使用jQuery,然后您可以使用getJSON()
方法将数据发送回CF Web服务(即具有access="remote"
的函数),并将结果再次返回给JS。
使用CF8的returnformat="json"
函数,这很简单。
(对于早期版本,您需要使用cfjson(或类似)来转换数据。)
作为一个快速(并且完全未经测试)的例子......
<cffunction name="MyRemoteFunc" returntype="Struct" access="remote" returnformat="json">
<cfargument name="Name" type="String"/>
<cfargument name="Birthday" type="Date"/>
<cfset Session.UserDetails.Name = Arguments.Name />
<cfset Session.UserDetails.Age = DateDiff('yyyy',Now(),Arguments.Birthday) />
<cfset Session.UserDetails.Id = RandRange(1,100) />
<cfreturn Session.UserDetails />
</cffunction>
<script type="text/javascript">
function setUserDetails(name,birthday)
{
$j.getJSON
( 'http://mydomain/stuff/remote.cfc?method=MyRemoteFunc'
, { name:arguments.name , birthday:arguments.birthday }
, setUserDetailsResponse
);
}
function setUserDetailsResponse( result )
{
alert( 'Hello '+result.name+', you are '+result.age' years old and your Id is '+result.id+'.' );
}
</script>