从javascript事件处理程序调用ColdFusion代码(服务器端代码)时出现"意外"行为

use*_*701 0 html javascript coldfusion yui

我有一个带有2个按钮的简单YUI对话框 - 接受和拒绝.我想在点击每个按钮时将ColdFusion代码与JavaScript代码一起调用.当我将CF代码与JS代码一起引入时,不幸的是,每个函数中的CF代码都会被触发.

所有代码如下所示:

<script type="text/javascript"> 

function displayForm() {
   YAHOO.namespace("example.container");    
        if (!YAHOO.example.container.Form) {        
            YAHOO.example.container.Form = new          
                           YAHOO.widget.SimpleDialog("Form", {
                modal: true,
                icon: YAHOO.widget.SimpleDialog.ICON_WARN,
                visible: false,
                fixedcenter: true,
                constraintoviewport: true,
                width: "500px",
                role: "alertdialog",
                draggable: false, 
                buttons: [ { text:"Accept", handler:handleAccept, isDefault:true }, { text:"Decline", handler:handleDecline} ]
            });             
            YAHOO.example.container.Form.setHeader("Info");         
                    YAHOO.example.container.Form.setBody("Body");   
            YAHOO.example.container.Form.render(document.body);
        }           
        YAHOO.example.container.Form.show();            
   }        


   function handleAccept() {
       this.cancel();
       <CFQUERY name="UpdTable" datasource="test>
           UPDATE t 
           set a = '1'
           where b = '1'
       </CFQUERY>
   }

   function handleDecline() {
       this.cancel();        
       <CFQUERY name="UpdTable" datasource="test>
           UPDATE t 
           set a = '2'
           where b = '1'
       </CFQUERY>
   }

   displayForm();

</script>
Run Code Online (Sandbox Code Playgroud)

问题是当handleAccept()被自动触发时,handleDecline()CF代码被触发,所以我在数据库中以a ='2'结束,而不是a ='1'.

有解决方法或简单的解决方案吗?理想情况下,我不想使用JS重定向.

Mea*_*ead 5

当浏览器请求页面时执行ColdFusion代码.也就是说,当代码被发送到浏览器时,执行两个coldfusion cfquery(因此每当有人用上面的代码查看页面时,就会执行这两个查询).这就是ColdFusion的工作原理:

  1. 浏览器从Web服务器请求页面
  2. Web服务器处理所有ColdFusion代码
  3. Web服务器将结果文本发送到浏览器
  4. 浏览器将文本解释为网页

您的问题发生在4. ColdFusion代码不再存在!(查看要查看的页面的源代码)ColdFusion代码已在第2阶段处理回来,并且未发送到浏览器.

那么你如何解决问题呢?好吧,由于ColdFusion处理发生在页面请求之后,您需要请求页面.因为你在服务器上不断变化的数据,你会想要做一个帖子,看到http://developer.yahoo.com/yui/examples/connection/post.html做后与YUI连接的例子经理.

为简单起见,有两个页面,一个是请求接受,另一个是拒绝.在页面中,只需执行相关的CFQUERY即可.现在,在handleAccept和handleRequest函数中,请像上面的YUI连接管理器示例中那样请求这些页面.例如.

var callback = 
{ 
    success: function(o){}, 
    failure: function(o){}, 
    argument: [] 
};  
var request = YAHOO.util.Connect.asyncRequest('POST', "accept.cfm", callback, "");
Run Code Online (Sandbox Code Playgroud)