簡體   English   中英

使用Javascript分配ColdFusion客戶端變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM