使用Javascript分配ColdFusion客户端变量

时间:2009-02-11 14:35:51

标签: javascript ajax coldfusion

是否可以使用JavaScript将变量分配给客户端范围?更具体地说,我试图在从AJAX调用返回后分配一个值。

我知道ColdFusion是在服务器端运行的,而客户端运行的是JavaScript,但随着AJAX的激增,我很好奇这样的事情是否可行。谢谢。

5 个答案:

答案 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)

答案 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>