[英]Assign ColdFusion Client Variables Using Javascript
是否可以使用JavaScript將變量分配給客戶端范圍? 更具體地說,我正在嘗試從AJAX調用返回值后分配一個值。
我知道ColdFusion在服務器端運行,而JavaScript在客戶端運行,但是隨着AJAX的泛濫,我很好奇這樣的事情是否可能實現。 謝謝。
彼得·布頓(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>
我想這就是您想要的一切。 讓我知道我是否錯過任何事情。
我不了解CF的任何知識,但是通常這是通過將名稱/值對發布到服務器來完成的,服務器在服務器上拾取該值並將其粘貼到變量中。 如果願意,也可以使用GET,並且可以使用AJAX來完成這兩項操作。 另一個愚蠢的技巧是在javascript中執行以下操作:
var img = new Image(); img.src =“ http://myserver.com/something.cfm?name=value&anothername=anothervalue ”;
之后,服務器將執行GET並將這兩個值傳遞給服務器。 沒有圖像會顯示給客戶端,因為:a)您沒有將其添加到DOM b)它仍然不是真正的圖像。
請使用CFAJAXPROXY(CF8中的新增功能),並在CFC上調用在Client范圍內設置var的方法。
雷·卡姆登(Ray Camden)也提供了一個很好的答案: http : //www.coldfusionjedi.com/index.cfm/2009/2/12/Ask-a-Jedi-Using-ColdFusion-Ajax-to-set-Session-Variables
使用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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.