2009-10-01 47 views
0

我有一個簡單的帶2個按鈕的YUI對話框 - Accept和Decline。我想在單擊每個按鈕時將ColdFusion代碼與JavaScript代碼一起調用。當我將CF代碼與JS代碼一起引入時,不幸的是每個函數中存在的CF代碼都被觸發。從javascript事件處理程序調用ColdFusion代碼(服務器端代碼)時出現'Unexpected'行爲

所有代碼如下所示:

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

的問題是,當handleAccept()被自動觸發handleDecline()CF代碼得到觸發,所以我在一個=「2」結束了數據庫而不是a ='1'。

是否有解決方法或簡單的解決方案?理想情況下,我不想使用JS重定向。

回答

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。現在,在您的句柄接受函數& handleRequest函數中,請求上述YUI連接管理器示例中的那些頁面。例如。

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

您的兩個查詢正在服務器上進行評估,然後頁面在用戶的瀏覽器上呈現。

而不是像你有內聯的查詢,將查詢放在一個單獨的模板中,並使用您的YUI代碼來運行適當的模板。

ColdFusion是一種服務器端語言,並且在用戶看到任何東西之前將始終運行。

相關問題